Use the normal sys.exit() instead of os._exit() because the latter will

not flush any output. Also catch the SysExit exceptions in gramps.py and
do a gtk.main_quit() just to be sure. This all is to make commandline
processing usable.


svn: r8308
This commit is contained in:
Kees Bakker
2007-03-20 19:21:41 +00:00
parent 781d67a409
commit e92a5979a8
3 changed files with 45 additions and 39 deletions

View File

@@ -114,7 +114,7 @@ class ArgHandler:
""" """
Fill in lists with open, exports, imports, and actions options. Fill in lists with open, exports, imports, and actions options.
Any parsing errors lead to abort via os._exit(1). Any parsing errors lead to abort via sys.exit(1).
""" """
try: try:
@@ -123,7 +123,7 @@ class ArgHandler:
except getopt.GetoptError: except getopt.GetoptError:
# return without filling anything if we could not parse the args # return without filling anything if we could not parse the args
print "Error parsing arguments: %s " % self.args[1:] print "Error parsing arguments: %s " % self.args[1:]
os._exit(1) sys.exit(1)
if leftargs: if leftargs:
# if there were an argument without option, # if there were an argument without option,
@@ -328,7 +328,7 @@ class ArgHandler:
_('GRAMPS cannot open non-native data ' _('GRAMPS cannot open non-native data '
'without setting up new GRAMPS database.')) 'without setting up new GRAMPS database.'))
print "Cannot continue without native database. Exiting..." print "Cannot continue without native database. Exiting..."
os._exit(1) sys.exit(1)
elif filetype == const.app_gramps_package: elif filetype == const.app_gramps_package:
print "Type: GRAMPS package" print "Type: GRAMPS package"
self.vm.import_pkg(filename) self.vm.import_pkg(filename)
@@ -341,13 +341,13 @@ class ArgHandler:
'Valid types are: GRAMPS database, GRAMPS XML, ' 'Valid types are: GRAMPS database, GRAMPS XML, '
'GRAMPS package, and GEDCOM.') % filetype) 'GRAMPS package, and GEDCOM.') % filetype)
print "Exiting..." print "Exiting..."
os._exit(1) sys.exit(1)
if success: if success:
# Add the file to the recent items # Add the file to the recent items
#RecentFiles.recent_files(filename,filetype) #RecentFiles.recent_files(filename,filetype)
pass pass
else: else:
os._exit(1) sys.exit(1)
return return
if self.open: if self.open:
@@ -373,7 +373,7 @@ class ArgHandler:
else: else:
print "Unknown file type: %s" % format print "Unknown file type: %s" % format
print "Exiting..." print "Exiting..."
os._exit(1) sys.exit(1)
try: try:
self.vm.read_recent_file(filename,filetype) self.vm.read_recent_file(filename,filetype)
@@ -382,7 +382,7 @@ class ArgHandler:
except: except:
print "Error opening the file." print "Error opening the file."
print "Exiting..." print "Exiting..."
os._exit(1) sys.exit(1)
if self.imports: if self.imports:
self.cl = bool(self.exports or self.actions or self.cl) self.cl = bool(self.exports or self.actions or self.cl)
@@ -396,11 +396,11 @@ class ArgHandler:
except: except:
print "Could not create import directory %s. Exiting." \ print "Could not create import directory %s. Exiting." \
% self.impdir_path % self.impdir_path
os._exit(1) sys.exit(1)
elif not os.access(self.impdir_path,os.W_OK): elif not os.access(self.impdir_path,os.W_OK):
print "Import directory %s is not writable. Exiting." \ print "Import directory %s is not writable. Exiting." \
% self.impdir_path % self.impdir_path
os._exit(1) sys.exit(1)
# and clean it up before use # and clean it up before use
files = os.listdir(self.impdir_path) ; files = os.listdir(self.impdir_path) ;
for fn in files: for fn in files:
@@ -436,7 +436,7 @@ class ArgHandler:
if self.imports: if self.imports:
os.remove(self.imp_db_path) os.remove(self.imp_db_path)
print "Exiting." print "Exiting."
os._exit(0) sys.exit(0)
elif Config.get(Config.RECENT_FILE) and Config.get(Config.AUTOLOAD): elif Config.get(Config.RECENT_FILE) and Config.get(Config.AUTOLOAD):
rf = Config.get(Config.RECENT_FILE) rf = Config.get(Config.RECENT_FILE)
@@ -452,7 +452,7 @@ class ArgHandler:
def cl_import(self,filename,format): def cl_import(self,filename,format):
""" """
Command-line import routine. Try to import filename using the format. Command-line import routine. Try to import filename using the format.
Any errors will cause the os._exit(1) call. Any errors will cause the sys.exit(1) call.
""" """
if format == 'grdb': if format == 'grdb':
filename = os.path.normpath(os.path.abspath(filename)) filename = os.path.normpath(os.path.abspath(filename))
@@ -461,7 +461,7 @@ class ArgHandler:
self.state.db,filename,empty) self.state.db,filename,empty)
except: except:
print "Error importing %s" % filename print "Error importing %s" % filename
os._exit(1) sys.exit(1)
elif format == 'gedcom': elif format == 'gedcom':
filename = os.path.normpath(os.path.abspath(filename)) filename = os.path.normpath(os.path.abspath(filename))
try: try:
@@ -470,14 +470,14 @@ class ArgHandler:
import2(self.state.db,filename,None,None,False) import2(self.state.db,filename,None,None,False)
except: except:
print "Error importing %s" % filename print "Error importing %s" % filename
os._exit(1) sys.exit(1)
elif format == 'gramps-xml': elif format == 'gramps-xml':
try: try:
GrampsDbUtils.gramps_db_reader_factory(const.app_gramps_xml)( GrampsDbUtils.gramps_db_reader_factory(const.app_gramps_xml)(
self.state.db,filename,None,self.cl) self.state.db,filename,None,self.cl)
except: except:
print "Error importing %s" % filename print "Error importing %s" % filename
os._exit(1) sys.exit(1)
elif format == 'geneweb': elif format == 'geneweb':
import ImportGeneWeb import ImportGeneWeb
filename = os.path.normpath(os.path.abspath(filename)) filename = os.path.normpath(os.path.abspath(filename))
@@ -485,7 +485,7 @@ class ArgHandler:
ImportGeneWeb.importData(self.state.db,filename,None) ImportGeneWeb.importData(self.state.db,filename,None)
except: except:
print "Error importing %s" % filename print "Error importing %s" % filename
os._exit(1) sys.exit(1)
elif format == 'gramps-pkg': elif format == 'gramps-pkg':
# Create tempdir, if it does not exist, then check for writability # Create tempdir, if it does not exist, then check for writability
tmpdir_path = os.path.join(const.home_dir,"tmp") tmpdir_path = os.path.join(const.home_dir,"tmp")
@@ -495,10 +495,10 @@ class ArgHandler:
except: except:
print "Could not create temporary directory %s" \ print "Could not create temporary directory %s" \
% tmpdir_path % tmpdir_path
os._exit(1) sys.exit(1)
elif not os.access(tmpdir_path,os.W_OK): elif not os.access(tmpdir_path,os.W_OK):
print "Temporary directory %s is not writable" % tmpdir_path print "Temporary directory %s is not writable" % tmpdir_path
os._exit(1) sys.exit(1)
else: # tempdir exists and writable -- clean it up if not empty else: # tempdir exists and writable -- clean it up if not empty
files = os.listdir(tmpdir_path) ; files = os.listdir(tmpdir_path) ;
for fn in files: for fn in files:
@@ -512,13 +512,13 @@ class ArgHandler:
archive.close() archive.close()
except ReadError, msg: except ReadError, msg:
print "Error reading archive:", msg print "Error reading archive:", msg
os._exit(1) sys.exit(1)
except CompressError, msg: except CompressError, msg:
print "Error uncompressing archive:", msg print "Error uncompressing archive:", msg
os._exit(1) sys.exit(1)
except: except:
print "Error extracting into %s" % tmpdir_path print "Error extracting into %s" % tmpdir_path
os._exit(1) sys.exit(1)
dbname = os.path.join(tmpdir_path,const.xmlFile) dbname = os.path.join(tmpdir_path,const.xmlFile)
@@ -527,7 +527,7 @@ class ArgHandler:
self.state.db,dbname,None) self.state.db,dbname,None)
except: except:
print "Error importing %s" % filename print "Error importing %s" % filename
os._exit(1) sys.exit(1)
# Clean up tempdir after ourselves # Clean up tempdir after ourselves
# THIS HAS BEEN CHANGED, because now we want to keep images # THIS HAS BEEN CHANGED, because now we want to keep images
# stay after the import is over. Just delete the XML file. # stay after the import is over. Just delete the XML file.
@@ -538,7 +538,7 @@ class ArgHandler:
## os.rmdir(tmpdir_path) ## os.rmdir(tmpdir_path)
else: else:
print "Invalid format: %s" % format print "Invalid format: %s" % format
os._exit(1) sys.exit(1)
if not self.cl: if not self.cl:
return self.vm.post_load() return self.vm.post_load()
@@ -551,7 +551,7 @@ class ArgHandler:
""" """
Command-line export routine. Command-line export routine.
Try to write into filename using the format. Try to write into filename using the format.
Any errors will cause the os._exit(1) call. Any errors will cause the sys.exit(1) call.
""" """
filename = os.path.abspath(os.path.expanduser(filename)) filename = os.path.abspath(os.path.expanduser(filename))
if format == 'grdb': if format == 'grdb':
@@ -560,14 +560,14 @@ class ArgHandler:
self.state.db,filename) self.state.db,filename)
except: except:
print "Error exporting %s" % filename print "Error exporting %s" % filename
os._exit(1) sys.exit(1)
elif format == 'gedcom': elif format == 'gedcom':
try: try:
gw = GrampsDbUtils.GedcomWriter(self.state.db,None,1,filename) gw = GrampsDbUtils.GedcomWriter(self.state.db,None,1,filename)
ret = gw.export_data(filename) ret = gw.export_data(filename)
except: except:
print "Error exporting %s" % filename print "Error exporting %s" % filename
os._exit(1) sys.exit(1)
elif format == 'gramps-xml': elif format == 'gramps-xml':
filename = os.path.normpath(os.path.abspath(filename)) filename = os.path.normpath(os.path.abspath(filename))
if filename: if filename:
@@ -576,7 +576,7 @@ class ArgHandler:
ret = g.write(filename) ret = g.write(filename)
except: except:
print "Error exporting %s" % filename print "Error exporting %s" % filename
os._exit(1) sys.exit(1)
elif format == 'gramps-pkg': elif format == 'gramps-pkg':
try: try:
import WritePkg import WritePkg
@@ -584,7 +584,7 @@ class ArgHandler:
ret = writer.export() ret = writer.export()
except: except:
print "Error creating %s" % filename print "Error creating %s" % filename
os._exit(1) sys.exit(1)
elif format == 'iso': elif format == 'iso':
import WriteCD import WriteCD
try: try:
@@ -592,7 +592,7 @@ class ArgHandler:
ret = writer.export() ret = writer.export()
except: except:
print "Error exporting %s" % filename print "Error exporting %s" % filename
os._exit(1) sys.exit(1)
elif format == 'wft': elif format == 'wft':
import WriteFtree import WriteFtree
try: try:
@@ -600,7 +600,7 @@ class ArgHandler:
ret = writer.export_data() ret = writer.export_data()
except: except:
print "Error exporting %s" % filename print "Error exporting %s" % filename
os._exit(1) sys.exit(1)
elif format == 'geneweb': elif format == 'geneweb':
import WriteGeneWeb import WriteGeneWeb
try: try:
@@ -609,10 +609,10 @@ class ArgHandler:
ret = writer.export_data() ret = writer.export_data()
except: except:
print "Error exporting %s" % filename print "Error exporting %s" % filename
os._exit(1) sys.exit(1)
else: else:
print "Invalid format: %s" % format print "Invalid format: %s" % format
os._exit(1) sys.exit(1)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@@ -622,7 +622,7 @@ class ArgHandler:
def cl_action(self,action,options_str): def cl_action(self,action,options_str):
""" """
Command-line action routine. Try to perform specified action. Command-line action routine. Try to perform specified action.
Any errors will cause the os._exit(1) call. Any errors will cause the sys.exit(1) call.
""" """
if action == 'check': if action == 'check':
import Check import Check
@@ -648,7 +648,7 @@ class ArgHandler:
name = options_str_dict.pop('name',None) name = options_str_dict.pop('name',None)
if not name: if not name:
print "Report name not given. Please use name=reportname" print "Report name not given. Please use name=reportname"
os._exit(1) sys.exit(1)
for item in cl_list: for item in cl_list:
if name == item[0]: if name == item[0]:
@@ -678,7 +678,7 @@ class ArgHandler:
name = options_str_dict.pop('name',None) name = options_str_dict.pop('name',None)
if not name: if not name:
print "Tool name not given. Please use name=toolname" print "Tool name not given. Please use name=toolname"
os._exit(1) sys.exit(1)
for item in cli_tool_list: for item in cli_tool_list:
if name == item[0]: if name == item[0]:
@@ -694,7 +694,7 @@ class ArgHandler:
print " %s" % item[0] print " %s" % item[0]
else: else:
print "Unknown action: %s." % action print "Unknown action: %s." % action
os._exit(1) sys.exit(1)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #

