4114: Would like to use stdin and stdout for command line import/export by MD Nauta
svn: r16308
This commit is contained in:
		@@ -97,9 +97,9 @@ class ArgHandler(object):
 | 
			
		||||
        else:
 | 
			
		||||
            # Need to convert to system file encoding  before printing
 | 
			
		||||
            # For non latin characters in path/file/user names
 | 
			
		||||
            print msg1.encode(sys.getfilesystemencoding())
 | 
			
		||||
            print >> sys.stderr, msg1.encode(sys.getfilesystemencoding())
 | 
			
		||||
            if msg2 is not None:
 | 
			
		||||
                print msg2.encode(sys.getfilesystemencoding())
 | 
			
		||||
                print >> sys.stderr, msg2.encode(sys.getfilesystemencoding())
 | 
			
		||||
 | 
			
		||||
    #-------------------------------------------------------------------------
 | 
			
		||||
    # Argument parser: sorts out given arguments
 | 
			
		||||
@@ -145,7 +145,7 @@ class ArgHandler(object):
 | 
			
		||||
        value = Utils.get_unicode_path_from_env_var(value)
 | 
			
		||||
        fname = value
 | 
			
		||||
        fullpath = os.path.abspath(os.path.expanduser(fname))
 | 
			
		||||
        if not os.path.exists(fullpath):
 | 
			
		||||
        if fname != '-' and not os.path.exists(fullpath):
 | 
			
		||||
            self.__error(_('Error: Import file %s not found.') % fname)
 | 
			
		||||
            sys.exit(0)
 | 
			
		||||
        
 | 
			
		||||
@@ -181,20 +181,23 @@ class ArgHandler(object):
 | 
			
		||||
        # For non latin characters in Windows path/file/user names
 | 
			
		||||
        value = Utils.get_unicode_path_from_env_var(value)
 | 
			
		||||
        fname = value
 | 
			
		||||
        fullpath = os.path.abspath(os.path.expanduser(fname))
 | 
			
		||||
        if os.path.exists(fullpath):
 | 
			
		||||
            self.__error(_("WARNING: Output file already exists!\n"
 | 
			
		||||
                    "WARNING: It will be overwritten:\n   %(name)s") % \
 | 
			
		||||
                    {'name' : fullpath})
 | 
			
		||||
            answer = None
 | 
			
		||||
            while not answer:
 | 
			
		||||
                answer = raw_input(_('OK to overwrite? (yes/no) ') \
 | 
			
		||||
                                    .encode(sys.getfilesystemencoding()))
 | 
			
		||||
            if answer.upper() in ('Y', 'YES', _('YES').upper()):
 | 
			
		||||
                self.__error( _("Will overwrite the existing file: %s") 
 | 
			
		||||
                                % fullpath)
 | 
			
		||||
            else:
 | 
			
		||||
                sys.exit(0)
 | 
			
		||||
        if fname == '-':
 | 
			
		||||
            fullpath = '-'
 | 
			
		||||
        else:
 | 
			
		||||
            fullpath = os.path.abspath(os.path.expanduser(fname))
 | 
			
		||||
            if os.path.exists(fullpath):
 | 
			
		||||
                self.__error(_("WARNING: Output file already exists!\n"
 | 
			
		||||
                        "WARNING: It will be overwritten:\n   %(name)s") % \
 | 
			
		||||
                        {'name' : fullpath})
 | 
			
		||||
                answer = None
 | 
			
		||||
                while not answer:
 | 
			
		||||
                    answer = raw_input(_('OK to overwrite? (yes/no) ') \
 | 
			
		||||
                                        .encode(sys.getfilesystemencoding()))
 | 
			
		||||
                if answer.upper() in ('Y', 'YES', _('YES').upper()):
 | 
			
		||||
                    self.__error( _("Will overwrite the existing file: %s") 
 | 
			
		||||
                                    % fullpath)
 | 
			
		||||
                else:
 | 
			
		||||
                    sys.exit(0)
 | 
			
		||||
 | 
			
		||||
        if family_tree_format is None:
 | 
			
		||||
            # Guess the file format based on the file extension.
 | 
			
		||||
