Edgewall Software

Ticket #8861: t8861-trac_admin_wiki_replace-r8865.diff

File t8861-trac_admin_wiki_replace-r8865.diff, 4.8 KB (added by mrenzmann@…, 2 years ago)
  • trac/admin/console.py

     
    689689                  ('wiki remove <page>', 'Remove wiki page'), 
    690690                  ('wiki export <page> [file]', 
    691691                   'Export wiki page to file or stdout'), 
    692                   ('wiki import <page> [file]', 
    693                    'Import wiki page from file or stdin'), 
     692                  ('wiki import <page> [file] [replace]', 
     693                   'Import wiki page from file or stdin, ' 
     694                   'optionally replacing the current version'), 
    694695                  ('wiki dump <directory>', 
    695696                   'Export all wiki pages to files named by title'), 
    696                   ('wiki load <directory>', 
    697                    'Import all wiki pages from directory'), 
     697                  ('wiki load <directory> [replace]', 
     698                   'Import all wiki pages from directory, optionally ' 
     699                   'replacing the current version'), 
    698700                  ('wiki upgrade', 
    699701                   'Upgrade default wiki pages to current version')] 
    700702 
     
    725727        elif arg[0] == 'remove'  and len(arg)==2: 
    726728            name = arg[1] 
    727729            self._do_wiki_remove(name) 
    728         elif arg[0] == 'import' and len(arg) == 3: 
     730        elif arg[0] == 'import' and len(arg) in [3,4]: 
    729731            title = arg[1] 
    730732            file = arg[2] 
    731             self._do_wiki_import(file, title) 
     733            replace = (len(arg) == 4 and arg[3] == "replace") or False 
     734            self._do_wiki_import(file, title, replace=replace) 
    732735        elif arg[0] == 'export'  and len(arg) in [2,3]: 
    733736            page = arg[1] 
    734737            file = (len(arg) == 3 and arg[2]) or None 
     
    736739        elif arg[0] == 'dump' and len(arg) in [1,2]: 
    737740            dir = (len(arg) == 2 and arg[1]) or '' 
    738741            self._do_wiki_dump(dir) 
    739         elif arg[0] == 'load' and len(arg) in [1,2]: 
    740             dir = (len(arg) == 2 and arg[1]) or '' 
    741             self._do_wiki_load(dir) 
     742        elif arg[0] == 'load' and len(arg) in [1,2,3]: 
     743            dir = (len(arg) >= 2 and arg[1]) or '' 
     744            replace = (len(arg) == 3 and arg[2] == "replace") or False 
     745            self._do_wiki_load(dir, replace=replace) 
    742746        elif arg[0] == 'upgrade' and len(arg) == 1: 
    743747            self._do_wiki_load(pkg_resources.resource_filename('trac.wiki',  
    744748                                                               'default-pages'), 
     
    768772            page.delete() 
    769773 
    770774    def _do_wiki_import(self, filename, title, cursor=None, 
    771                         create_only=[]): 
     775                        create_only=[], replace=False): 
    772776        if not os.path.isfile(filename): 
    773777            raise Exception, '%s is not a file' % filename 
    774778 
     
    788792            return False 
    789793        f.close() 
    790794 
    791         self.db_update("INSERT INTO wiki(version,name,time,author,ipnr,text) " 
    792                        " SELECT 1+COALESCE(max(version),0),%s,%s," 
    793                        " 'trac','127.0.0.1',%s FROM wiki " 
    794                        " WHERE name=%s", 
    795                        cursor, (title, int(time.time()), data, title)) 
     795        if replace: 
     796            self.db_update("UPDATE wiki SET text=%s " 
     797                           " WHERE name=%s AND " 
     798                           " version=(SELECT version FROM wiki WHERE name=%s" 
     799                           "  ORDER BY version DESC LIMIT 1)", 
     800                           cursor, (data, title, title)) 
     801        else: 
     802            self.db_update("INSERT INTO wiki(version,name,time,author,ipnr,text) " 
     803                           " SELECT 1+COALESCE(max(version),0),%s,%s," 
     804                           " 'trac','127.0.0.1',%s FROM wiki " 
     805                           " WHERE name=%s", 
     806                           cursor, (title, int(time.time()), data, title)) 
    796807        return True 
    797808 
    798809    def _do_wiki_export(self, page, filename=''): 
     
    820831            printout(_(" %(src)s => %(dst)s", src=p, dst=dst)) 
    821832            self._do_wiki_export(p, dst) 
    822833 
    823     def _do_wiki_load(self, dir, cursor=None, ignore=[], create_only=[]): 
     834    def _do_wiki_load(self, dir, cursor=None, ignore=[], create_only=[], replace=False): 
    824835        cons_charset = getattr(sys.stdout, 'encoding', None) or 'utf-8' 
    825836        for page in os.listdir(dir): 
    826837            if page in ignore: 
     
    828839            filename = os.path.join(dir, page) 
    829840            page = unicode_unquote(page.encode('utf-8')) 
    830841            if os.path.isfile(filename): 
    831                 if self._do_wiki_import(filename, page, cursor, create_only): 
     842                if self._do_wiki_import(filename, page, cursor, create_only, replace): 
    832843                    printout(_(" %(page)s imported from %(filename)s", 
    833844                               filename=filename, page=page)) 
    834845