View File

@@ -26,6 +26,7 @@
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import os import os
import sys
import sets import sets
import shutil import shutil
from xml.parsers.expat import ExpatError, ParserCreate from xml.parsers.expat import ExpatError, ParserCreate
@@ -128,14 +129,14 @@ def importData(database, filename, callback=None,cl=0,use_trans=False):
if cl: if cl:
print "Error: %s could not be opened Exiting." % filename print "Error: %s could not be opened Exiting." % filename
print msg print msg
os._exit(1) sys.exit(1)
else: else:
ErrorDialog(_("%s could not be opened") % filename,str(msg)) ErrorDialog(_("%s could not be opened") % filename,str(msg))
return return
except: except:
if cl: if cl:
print "Error: %s could not be opened. Exiting." % filename print "Error: %s could not be opened. Exiting." % filename
os._exit(1) sys.exit(1)
else: else:
ErrorDialog(_("%s could not be opened") % filename) ErrorDialog(_("%s could not be opened") % filename)
return return
@@ -147,7 +148,7 @@ def importData(database, filename, callback=None,cl=0,use_trans=False):
print msg print msg
import traceback import traceback
traceback.print_exc() traceback.print_exc()
os._exit(1) sys.exit(1)
else: else:
ErrorDialog(_("Error reading %s") % filename,str(msg)) ErrorDialog(_("Error reading %s") % filename,str(msg))
import traceback import traceback
@@ -157,7 +158,7 @@ def importData(database, filename, callback=None,cl=0,use_trans=False):
if cl: if cl:
print "Error reading %s" % filename print "Error reading %s" % filename
print "The file is probably either corrupt or not a valid GRAMPS database." print "The file is probably either corrupt or not a valid GRAMPS database."
os._exit(1) sys.exit(1)
else: else:
ErrorDialog(_("Error reading %s") % filename, ErrorDialog(_("Error reading %s") % filename,
_("The file is probably either corrupt or not a valid GRAMPS database.")) _("The file is probably either corrupt or not a valid GRAMPS database."))

View File

@@ -170,6 +170,11 @@ def run():
try: try:
gramps_main.Gramps(args) gramps_main.Gramps(args)
except SystemExit, e:
if e.code:
log.error("Gramps terminated with exit code: %d." % e.code, exc_info=True)
gtk.main_quit()
return False
except: except:
log.error("Gramps failed to start.", exc_info=True) log.error("Gramps failed to start.", exc_info=True)