diff --git a/ChangeLog b/ChangeLog index c9072467b..f716f013f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,11 +1,33 @@ +2004-06-20 Alex Roitman + * configure.in: Bump up the version number. + * src/gramps.py: Pass complete argument string. + * src/gramps_main.py: Pass popt table to gnome_init(). + Always enable argument handling. (read_xml,read_pkg): Add functions. + * src/const.py.in: Define popt table, add all gnome options. + * src/ArgHandler.py: Add long options for gramps-specific options. + Add handling for the first filename argument. Use 'gramps-xml' + to denote old gramps (XML) format. + * src/DbPrompter.py: Add hint for the filename. + * src/plugins/ReadNative.py: Cosmetic changes. + * src/plugins/ReadPkg.py: Cosmetic changes. + * src/plugins/WritePkg.py: Typo. + * src/data/gramps.xml: Add mime type for gramps package. + * src/data/gramps.applications: Add gramps package to the list. + * src/data/Makefile.am: Typo. + 2004-06-19 Don Allingham * src/DisplayModels,py: faster sorting of places * src/PlaceView,py: faster sorting of places * src/RelLib,py: faster sorting of places - * src/gramp_main.py: removed new database info message + * src/gramps_main.py: removed new database info message -2004-06-18 Jason Salaz - * src/plugins/ReadGedcom.py Fixed typos preventing import. (i.e. set_type instead of SetType, etc.) +2004-06-18 Jason Salaz + * src/plugins/ReadGedcom.py: Fixed typos preventing import. + (i.e. set_type instead of SetType, etc.) + +2004-06-16 Don Allingham + * Release: Version 1.1.0 "And now for something completely different" + released. 2004-06-14 Don Allingham * src/RelLib.py: fix index for place map diff --git a/configure.in b/configure.in index 432784e2c..222b50ae6 100644 --- a/configure.in +++ b/configure.in @@ -2,11 +2,11 @@ dnl Process this file with autoconf to produce a configure script. dnl May need to run automake && aclocal first AC_PREREQ(2.57) -AC_INIT(gramps, 1.1.0, gramps-bugs@lists.sourceforge.net) +AC_INIT(gramps, 1.1.1, gramps-bugs@lists.sourceforge.net) AC_CONFIG_SRCDIR(src/gramps.py) AM_INIT_AUTOMAKE(1.6.3) -dnl RELEASE=0.CVS$(head -c 10 ${srcdir}/ChangeLog | tr -d '-') -RELEASE=1 +RELEASE=0.CVS$(head -c 10 ${srcdir}/ChangeLog | tr -d '-') +dnl RELEASE=1 VERSIONSTRING=$VERSION if test x"$RELEASE" != "x" diff --git a/src/ArgHandler.py b/src/ArgHandler.py index e82d02e82..3b5f975bf 100644 --- a/src/ArgHandler.py +++ b/src/ArgHandler.py @@ -1,7 +1,7 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2000-2003 Donald N. Allingham +# Copyright (C) 2000-2004 Donald N. Allingham # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -43,6 +43,10 @@ import getopt #------------------------------------------------------------------------- import const import ReadXML +import GrampsMime +import DbPrompter +import QuestionDialog +import GrampsCfg #------------------------------------------------------------------------- # @@ -50,54 +54,96 @@ import ReadXML # #------------------------------------------------------------------------- class ArgHandler: + """ + This class is responsible for handling command line arguments (if any) + given to gramps. The valid arguments are: + + FILE : filename to open. + All following arguments will be ignored. + -i, --import=FILE : filename to import. + -o, --output=FILE : filename to export. + -f, --format=FORMAT : format of the file preceding this option. + + If the filename (no flags) is specified, the interactive session is + launched using data from filename. If the filename is not a natvive (grdb) format, dialog will + be presented to set up a grdb database. + + If no filename or -i option is given, a new interactive session (empty + database) is launched, since no data is goven anyway. + + If -i option is given, but no -o or -a options are given, and interactive + session is launched with the FILE (specified with -i). + + If both -i and -o or -a are given, interactive session will not be + launched. + """ def __init__(self,parent,args): self.parent = parent - self.handle_args(args) + self.args = args + + self.open = None + self.exports = [] + self.actions = [] + self.imports = [] + + self.parse_args() + self.handle_args() + + def parse_args(self): + """ + Fill in lists with open, exports, imports, and actions options. + """ - def handle_args(self,args): try: - options,leftargs = getopt.getopt(args, + options,leftargs = getopt.getopt(self.args[1:], const.shortopts,const.longopts) - except getopt.GetoptError,msg: - print "Error: %s. Exiting." % msg - os._exit(1) - except: - print "Error parsing arguments: %s " % args + except getopt.GetoptError: + # return without filling anything if we could not parse the args + print "Error parsing arguments: %s " % self.args[1:] + return + if leftargs: - print "Unrecognized option: %s" % leftargs[0] - os._exit(1) - exports = [] - actions = [] - imports = [] + # if there were an argument without option, use it as a file to + # open and return + self.open = leftargs[0] + print "Trying to open: %s ..." % leftargs[0] + return + for opt_ix in range(len(options)): - o = options[opt_ix][0][1] - if o == '-': - continue - elif o == 'i': - fname = options[opt_ix][1] - if opt_ix 1: + print "No data was given -- will launch interactive session." print "To use in the command-line mode,", \ "supply at least one input file to process." + print "Launching interactive session..." if self.parent.cl: - for expt in exports: - print "Exporting: file %s, format %s." % (expt[0],expt[1]) + for expt in self.exports: + print "Exporting: file %s, format %s." % expt #(expt[0],expt[1]) self.cl_export(expt[0],expt[1]) - for action in actions: + for action in self.actions: print "Performing action: %s." % action self.cl_action(action) print "Cleaning up." - # clean import dir up after use - files = os.listdir(self.impdir_path) ; - for fn in files: - if os.path.isfile(os.path.join(self.impdir_path,fn)): - os.remove(os.path.join(self.impdir_path,fn)) + # remove import db after use + os.remove(self.imp_db_path) print "Exiting." os._exit(0) + elif GrampsCfg.lastfile and GrampsCfg.autoload: + if self.parent.auto_save_load(GrampsCfg.lastfile) == 0: + DbPrompter.DbPrompter(self.parent,0,self.parent.topWindow) + else: + DbPrompter.DbPrompter(self.parent,0,self.parent.topWindow) def cl_import(self,filename,format): + """ + Command-line import routine. Try to import filename using the format. + Any errors will cause the os._exit(1) call. + """ if format == 'gedcom': import ReadGedcom filename = os.path.normpath(os.path.abspath(filename)) @@ -184,7 +279,7 @@ class ArgHandler: except: print "Error importing %s" % filename os._exit(1) - elif format == 'gramps': + elif format == 'gramps-xml': try: dbname = os.path.join(filename,const.xmlFile) ReadXML.importData(self.parent.db,dbname,None,self.parent.cl) @@ -233,9 +328,14 @@ class ArgHandler: print "Invalid format: %s" % format os._exit(1) if not self.parent.cl: - return self.parent.post_load(self.impdir_path) + return self.parent.post_load(self.imp_db_path) def cl_export(self,filename,format): + """ + Command-line export routine. + Try to write into filename using the format. + Any errors will cause the os._exit(1) call. + """ if format == 'gedcom': import WriteGedcom try: @@ -244,7 +344,7 @@ class ArgHandler: except: print "Error exporting %s" % filename os._exit(1) - elif format == 'gramps': + elif format == 'gramps-xml': filename = os.path.normpath(os.path.abspath(filename)) dbname = os.path.join(filename,const.xmlFile) if filename: @@ -315,6 +415,10 @@ class ArgHandler: os._exit(1) def cl_action(self,action): + """ + Command-line action routine. Try to perform specified action. + Any errors will cause the os._exit(1) call. + """ if action == 'check': import Check checker = Check.CheckIntegrity(self.parent.db) diff --git a/src/DbPrompter.py b/src/DbPrompter.py index b1b2cc17d..4fa12b219 100644 --- a/src/DbPrompter.py +++ b/src/DbPrompter.py @@ -20,6 +20,14 @@ # $Id$ +#------------------------------------------------------------------------- +# +# Python modules +# +#------------------------------------------------------------------------- +import os +from gettext import gettext as _ + #------------------------------------------------------------------------- # # GNOME modules @@ -28,6 +36,7 @@ import gtk import gtk.glade import gobject +import gnome #------------------------------------------------------------------------- # @@ -37,10 +46,7 @@ import gobject import Utils import const import GrampsCfg -import gnome import QuestionDialog -from gettext import gettext as _ -import os #------------------------------------------------------------------------- # @@ -50,12 +56,13 @@ import os class DbPrompter: """Make sure a database is opened""" - def __init__(self,db,want_new,parent=None): - self.db = db + def __init__(self,parent,want_new,parent_window=None,file_hint=None): + self.parent = parent + self.file_hint = file_hint opendb = gtk.glade.XML(const.gladeFile, "opendb","gramps") top = opendb.get_widget('opendb') - if parent: - top.set_transient_for(parent) + if parent_window: + top.set_transient_for(parent_window) title = opendb.get_widget('title') Utils.set_titles(top,title,_('Open a database')) @@ -89,7 +96,7 @@ class DbPrompter: gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) - self.db.clear_database() + self.parent.clear_database() else: choose = gtk.FileChooserDialog('Open GRAMPS database', None, @@ -109,8 +116,11 @@ class DbPrompter: filter.add_pattern('*') choose.add_filter(filter) - if save and GrampsCfg.lastfile: - choose.set_filename(GrampsCfg.lastfile) + if save: + if self.file_hint: + choose.set_filename(self.file_hint) + elif GrampsCfg.lastfile: + choose.set_filename(GrampsCfg.lastfile) response = choose.run() if response == gtk.RESPONSE_OK: @@ -118,9 +128,8 @@ class DbPrompter: if save and os.path.splitext(filename)[1] != ".grdb": filename = filename + ".grdb" choose.destroy() - self.db.read_file(filename) + self.parent.read_file(filename) return 1 else: choose.destroy() return 0 - diff --git a/src/const.py.in b/src/const.py.in index e6a6215c9..d304503e8 100644 --- a/src/const.py.in +++ b/src/const.py.in @@ -149,18 +149,48 @@ unknown = _("unknown") # #------------------------------------------------------------------------- -longopts = [ - "load-modules=", - "help", - "usage", - "oaf-ior-fd=", - "oaf-activate-iid=", - "oaf-private", - "disable-sound", - "enable-sound", - "espeaker=", - "version", - ] +# (longName, shortName, type , default, flags, descrip , argDescrip) +popt_table = [ + ("import", 'i', str, None, 0, "Import file", "FILENAME"), + ("output", 'o', str, None, 0, "Write file", "FILENAME"), + ("format", 'f', str, None, 0, 'Specify format', "FORMAT"), + ("action", 'a', str, None, 0, 'Specify action', "ACTION"), +] + +longopts = [ + "load-modules=", + "help", + "usage", + "oaf-ior-fd=", + "oaf-activate-iid=", + "oaf-private", + "disable-sound", + "enable-sound", + "espeaker=", + "version", + "gdk-debug=", + "gdk-no-debug=", + "display=", + "screen=", + "sync", + "name=", + "class=", + "gtk-debug=", + "gtk-no-debug=", + "g-fatal-warnings", + "gtk-module=", + "sm-client-id=", + "sm-config-prefix=", + "sm-disable", + "disable-crash-dialog", + "disable-sound", + "enable-sound", + "espeaker=", + "import=", + "output=", + "format=", + "action=", +] shortopts = "i:o:f:a:?" diff --git a/src/data/Makefile.am b/src/data/Makefile.am index 7e942596b..c9bd38889 100644 --- a/src/data/Makefile.am +++ b/src/data/Makefile.am @@ -12,7 +12,7 @@ dist_pkgdata_DATA = gedcom.xml \ gramps.keys \ gramps.mime -EXTRA_DIST = $(pkgdata_DATA) +EXTRA_DIST = $(dist_pkgdata_DATA) install-data-local: $(INSTALL) -d $(DESTDIR)$(prefix)/share/gnome/apps/Applications diff --git a/src/data/gramps.applications b/src/data/gramps.applications index d6b54807c..8f5ba8c0c 100644 --- a/src/data/gramps.applications +++ b/src/data/gramps.applications @@ -4,4 +4,4 @@ gramps can_open_multiple_files=false expects_uris=false requires_terminal=false - mime_types=application/x-gramps,application/x-gedcom + mime_types=application/x-gramps,application/x-gedcom,application/x-gramps-package diff --git a/src/data/gramps.xml b/src/data/gramps.xml index e785b501a..8525f11ff 100644 --- a/src/data/gramps.xml +++ b/src/data/gramps.xml @@ -8,4 +8,8 @@ GEDCOM + + GRAMPS package + + diff --git a/src/gramps.py b/src/gramps.py index f7836ab1f..2bf1ef79f 100755 --- a/src/gramps.py +++ b/src/gramps.py @@ -82,7 +82,7 @@ import gobject signal.signal(signal.SIGCHLD, signal.SIG_DFL) -args = sys.argv[1:] +args = sys.argv def run(): try: diff --git a/src/gramps_main.py b/src/gramps_main.py index 65b111ec8..075caed0b 100755 --- a/src/gramps_main.py +++ b/src/gramps_main.py @@ -70,6 +70,7 @@ import EditPerson import Find import DbPrompter import TipOfDay +import ArgHandler from QuestionDialog import * @@ -104,7 +105,9 @@ class Gramps: def __init__(self,args): - self.program = gnome.program_init('gramps',const.version) + self.program = gnome.program_init('gramps',const.version, + gnome.libgnome_module_info_get(), + args, const.popt_table) self.program.set_property('app-libdir','%s/lib' % const.prefixdir) self.program.set_property('app-datadir','%s/share/gramps' % const.prefixdir) self.program.set_property('app-sysconfdir','%s/etc' % const.prefixdir) @@ -144,25 +147,11 @@ class Gramps: self.gtop = gtk.glade.XML(const.gladeFile, "gramps", "gramps") self.init_interface() + ArgHandler.ArgHandler(self,args) + if GrampsCfg.usetips: TipOfDay.TipOfDay() - if args and len(args)==1: - if GrampsMime.get_type(args[0]) == "application/x-gramps": - if self.auto_save_load(args[0]) == 0: - DbPrompter.DbPrompter(self,0,self.topWindow) - else: - import ArgHandler - ArgHandler.ArgHandler(self,args) - elif args: - import ArgHandler - ArgHandler.ArgHandler(self,args) - elif GrampsCfg.lastfile and GrampsCfg.autoload: - if self.auto_save_load(GrampsCfg.lastfile) == 0: - DbPrompter.DbPrompter(self,0,self.topWindow) - else: - DbPrompter.DbPrompter(self,0,self.topWindow) - self.db.set_researcher(GrampsCfg.get_researcher()) def pref_callback(self,val): @@ -1033,12 +1022,64 @@ class Gramps: import ReadGedcom filename = os.path.normpath(os.path.abspath(filename)) - self.topWindow.set_title("%s - GRAMPS" % filename) try: - ReadGedcom.importData(self.db,filename) + ReadGedcom.importData(self.db,filename,None) + self.import_tool_callback() except: DisplayTrace.DisplayTrace() - self.full_update() + + def read_xml(self,filename): + import ReadXML + + filename = os.path.normpath(os.path.abspath(os.path.join(filename,const.xmlFile))) + + try: + ReadXML.importData(self.db,filename,None) + self.import_tool_callback() + except: + DisplayTrace.DisplayTrace() + + def read_pkg(self,filename): + # Create tempdir, if it does not exist, then check for writability + tmpdir_path = os.path.expanduser("~/.gramps/tmp" ) + if not os.path.isdir(tmpdir_path): + try: + os.mkdir(tmpdir_path,0700) + except: + DisplayTrace.DisplayTrace() + return + elif not os.access(tmpdir_path,os.W_OK): + ErrorDialog( _("Cannot unpak archive"), + _("Temporary directory %s is not writable") % tmpdir_path ) + return + else: # tempdir exists and writable -- clean it up if not empty + files = os.listdir(tmpdir_path) ; + for fn in files: + os.remove( os.path.join(tmpdir_path,fn) ) + + try: + import TarFile + t = TarFile.ReadTarFile(filename,tmpdir_path) + t.extract() + t.close() + except: + DisplayTrace.DisplayTrace() + return + + dbname = os.path.join(tmpdir_path,const.xmlFile) + + try: + import ReadXML + ReadXML.importData(self.db,dbname,None) + except: + DisplayTrace.DisplayTrace() + + # Clean up tempdir after ourselves + files = os.listdir(tmpdir_path) + for fn in files: + os.remove(os.path.join(tmpdir_path,fn)) + os.rmdir(tmpdir_path) + self.import_tool_callback() def read_file(self,filename): self.topWindow.set_resizable(gtk.FALSE) diff --git a/src/plugins/ReadNative.py b/src/plugins/ReadNative.py index 21872d29a..2e0ec691f 100644 --- a/src/plugins/ReadNative.py +++ b/src/plugins/ReadNative.py @@ -1,7 +1,7 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2000-2003 Donald N. Allingham +# Copyright (C) 2000-2004 Donald N. Allingham # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -18,6 +18,8 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # +# $Id$ + # # Modified by Alex Roitman to handle media object files. # @@ -81,7 +83,7 @@ class ReadNative: Utils.destroy_passed_object(self.top) self.show_display() - dbname = os.path.join(imp_dbpath,const.xmlFile) + dbname = os.path.join(imp_dbpath,const.xmlFile) try: importData(self.db,dbname,self.progress) @@ -89,7 +91,7 @@ class ReadNative: import DisplayTrace DisplayTrace.DisplayTrace() - self.window.destroy() + self.window.destroy() self.callback() def progress(self,val): diff --git a/src/plugins/ReadPkg.py b/src/plugins/ReadPkg.py index 8a72b08ca..44e7dd682 100644 --- a/src/plugins/ReadPkg.py +++ b/src/plugins/ReadPkg.py @@ -1,7 +1,7 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2000 Donald N. Allingham +# Copyright (C) 2000-2004 Donald N. Allingham # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -18,6 +18,8 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # +# $Id$ + # # Written by Alex Roitman, largely based on ReadNative.py by Don Allingham # @@ -95,19 +97,19 @@ class ReadPkg: ErrorDialog( _("Temporary directory %s is not writable") % tmpdir_path ) return else: # tempdir exists and writable -- clean it up if not empty - files = os.listdir(tmpdir_path) ; + files = os.listdir(tmpdir_path) ; for filename in files: os.remove( os.path.join(tmpdir_path,filename) ) try: t = TarFile.ReadTarFile(name,tmpdir_path) - t.extract() - t.close() + t.extract() + t.close() except: ErrorDialog(_("Error extracting into %s") % tmpdir_path ) return - dbname = os.path.join(tmpdir_path,const.xmlFile) + dbname = os.path.join(tmpdir_path,const.xmlFile) try: importData(self.db,dbname,self.progress) diff --git a/src/plugins/WritePkg.py b/src/plugins/WritePkg.py index 74b3f59f9..10e8a647b 100644 --- a/src/plugins/WritePkg.py +++ b/src/plugins/WritePkg.py @@ -93,7 +93,7 @@ class PackageWriter: if response == gtk.RESPONSE_OK: name = choose.get_filename() - if os.path.splitext(filename)[1] != ".gpkg": + if os.path.splitext(name)[1] != ".gpkg": name = name + ".gpkg" choose.destroy() self.export(name)