@@ -317,9 +320,9 @@ class ArgHandler(object):
 | 
			
		||||
        self.__import_action()
 | 
			
		||||
            
 | 
			
		||||
        for (action, options_str) in self.actions:
 | 
			
		||||
            print "Performing action: %s." % action
 | 
			
		||||
            print >> sys.stderr, "Performing action: %s." % action
 | 
			
		||||
            if options_str:
 | 
			
		||||
                print "Using options string: %s" % options_str
 | 
			
		||||
                print >> sys.stderr, "Using options string: %s" % options_str
 | 
			
		||||
            self.cl_action(action, options_str)
 | 
			
		||||
 | 
			
		||||
        for expt in self.exports:
 | 
			
		||||
@@ -327,16 +330,16 @@ class ArgHandler(object):
 | 
			
		||||
            # For non latin characters in Windows path/file/user names
 | 
			
		||||
            fn = expt[0].encode(sys.getfilesystemencoding())
 | 
			
		||||
            fmt = str(expt[1])
 | 
			
		||||
            print "Exporting: file %s, format %s." % (fn, fmt)
 | 
			
		||||
            print >> sys.stderr, "Exporting: file %s, format %s." % (fn, fmt)
 | 
			
		||||
            self.cl_export(expt[0], expt[1])
 | 
			
		||||
 | 
			
		||||
        if cleanup:
 | 
			
		||||
            self.cleanup()
 | 
			
		||||
            print "Exiting."
 | 
			
		||||
            print >> sys.stderr, "Exiting."
 | 
			
		||||
            sys.exit(0)
 | 
			
		||||
 | 
			
		||||
    def cleanup(self):
 | 
			
		||||
        print "Cleaning up."
 | 
			
		||||
        print >> sys.stderr, "Cleaning up."
 | 
			
		||||
        # remove files in import db subdir after use
 | 
			
		||||
        self.dbstate.db.close()
 | 
			
		||||
        if self.imp_db_path:
 | 
			
		||||
@@ -366,16 +369,16 @@ class ArgHandler(object):
 | 
			
		||||
                
 | 
			
		||||
                try:
 | 
			
		||||
                    self.sm.open_activate(self.imp_db_path)
 | 
			
		||||
                    print "Created empty family tree successfully"
 | 
			
		||||
                    print >> sys.stderr, "Created empty family tree successfully"
 | 
			
		||||
                except:
 | 
			
		||||
                    print "Error opening the file." 
 | 
			
		||||
                    print "Exiting..." 
 | 
			
		||||
                    print >> sys.stderr, "Error opening the file." 
 | 
			
		||||
                    print >> sys.stderr, "Exiting..." 
 | 
			
		||||
                    sys.exit(0)
 | 
			
		||||
 | 
			
		||||
            for imp in self.imports:
 | 
			
		||||
                fn = imp[0].encode(sys.getfilesystemencoding())
 | 
			
		||||
                fmt = str(imp[1])
 | 
			
		||||
                print "Importing: file %s, format %s." % (fn, fmt)
 | 
			
		||||
                print >> sys.stderr, "Importing: file %s, format %s." % (fn, fmt)
 | 
			
		||||
                self.cl_import(imp[0], imp[1])
 | 
			
		||||
 | 
			
		||||
    def __open_action(self):
 | 
			
		||||
@@ -391,10 +394,10 @@ class ArgHandler(object):
 | 
			
		||||
            # we load this file for use
 | 
			
		||||
            try:
 | 
			
		||||
                self.sm.open_activate(self.open)
 | 
			
		||||
                print "Opened successfully!"
 | 
			
		||||
                print >> sys.stderr, "Opened successfully!"
 | 
			
		||||
            except:
 | 
			
		||||
                print "Error opening the file." 
 | 
			
		||||
                print "Exiting..." 
 | 
			
		||||
                print >> sys.stderr, "Error opening the file." 
 | 
			
		||||
                print >> sys.stderr, "Exiting..." 
 | 
			
		||||
                sys.exit(0)
 | 
			
		||||
 | 
			
		||||
    def check_db(self, dbpath, force_unlock = False):
 | 
			
		||||
@@ -466,7 +469,7 @@ class ArgHandler(object):
 | 
			
		||||
                    for chunk in options_str.split(',') ] )
 | 
			
		||||
            except:
 | 
			
		||||
                options_str_dict = {}
 | 
			
		||||
                print "Ignoring invalid options string."
 | 
			
		||||
                print >> sys.stderr, "Ignoring invalid options string."
 | 
			
		||||
 | 
			
		||||
            name = options_str_dict.pop('name', None)
 | 
			
		||||
            _cl_list = pmgr.get_reg_reports(gui=False)
 | 
			
		||||
