Changes in plugins/0.12/mercurial-plugin [9128:9953] in trac.svn
- Location:
- plugins/0.12/mercurial-plugin
- Files:
-
- 3 added
- 1 deleted
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
plugins/0.12/mercurial-plugin/setup.py
r9128 r9953 7 7 try: 8 8 import babel 9 9 10 extra['message_extractors'] = { 10 11 'tracext': [ … … 12 13 ], 13 14 } 15 16 from trac.util.dist import get_l10n_cmdclass 17 extra['cmdclass'] = get_l10n_cmdclass() 18 14 19 except ImportError: 15 20 pass … … 18 23 19 24 setup(name='TracMercurial', 20 install_requires='Trac >=0.12 multirepos',25 install_requires='Trac >=0.12dev-r9125', 21 26 description='Mercurial plugin for Trac multirepos branch', 22 27 keywords='trac scm plugin mercurial hg', 23 version='0.12.0.2 1',28 version='0.12.0.23', 24 29 url=TracMercurial, 25 30 license='GPL', -
plugins/0.12/mercurial-plugin/tracext/hg/backend.py
r9128 r9953 22 22 from trac.core import * 23 23 from trac.config import _TRUE_VALUES as TRUE 24 from trac.env import ISystemInfoProvider 24 25 from trac.util import arity 25 26 from trac.util.datefmt import utc 26 27 from trac.util.text import shorten_line, to_unicode 27 28 from trac.versioncontrol.api import Changeset, Node, Repository, \ 28 IRepositoryConnector, \29 IRepositoryConnector, RepositoryManager, \ 29 30 NoSuchChangeset, NoSuchNode 30 31 from trac.versioncontrol.web_ui import IPropertyRenderer, RenderedProperty … … 33 34 try: 34 35 from trac.util.translation import domain_functions 35 gettext, _, tag_, N_, add_domain = domain_functions('tracmercurial', 36 'gettext', '_', 'tag_', 'N_', 'add_domain') 36 gettext, _, tag_, N_, add_domain = \ 37 domain_functions('tracmercurial', 38 ('gettext', '_', 'tag_', 'N_', 'add_domain')) 37 39 except ImportError: 38 40 from trac.util.translation import _, tag_, N_, gettext … … 103 105 def _render_property(self, name, mode, context, props): 104 106 repos, revs = props[name] 107 108 if name in ('Parents', 'Children'): 109 label = repos.display_rev 110 else: 111 label = lambda rev: rev 112 105 113 def link(rev): 106 114 chgset = repos.get_changeset(rev) 107 return tag.a( rev, class_="changeset",115 return tag.a(label(rev), class_="changeset", 108 116 title=shorten_line(chgset.message), 109 117 href=context.href.changeset(rev, repos.reponame)) 118 110 119 if name == 'Parents' and len(revs) == 2: # merge 111 120 new = context.resource.id … … 135 144 link(revs[-1])) 136 145 146 137 147 class HgExtPropertyRenderer(Component): 138 148 implements(IPropertyRenderer) 139 149 140 150 def match_property(self, name, mode): 141 return name in ('transplant_source' ) and \151 return name in ('transplant_source', 'convert_revision') and \ 142 152 mode == 'revprop' and 4 or 0 143 153 … … 147 157 try: 148 158 chgset = MercurialChangeset(repos, value) 149 link = tag.a( chgset.rev, class_="changeset",159 link = tag.a(repos.display_rev(chgset.rev), class_="changeset", 150 160 title=shorten_line(chgset.message), 151 href=context.href.changeset( short(value),161 href=context.href.changeset(hex(value), 152 162 repos.reponame)) 153 163 except LookupError: … … 156 166 return RenderedProperty(name=_("Transplant:"), content=link, 157 167 name_attributes=[("class", "property")]) 168 169 elif name == 'convert_revision': 170 text = value 171 if value.startswith('svn:'): 172 # svn:af82e41b-90c4-0310-8c96-b1721e28e2e2/trunk@9517 173 uuid = value[:40] 174 rev = value.rsplit('@', 1)[-1] 175 for r in RepositoryManager(self.env).get_real_repositories(): 176 if r.name.startswith(uuid + ':'): 177 path = r.reponame 178 href = context.href.changeset(rev, path or None) 179 text = tag.a('[%s%s]' % (rev, path and '/' + path), 180 class_='changeset', href=href, 181 title=_('Changeset in source repository')) 182 break 183 return RenderedProperty(name=_('Convert:'), content=text, 184 name_attributes=[("class", "property")]) 185 158 186 159 187 class HgDefaultPropertyRenderer(Component): … … 176 204 class MercurialConnector(Component): 177 205 178 implements(I RepositoryConnector, IWikiSyntaxProvider)206 implements(ISystemInfoProvider, IRepositoryConnector, IWikiSyntaxProvider) 179 207 180 208 def __init__(self): 181 self._version = self._version_info = None182 209 self.ui = None 183 210 locale_dir = pkg_resources.resource_filename(__name__, 'locale') 184 211 add_domain(self.env.path, locale_dir) 185 186 def _setup_ui(self, hgrc_path): 187 self.ui = trac_ui(self.log) 188 # (code below adapted from mercurial.dispatch._dispatch) 189 190 # read the local repository .hgrc into a local ui object 191 if hgrc_path: 192 if not os.path.isabs(hgrc_path): 193 hgrc_path = os.path.join(self.env.path, 'conf', hgrc_path) 194 if not os.path.exists(hgrc_path): 195 self.log.warn("[hg] hgrc file (%s) doesn't exist.", hgrc_path) 196 try: 197 self.ui = trac_ui(self.log, parentui=self.ui) 198 self.ui.check_trusted = False 199 self.ui.readconfig(hgrc_path) 200 except IOError, e: 201 self.log.warn("[hg] hgrc file (%s) can't be read: %s", 202 hgrc_path, e) 203 204 extensions.loadall(self.ui) 205 if hasattr(extensions, 'extensions'): 206 for name, module in extensions.extensions(): 207 # setup extensions 208 extsetup = getattr(module, 'extsetup', None) 209 if extsetup: 210 if arity(extsetup) == 1: 211 extsetup(self.ui) 212 else: 213 extsetup() 214 215 def get_supported_types(self): 216 """Support for `repository_type = hg`""" 217 global hg_import_error 218 if hg_import_error: 219 self.error = hg_import_error 220 yield ("hg", -1) 221 else: 222 yield ("hg", 8) 223 224 def get_repository(self, type, dir, params): 225 """Return a `MercurialRepository`""" 226 if not self._version: 212 self._version = self._version_info = None 213 if not hg_import_error: 227 214 try: 228 215 from mercurial.version import get_version … … 237 224 if m: 238 225 self._version_info = tuple([int(n or 0) for n in m.groups()]) 239 self.env.systeminfo.append(('Mercurial', self._version)) 226 227 def _setup_ui(self, hgrc_path): 228 self.ui = trac_ui(log=self.log) 229 # (code below adapted from mercurial.dispatch._dispatch) 230 231 # read the local repository .hgrc into a local ui object 232 if hgrc_path: 233 if not os.path.isabs(hgrc_path): 234 hgrc_path = os.path.join(self.env.path, 'conf', hgrc_path) 235 if not os.path.exists(hgrc_path): 236 self.log.warn("[hg] hgrc file (%s) doesn't exist.", hgrc_path) 237 try: 238 self.ui = trac_ui(self.ui, log=self.log) 239 self.ui.check_trusted = False 240 self.ui.readconfig(hgrc_path) 241 except IOError, e: 242 self.log.warn("[hg] hgrc file (%s) can't be read: %s", 243 hgrc_path, e) 244 245 extensions.loadall(self.ui) 246 if hasattr(extensions, 'extensions'): 247 for name, module in extensions.extensions(): 248 # setup extensions 249 extsetup = getattr(module, 'extsetup', None) 250 if extsetup: 251 if arity(extsetup) == 1: 252 extsetup(self.ui) 253 else: 254 extsetup() 255 256 # ISystemInfoProvider methods 257 258 def get_system_info(self): 259 if self._version is not None: 260 yield 'Mercurial', self._version 261 262 # IRepositoryConnector methods 263 264 def get_supported_types(self): 265 """Support for `repository_type = hg`""" 266 if hg_import_error: 267 self.error = hg_import_error 268 yield ("hg", -1) 269 else: 270 yield ("hg", 8) 271 272 def get_repository(self, type, dir, params): 273 """Return a `MercurialRepository`""" 240 274 options = {} 241 275 for key, val in self.config.options(type): … … 247 281 repos.version_info = self._version_info 248 282 return repos 249 250 283 251 284 # IWikiSyntaxProvider methods … … 293 326 294 327 class trac_ui(ui): 295 def __init__(self, log,*args, **kwargs):328 def __init__(self, *args, **kwargs): 296 329 ui.__init__(self, *args) 297 330 self.setconfig('ui', 'interactive', 'off') 298 self.log = log331 self.log = kwargs.get('log', args and args[0].log or None) 299 332 300 def write(self, *args ):333 def write(self, *args, **opts): 301 334 for a in args: 302 335 self.log.info('(mercurial status) %s', a) 303 336 304 def write_err(self, *args ):337 def write_err(self, *args, **opts): 305 338 for a in args: 306 339 self.log.warn('(mercurial warning) %s', a) 307 340 308 def isatty(self): 341 def plain(self): 342 return True 343 344 def interactive(self): 309 345 return False 310 346 … … 394 430 395 431 def normalize_path(self, path): 396 """Remove leading "/", except for the root """432 """Remove leading "/", except for the root.""" 397 433 return path and path.strip('/') or '' 398 434 399 435 def normalize_rev(self, rev): 400 """Return the changelog node for the specified rev"""436 """Return the full hash for the specified rev.""" 401 437 if rev is not None: 402 438 rev = str(rev) 403 return self.hg_display(self.hg_node(rev))439 return hex(self.hg_node(rev)) 404 440 405 441 def short_rev(self, rev): … … 416 452 return rev # it was already a short rev 417 453 return self.repo.changelog.rev(self.hg_node(rev)) 454 455 def display_rev(self, rev): 456 return self.hg_display(self.hg_node(rev)) 418 457 419 458 def get_quickjump_entries(self, rev): … … 519 558 520 559 def get_oldest_rev(self): 521 return self.hg_display(nullid)560 return hex(nullid) 522 561 523 562 def get_youngest_rev(self): 524 return self.hg_display(self.repo.changelog.tip())563 return hex(self.repo.changelog.tip()) 525 564 526 565 def previous_rev(self, rev, path=''): # FIXME: path ignored for now … … 529 568 for p in log.parents(n): 530 569 if p != nullid: 531 return self.hg_display(p) # always follow first parent570 return hex(p) # always follow first parent 532 571 533 572 def next_rev(self, rev, path=''): … … 537 576 if fc: # it is a file 538 577 for child_fc in fc.children(): 539 return self.hg_display(child_fc.node())578 return hex(child_fc.node()) 540 579 else: 541 580 return None … … 543 582 log = self.repo.changelog 544 583 for c in log.children(n): 545 return self.hg_display(c) # always follow first child584 return hex(c) # always follow first child 546 585 547 586 def rev_older_than(self, rev1, rev2): … … 699 738 node = log.tip() 700 739 else: 701 raise NoSuchNode(path, self.repos.hg_display(self.n))740 raise NoSuchNode(path, hex(self.n)) 702 741 self.time = self.repos.hg_time(log.read(node)[2]) 703 rev = self.repos.hg_display(node)742 rev = hex(node) 704 743 Node.__init__(self, self.repos, path, rev, kind) 705 744 self.created_path = path … … 795 834 count += 1 796 835 yield entry 797 entry = (path, self.repos.hg_display(ctx.node()), Changeset.EDIT)836 entry = (path, hex(ctx.node()), Changeset.EDIT) 798 837 if entry: 799 838 if count < limit: … … 827 866 yield entry 828 867 n = repo.changelog.node(rev) 829 entry = (path, self.repos.hg_display(n), Changeset.EDIT)868 entry = (path, hex(n), Changeset.EDIT) 830 869 if entry: 831 870 if count < limit: … … 879 918 extra = log_data[5] 880 919 time = repos.hg_time(timeinfo) 881 Changeset.__init__(self, repos, repos.hg_display(n), to_unicode(desc),920 Changeset.__init__(self, repos, hex(n), to_unicode(desc), 882 921 to_unicode(user), time) 883 922 self.repos = repos … … 885 924 self.manifest_n = manifest 886 925 self.files = files 887 self.parents = [repos.hg_display(p) for p in log.parents(n) \ 888 if p != nullid] 889 self.children = [repos.hg_display(c) for c in log.children(n)] 926 self.parents = [hex(p) for p in log.parents(n) if p != nullid] 927 self.children = [hex(c) for c in log.children(n)] 890 928 self.tags = [t for t in repos.repo.nodetags(n)] 891 929 self.branch = extra.pop("branch", None) … … 953 991 base_path, base_filenode = rename_info 954 992 base_ctx = repo.filectx(base_path, fileid=base_filenode) 955 base_rev = self.repos.hg_display(base_ctx.node())993 base_rev = hex(base_ctx.node()) 956 994 if base_path in deletions: 957 995 action = Changeset.MOVE … … 972 1010 yield change 973 1011 1012 def get_branches(self): 1013 """Yield branch names to which this changeset belong.""" 1014 return self.branch and [(self.branch, len(self.children) == 0)] or [] 1015
Note:
See TracChangeset
for help on using the changeset viewer.