* 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. * src/gramps_main.py: removed new database info message * src/plugins/ReadGedcom.py: Fixed typos preventing import. (i.e. set_type instead of SetType, etc.) * Release: Version 1.1.0 "And now for something completely different" released. svn: r3218
This commit is contained in:
@ -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<len(options)-1 and options[opt_ix+1][0][1]=='f':
|
||||
o,v = options[opt_ix]
|
||||
if o in ( '-i', '--import'):
|
||||
fname = v
|
||||
ftype = GrampsMime.get_type(os.path.abspath(os.path.expanduser(fname)))
|
||||
if opt_ix<len(options)-1 \
|
||||
and options[opt_ix+1][0] in ( '-f', '--format'):
|
||||
format = options[opt_ix+1][1]
|
||||
if format not in [ 'gedcom', 'gramps', 'gramps-pkg' ]:
|
||||
if format not in ('gedcom','gramps-xml','gramps-pkg','grdb'):
|
||||
print "Invalid format: %s" % format
|
||||
os._exit(1)
|
||||
elif fname[-3:].upper()== "GED":
|
||||
print "Ignoring input file: %s" % fname
|
||||
continue
|
||||
elif ftype == "application/x-gedcom":
|
||||
format = 'gedcom'
|
||||
elif fname[-3:].upper() == "TGZ":
|
||||
elif ftype == "application/x-gramps-package":
|
||||
format = 'gramps-pkg'
|
||||
elif os.path.isdir(fname):
|
||||
format = 'gramps'
|
||||
elif ftype == "x-directory/normal":
|
||||
format = 'gramps-xml'
|
||||
elif ftype == "application/x-gramps":
|
||||
format = 'grdb'
|
||||
else:
|
||||
print "Unrecognized format for input file %s" % fname
|
||||
os._exit(1)
|
||||
imports.append((fname,format))
|
||||
elif o == 'o':
|
||||
outfname = options[opt_ix][1]
|
||||
if opt_ix<len(options)-1 and options[opt_ix+1][0][1]=='f':
|
||||
print "Ignoring input file: %s" % fname
|
||||
continue
|
||||
self.imports.append((fname,format))
|
||||
elif o in ( '-o', '--output' ):
|
||||
outfname = v
|
||||
if opt_ix<len(options)-1 \
|
||||
and options[opt_ix+1][0] in ( '-f', '--format'):
|
||||
outformat = options[opt_ix+1][1]
|
||||
if outformat not in [ 'gedcom', 'gramps', 'gramps-pkg', 'iso', 'wft' ]:
|
||||
if outformat not in ('gedcom','gramps-xml','gramps-pkg','grdb','iso','wft'):
|
||||
print "Invalid format: %s" % outformat
|
||||
os._exit(1)
|
||||
print "Ignoring output file: %s" % outfname
|
||||
continue
|
||||
elif outfname[-3:].upper() == "GED":
|
||||
outformat = 'gedcom'
|
||||
elif outfname[-3:].upper() == "TGZ":
|
||||
@ -110,69 +156,118 @@ class ArgHandler:
|
||||
os.makedirs(outfname,0700)
|
||||
except:
|
||||
print "Cannot create directory %s" % outfname
|
||||
os._exit(1)
|
||||
outformat = 'gramps'
|
||||
print "Ignoring output file: %s" % outfname
|
||||
continue
|
||||
outformat = 'gramps-xml'
|
||||
elif fname[-3:].upper() == "GRDB":
|
||||
format = 'grdb'
|
||||
else:
|
||||
print "Unrecognized format for output file %s" % outfname
|
||||
os._exit(1)
|
||||
exports.append((outfname,outformat))
|
||||
elif o == 'a':
|
||||
action = options[opt_ix][1]
|
||||
if action not in [ 'check', 'summary' ]:
|
||||
print "Unknown action: %s." % action
|
||||
os._exit(1)
|
||||
actions.append(action)
|
||||
print "Ignoring output file: %s" % outfname
|
||||
continue
|
||||
self.exports.append((outfname,outformat))
|
||||
elif o in ( '-a', '--action' ):
|
||||
action = v
|
||||
if action not in ( 'check', 'summary' ):
|
||||
print "Unknown action: %s. Ignoring." % action
|
||||
continue
|
||||
self.actions.append(action)
|
||||
|
||||
if imports:
|
||||
self.parent.cl = bool(exports or actions)
|
||||
# Create dir for imported database(s)
|
||||
self.impdir_path = os.path.expanduser("~/.gramps/import" )
|
||||
if not os.path.isdir(self.impdir_path):
|
||||
try:
|
||||
os.mkdir(self.impdir_path,0700)
|
||||
except:
|
||||
print "Could not create import directory %s. Exiting." \
|
||||
% self.impdir_path
|
||||
os._exit(1)
|
||||
elif not os.access(self.impdir_path,os.W_OK):
|
||||
print "Import directory %s is not writable. Exiting." \
|
||||
% self.impdir_path
|
||||
def handle_args(self):
|
||||
"""
|
||||
Depending on the given arguments, import or open data, launch
|
||||
session, write files, and/or perform actions.
|
||||
"""
|
||||
|
||||
if self.open:
|
||||
# Filename was given. Open a session with that file. Forget
|
||||
# the rest of given arguments.
|
||||
filename = os.path.abspath(os.path.expanduser(self.open))
|
||||
filetype = GrampsMime.get_type(filename)
|
||||
if filetype == "application/x-gramps":
|
||||
print "Type: GRAMPS database"
|
||||
if self.parent.auto_save_load(filename):
|
||||
print "Opened successfully!"
|
||||
else:
|
||||
print "Cannot open %s. Exiting..."
|
||||
elif filetype == "application/x-gedcom":
|
||||
print "Type: GEDCOM"
|
||||
QuestionDialog.OkDialog( _("Opening non-native format"),
|
||||
_("New gramps database has to be set up when opening non-native formats. The following dialog will let you select the new database."),
|
||||
self.parent.topWindow)
|
||||
DbPrompter.DbPrompter(self.parent,1,self.parent.topWindow,filename)
|
||||
self.parent.read_gedcom(filename)
|
||||
elif filetype == "x-directory/normal":
|
||||
print "Type: GRAMPS XML"
|
||||
QuestionDialog.OkDialog( _("Opening non-native format"),
|
||||
_("New gramps database has to be set up when opening non-native formats. The following dialog will let you select the new database."),
|
||||
self.parent.topWindow)
|
||||
DbPrompter.DbPrompter(self.parent,1,self.parent.topWindow,filename)
|
||||
self.parent.read_xml(filename)
|
||||
elif filetype == "application/x-gramps-package":
|
||||
print "Type: GRAMPS package"
|
||||
QuestionDialog.OkDialog( _("Opening non-native format"),
|
||||
_("New gramps database has to be set up when opening non-native formats. The following dialog will let you select the new database."),
|
||||
self.parent.topWindow)
|
||||
DbPrompter.DbPrompter(self.parent,1,self.parent.topWindow,filename)
|
||||
self.parent.read_pkg(filename)
|
||||
else:
|
||||
print "Unknown file type: %s" % filetype
|
||||
QuestionDialog.ErrorDialog(
|
||||
_("Cannot open file: unknown type"),
|
||||
_('File type "%s" is unknown to GRAMPS.\n\nValid types are: GRAMPS database, GRAMPS XML, GRAMPS package, and GEDCOM.') % filetype,
|
||||
self.parent.topWindow)
|
||||
print "Exiting..."
|
||||
os._exit(1)
|
||||
# and clean it up before 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))
|
||||
self.parent.clear_database()
|
||||
self.parent.db.set_save_path(self.impdir_path)
|
||||
for imp in imports:
|
||||
print "Importing: file %s, format %s." % (imp[0],imp[1])
|
||||
|
||||
return
|
||||
|
||||
if self.imports:
|
||||
self.parent.cl = bool(self.exports or self.actions)
|
||||
# Create file for imported database(s)
|
||||
self.imp_db_path = os.path.expanduser("~/.gramps/import_db" )
|
||||
# remove if it exists
|
||||
if os.path.isdir(self.imp_db_path):
|
||||
os.removedirs(self.imp_db_path)
|
||||
elif os.path.isfile(self.imp_db_path):
|
||||
os.remove(self.imp_db_path)
|
||||
self.parent.load_database(self.imp_db_path)
|
||||
|
||||
for imp in self.imports:
|
||||
print "Importing: file %s, format %s." % imp #(imp[0],imp[1])
|
||||
self.cl_import(imp[0],imp[1])
|
||||
else:
|
||||
print "No data was given. Launching interactive session."
|
||||
elif len(self.args) > 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)
|
||||
|
Reference in New Issue
Block a user