Ticket #7822: 7822-multirepos-repos-mgmt-r7888.patch
| File 7822-multirepos-repos-mgmt-r7888.patch, 8.1 KB (added by rblank, 3 years ago) |
|---|
-
trac/admin/tests/console-tests.txt
diff --git a/trac/admin/tests/console-tests.txt b/trac/admin/tests/console-tests.txt
a b 31 31 priority list Show possible ticket priorities 32 32 priority order Move a priority value up or down in the list 33 33 priority remove Remove a priority value 34 repository add Add a source repository 35 repository alias Create an alias for a repository 34 36 repository changeset Notify trac about new changesets 37 repository list List source repositories 38 repository remove Remove a source repository 39 repository rename Rename a source repository 35 40 repository resync Re-synchronize trac with repositories 36 41 resolution add Add a resolution value option 37 42 resolution change Change a resolution value -
trac/versioncontrol/admin.py
diff --git a/trac/versioncontrol/admin.py b/trac/versioncontrol/admin.py
a b 13 13 14 14 import sys 15 15 16 from trac.admin import IAdminCommandProvider 16 from trac.admin import IAdminCommandProvider, get_dir_list 17 17 from trac.core import * 18 from trac.util.text import print err, printout18 from trac.util.text import print_table, printerr, printout 19 19 from trac.util.translation import _, ngettext 20 20 from trac.versioncontrol import RepositoryManager 21 21 … … 28 28 # IAdminCommandProvider methods 29 29 30 30 def get_admin_commands(self): 31 yield ('repository add', '<repos> <dir> [type]', 32 'Add a source repository', 33 self._complete_add, self._do_add) 34 yield ('repository alias', '<repos> <alias>', 35 'Create an alias for a repository', 36 self._complete_repos, self._do_alias) 31 37 yield ('repository changeset', '<repos> <rev> [rev] [...]', 32 38 'Notify trac about new changesets', 33 39 self._complete_repos, self._do_changeset) 40 yield ('repository list', '', 41 'List source repositories', 42 None, self._do_list) 43 yield ('repository remove', '<repos>', 44 'Remove a source repository', 45 self._complete_repos, self._do_remove) 46 yield ('repository rename', '<repos> <newname>', 47 'Rename a source repository', 48 self._complete_repos, self._do_rename) 34 49 yield ('repository resync', '<repos> [rev]', 35 50 """Re-synchronize trac with repositories 36 51 … … 42 57 """, 43 58 self._complete_repos, self._do_resync) 44 59 60 def get_supported_types(self): 61 rm = RepositoryManager(self.env) 62 return [type_ for connector in rm.connectors 63 for (type_, prio) in connector.get_supported_types() 64 if prio >= 0] 65 66 def _complete_add(self, args): 67 if len(args) == 2: 68 return get_dir_list(args[-1], True) 69 elif len(args) == 3: 70 return self.get_supported_types() 71 45 72 def _complete_repos(self, args): 46 73 if len(args) == 1: 47 74 rm = RepositoryManager(self.env) 48 75 return [reponame or '(default)' for reponame 49 76 in rm.get_all_repositories()] 50 77 78 def _do_add(self, reponame, dir, type_=None): 79 if reponame == '(default)': 80 reponame = '' 81 if type_ is not None and type_ not in self.get_supported_types(): 82 raise TracError(_("The repository type '%(type)s' is not " 83 "supported", type=type_)) 84 db = self.env.get_db_cnx() 85 cursor = db.cursor() 86 cursor.executemany("INSERT INTO repository (id, name, value) " 87 "VALUES (%s, %s, %s)", 88 [(reponame, 'dir', dir), (reponame, 'type', type_)]) 89 db.commit() 90 RepositoryManager(self.env).reload_repositories() 91 92 def _do_alias(self, reponame, alias): 93 if reponame == '(default)': 94 reponame = '' 95 if alias in ('', '(default)'): 96 raise TracError(_("Invalid alias name '%(alias)s'", alias=alias)) 97 db = self.env.get_db_cnx() 98 cursor = db.cursor() 99 cursor.executemany("INSERT INTO repository (id, name, value) " 100 "VALUES (%s, %s, %s)", 101 [(alias, 'dir', None), (alias, 'alias', reponame)]) 102 db.commit() 103 RepositoryManager(self.env).reload_repositories() 104 51 105 def _do_changeset(self, reponame, *revs): 52 106 rm = RepositoryManager(self.env) 53 107 rm.notify_changesets_added(reponame, revs, None) 54 108 109 def _do_list(self): 110 rm = RepositoryManager(self.env) 111 values = [] 112 for (reponame, info) in sorted(rm.get_all_repositories().iteritems()): 113 alias = '' 114 if 'alias' in info: 115 alias = info['alias'] or '(default)' 116 values.append((reponame or '(default)', info.get('type', ''), 117 alias, info.get('dir', ''))) 118 print_table(values, [_('Name'), _('Type'), _('Alias'), _('Directory')]) 119 120 def _do_remove(self, reponame): 121 if reponame == '(default)': 122 reponame = '' 123 db = self.env.get_db_cnx() 124 cursor = db.cursor() 125 cursor.execute("DELETE FROM repository " 126 "WHERE id=%s AND name IN ('dir', 'type', 'alias')", 127 (reponame,)) 128 cursor.execute("DELETE FROM revision WHERE repos=%s", (reponame,)) 129 cursor.execute("DELETE FROM node_change WHERE repos=%s", (reponame,)) 130 db.commit() 131 RepositoryManager(self.env).reload_repositories() 132 133 def _do_rename(self, reponame, newname): 134 if reponame == '(default)': 135 reponame = '' 136 if newname == '(default)': 137 newname = '' 138 db = self.env.get_db_cnx() 139 cursor = db.cursor() 140 cursor.execute("UPDATE repository SET id=%s WHERE id=%s", 141 (newname, reponame)) 142 cursor.execute("UPDATE revision SET repos=%s WHERE repos=%s", 143 (newname, reponame)) 144 cursor.execute("UPDATE node_change SET repos=%s WHERE repos=%s", 145 (newname, reponame)) 146 db.commit() 147 RepositoryManager(self.env).reload_repositories() 148 55 149 def _do_resync(self, reponame, rev=None): 56 150 rm = RepositoryManager(self.env) 57 151 if reponame == '*': -
trac/versioncontrol/api.py
diff --git a/trac/versioncontrol/api.py b/trac/versioncontrol/api.py
a b 81 81 """Called after a changeset has been added to a repository.""" 82 82 83 83 84 class DbRepositoryProvider(Component): 85 """Component providing repositories registered in the DB.""" 86 87 implements(IRepositoryProvider) 88 89 # IRepositoryProvider methods 90 91 def get_repositories(self): 92 """Retrieve repositories specified in the repository DB table.""" 93 db = self.env.get_db_cnx() 94 cursor = db.cursor() 95 cursor.execute("SELECT id,name,value FROM repository " 96 "WHERE name IN ('dir', 'alias', 'type')") 97 reponames = {} 98 for (id, name, value) in cursor: 99 if value is not None: 100 reponames.setdefault(id, {})[name] = value 101 102 for reponame, info in reponames.iteritems(): 103 yield (reponame, info) 104 105 84 106 class RepositoryManager(Component): 85 107 """Component registering the supported version control systems. 86 108 … … 296 318 "Skip invalid repositories" 297 319 return repositories 298 320 321 def reload_repositories(self): 322 """Reload the repositories from the providers.""" 323 self._lock.acquire() 324 try: 325 # FIXME: trac-admin doesn't reload the environment 326 self._cache = {} 327 self._all_repositories = None 328 finally: 329 self._lock.release() 330 self.config.touch() # Force environment reload 331 299 332 def notify_changesets_added(self, reponame, revs, authname): 300 333 """Notify repositories and change listeners about added changesets.""" 301 334 self.log.debug('Notification on %s for changesets %r'