@@ -493,15 +496,16 @@ class ArgHandler(object):
 | 
			
		||||
            else:
 | 
			
		||||
                msg = "Report name not given. Please use one of [-p|--options] name=reportname."
 | 
			
		||||
            
 | 
			
		||||
            print "%s\n Available names are:" % msg
 | 
			
		||||
            print >> sys.stderr, "%s\n Available names are:" % msg
 | 
			
		||||
            for pdata in _cl_list:
 | 
			
		||||
                # Print cli report name ([item[0]) and GUI report name (item[4])
 | 
			
		||||
                if len(pdata.id) <= 25:
 | 
			
		||||
                    print "   %s%s- %s" % ( pdata.id, 
 | 
			
		||||
                                            " " * (26 - len(pdata.id)),
 | 
			
		||||
                                            pdata.name.encode(sys.getfilesystemencoding()))
 | 
			
		||||
                    print >> sys.stderr, \
 | 
			
		||||
                        "   %s%s- %s" % ( pdata.id, " " * (26 - len(pdata.id)),
 | 
			
		||||
                                 pdata.name.encode(sys.getfilesystemencoding()))
 | 
			
		||||
                else:
 | 
			
		||||
                    print "   %s\t- %s" % (pdata.id, pdata.name.encode(sys.getfilesystemencoding()))
 | 
			
		||||
                    print >> sys.stderr, "   %s\t- %s" % (pdata.id,
 | 
			
		||||
                                 pdata.name.encode(sys.getfilesystemencoding()))
 | 
			
		||||
 | 
			
		||||
        elif action == "tool":
 | 
			
		||||
            from gui.plug import tool
 | 
			
		||||
@@ -510,7 +514,7 @@ class ArgHandler(object):
 | 
			
		||||
                                           chunk in options_str.split(',') ] )
 | 
			
		||||
            except:
 | 
			
		||||
                options_str_dict = {}
 | 
			
		||||
                print "Ignoring invalid options string."
 | 
			
		||||
                print >> sys.stderr, "Ignoring invalid options string."
 | 
			
		||||
 | 
			
		||||
            name = options_str_dict.pop('name', None)
 | 
			
		||||
            _cli_tool_list = pmgr.get_reg_tools(gui=False)
 | 
			
		||||
@@ -531,15 +535,16 @@ class ArgHandler(object):
 | 
			
		||||
            else:
 | 
			
		||||
                msg = "Tool name not given. Please use one of [-p|--options] name=toolname."
 | 
			
		||||
            
 | 
			
		||||
            print "%s\n Available names are:" % msg
 | 
			
		||||
            print >> sys.stderr, "%s\n Available names are:" % msg
 | 
			
		||||
            for pdata in _cli_tool_list:
 | 
			
		||||
                # Print cli report name ([item[0]) and GUI report name (item[4])
 | 
			
		||||
                if len(pdata.id) <= 25:
 | 
			
		||||
                    print "   %s%s- %s" % ( pdata.id, 
 | 
			
		||||
                                            " " * (26 - len(pdata.id)),
 | 
			
		||||
                                            pdata.name.encode(sys.getfilesystemencoding()))
 | 
			
		||||
                    print >> sys.stderr, \
 | 
			
		||||
                        "   %s%s- %s" % ( pdata.id, " " * (26 - len(pdata.id)),
 | 
			
		||||
                                 pdata.name.encode(sys.getfilesystemencoding()))
 | 
			
		||||
                else:
 | 
			
		||||
                    print "   %s\t- %s" % (pdata.id, pdata.name.encode(sys.getfilesystemencoding()))
 | 
			
		||||
                    print >> sys.stderr, "   %s\t- %s" % (pdata.id,
 | 
			
		||||
                                 pdata.name.encode(sys.getfilesystemencoding()))
 | 
			
		||||
        else:
 | 
			
		||||
            print "Unknown action: %s." % action
 | 
			
		||||
            print >> sys.stderr, "Unknown action: %s." % action
 | 
			
		||||
            sys.exit(0)
 | 
			
		||||
 
 | 
			
		||||
@@ -231,7 +231,7 @@ class ArgParser(object):
 | 
			
		||||
            # if there were an argument without option,
 | 
			
		||||
            # use it as a file to open and return
 | 
			
		||||
            self.open_gui = leftargs[0]
 | 
			
		||||
            print "Trying to open: %s ..." % leftargs[0]
 | 
			
		||||
            print >> sys.stderr, "Trying to open: %s ..." % leftargs[0]
 | 
			
		||||
            #see if force open is on
 | 
			
		||||
            for opt_ix in range(len(options)):
 | 
			
		||||
                option, value = options[opt_ix]
 | 
			
		||||
@@ -262,7 +262,7 @@ class ArgParser(object):
 | 
			
		||||
            elif option in ( '-a', '--action' ):
 | 
			
		||||
                action = value
 | 
			
		||||
                if action not in ( 'report', 'tool' ):
 | 
			
		||||
                    print "Unknown action: %s. Ignoring." % action
 | 
			
		||||
                    print >> sys.stderr, "Unknown action: %s. Ignoring." % action
 | 
			
		||||
                    continue
 | 
			
		||||
                options_str = ""
 | 
			
		||||
                if opt_ix < len(options)-1 \
 | 
			
		||||
@@ -270,7 +270,7 @@ class ArgParser(object):
 | 
			
		||||
                    options_str = options[opt_ix+1][1]
 | 
			
		||||
                self.actions.append((action, options_str))
 | 
			
		||||
            elif option in ('-d', '--debug'):
 | 
			
		||||
                print 'setup debugging', value
 | 
			
		||||
                print >> sys.stderr, 'setup debugging', value
 | 
			
		||||
                logger = logging.getLogger(value)
 | 
			
		||||
                logger.setLevel(logging.DEBUG)
 | 
			
		||||
                cleandbg += [opt_ix]
 | 
			
		||||
@@ -287,20 +287,22 @@ class ArgParser(object):
 | 
			
		||||
                        set_value = True
 | 
			
		||||
                    if config.has_default(setting_name):
 | 
			
		||||
                        setting_value = config.get(setting_name)
 | 
			
		||||
                        print "Current Gramps config setting: %s:%s" % (
 | 
			
		||||
                            setting_name, repr(setting_value))
 | 
			
		||||
                        print >> sys.stderr, "Current Gramps config setting: " \
 | 
			
		||||
                                   "%s:%s" % (setting_name, repr(setting_value))
 | 
			
		||||
                        if set_value:
 | 
			
		||||
                            if new_value == "DEFAULT":
 | 
			
		||||
                                new_value = config.get_default(setting_name)
 | 
			
		||||
                            else:
 | 
			
		||||
                                new_value = safe_eval(new_value)
 | 
			
		||||
                            config.set(setting_name, new_value)
 | 
			
		||||
                            print "    New Gramps config setting: %s:%s" % (
 | 
			
		||||
                                setting_name, repr(config.get(setting_name)))
 | 
			
		||||
                            print >> sys.stderr, "    New Gramps config " \
 | 
			
		||||
                                            "setting: %s:%s" % (setting_name, \
 | 
			
		||||
                                            repr(config.get(setting_name)))
 | 
			
		||||
                        else:
 | 
			
		||||
                            need_to_quit = True
 | 
			
		||||
                    else:
 | 
			
		||||
                        print "Gramps: no such config setting: '%s'" % setting_name
 | 
			
		||||
                        print >> sys.stderr, "Gramps: no such config setting:" \
 | 
			
		||||
                                             " '%s'" % setting_name
 | 
			
		||||
                        need_to_quit = True
 | 
			
		||||
                else:
 | 
			
		||||
                    print "Gramps config settings from %s:" % \
 | 
			
		||||
 
 | 
			
		||||
@@ -125,46 +125,52 @@ class GrampsXmlWriter(UpdateCallback):
 | 
			
		||||
        """
 | 
			
		||||
        Write the database to the specified file.
 | 
			
		||||
        """
 | 
			
		||||
        base = os.path.dirname(filename)
 | 
			
		||||
        if os.path.isdir(base):
 | 
			
		||||
            if not os.access(base, os.W_OK) or not os.access(base, os.R_OK):
 | 
			
		||||
                raise DbWriteFailure(
 | 
			
		||||
                         _('Failure writing %s') % filename,
 | 
			
		||||
                         _("The database cannot be saved because you do "
 | 
			
		||||
                           "not have permission to write to the directory. "
 | 
			
		||||
                           "Please make sure you have write access to the "
 | 
			
		||||
                            "directory and try again."))
 | 
			
		||||
                return 0
 | 
			
		||||
            
 | 
			
		||||
        if os.path.exists(filename):
 | 
			
		||||
            if not os.access(filename, os.W_OK):
 | 
			
		||||
                raise DbWriteFailure(
 | 
			
		||||
                        _('Failure writing %s') % filename,
 | 
			
		||||
                        _("The database cannot be saved because you do "
 | 
			
		||||
                           "not have permission to write to the file. "
 | 
			
		||||
                           "Please make sure you have write access to the "
 | 
			
		||||
                           "file and try again."))
 | 
			
		||||
                return 0
 | 
			
		||||
        if filename == '-':
 | 
			
		||||
            import sys
 | 
			
		||||
            g = sys.stdout
 | 
			
		||||
            self.compress = False
 | 
			
		||||
        else:
 | 
			
		||||
            base = os.path.dirname(filename)
 | 
			
		||||
            if os.path.isdir(base):
 | 
			
		||||
                if not os.access(base, os.W_OK) or not os.access(base, os.R_OK):
 | 
			
		||||
                    raise DbWriteFailure(
 | 
			
		||||
                            _('Failure writing %s') % filename,
 | 
			
		||||
                            _("The database cannot be saved because you do "
 | 
			
		||||
                            "not have permission to write to the directory. "
 | 
			
		||||
                            "Please make sure you have write access to the "
 | 
			
		||||
                                "directory and try again."))
 | 
			
		||||
                    return 0
 | 
			
		||||
                
 | 
			
		||||
            if os.path.exists(filename):
 | 
			
		||||
                if not os.access(filename, os.W_OK):
 | 
			
		||||
                    raise DbWriteFailure(
 | 
			
		||||
                            _('Failure writing %s') % filename,
 | 
			
		||||
                            _("The database cannot be saved because you do "
 | 
			
		||||
                            "not have permission to write to the file. "
 | 
			
		||||
                            "Please make sure you have write access to the "
 | 
			
		||||
                            "file and try again."))
 | 
			
		||||
                    return 0
 | 
			
		||||
        
 | 
			
		||||
        self.fileroot = os.path.dirname(filename)
 | 
			
		||||
        try:
 | 
			
		||||
            if self.compress and _gzip_ok:
 | 
			
		||||
                try:
 | 
			
		||||
                    g = gzip.open(filename,"wb")
 | 
			
		||||
                except:
 | 
			
		||||
            self.fileroot = os.path.dirname(filename)
 | 
			
		||||
            try:
 | 
			
		||||
                if self.compress and _gzip_ok:
 | 
			
		||||
                    try:
 | 
			
		||||
                        g = gzip.open(filename,"wb")
 | 
			
		||||
                    except:
 | 
			
		||||
                        g = open(filename,"w")
 | 
			
		||||
                else:
 | 
			
		||||
                    g = open(filename,"w")
 | 
			
		||||
            else:
 | 
			
		||||
                g = open(filename,"w")
 | 
			
		||||
        except IOError,msg:
 | 
			
		||||
            LOG.warn(str(msg))
 | 
			
		||||
            raise DbWriteFailure((_('Failure writing %s') % filename,
 | 
			
		||||
                                       str(msg)))
 | 
			
		||||
            return 0
 | 
			
		||||
            except IOError,msg:
 | 
			
		||||
                LOG.warn(str(msg))
 | 
			
		||||
                raise DbWriteFailure((_('Failure writing %s') % filename,
 | 
			
		||||
                                        str(msg)))
 | 
			
		||||
                return 0
 | 
			
		||||
 | 
			
		||||
        self.g = codecs.getwriter("utf8")(g)
 | 
			
		||||
 | 
			
		||||
        self.write_xml_data()
 | 
			
		||||
        g.close()
 | 
			
		||||
        if filename != '-':
 | 
			
		||||
            g.close()
 | 
			
		||||
        return 1
 | 
			
		||||
 | 
			
		||||
    def write_handle(self, handle):
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user