Ignore:
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  
    77try:
    88    import babel
     9
    910    extra['message_extractors'] = {
    1011        'tracext': [
     
    1213        ],
    1314    }
     15
     16    from trac.util.dist import get_l10n_cmdclass
     17    extra['cmdclass'] = get_l10n_cmdclass()
     18
    1419except ImportError:
    1520    pass
     
    1823
    1924setup(name='TracMercurial',
    20       install_requires='Trac >=0.12multirepos',
     25      install_requires='Trac >=0.12dev-r9125',
    2126      description='Mercurial plugin for Trac multirepos branch',
    2227      keywords='trac scm plugin mercurial hg',
    23       version='0.12.0.21',
     28      version='0.12.0.23',
    2429      url=TracMercurial,
    2530      license='GPL',
  • plugins/0.12/mercurial-plugin/tracext/hg/backend.py

    r9128 r9953  
    2222from trac.core import *
    2323from trac.config import _TRUE_VALUES as TRUE
     24from trac.env import ISystemInfoProvider
    2425from trac.util import arity
    2526from trac.util.datefmt import utc
    2627from trac.util.text import shorten_line, to_unicode
    2728from trac.versioncontrol.api import Changeset, Node, Repository, \
    28                                     IRepositoryConnector, \
     29                                    IRepositoryConnector, RepositoryManager, \
    2930                                    NoSuchChangeset, NoSuchNode
    3031from trac.versioncontrol.web_ui import IPropertyRenderer, RenderedProperty
     
    3334try:
    3435    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'))
    3739except ImportError:
    3840    from trac.util.translation import _, tag_, N_, gettext
     
    103105    def _render_property(self, name, mode, context, props):
    104106        repos, revs = props[name]
     107       
     108        if name in ('Parents', 'Children'):
     109            label = repos.display_rev
     110        else:
     111            label = lambda rev: rev
     112       
    105113        def link(rev):
    106114            chgset = repos.get_changeset(rev)
    107             return tag.a(rev, class_="changeset",
     115            return tag.a(label(rev), class_="changeset",
    108116                         title=shorten_line(chgset.message),
    109117                         href=context.href.changeset(rev, repos.reponame))
     118       
    110119        if name == 'Parents' and len(revs) == 2: # merge
    111120            new = context.resource.id
     
    135144                   link(revs[-1]))
    136145
     146
    137147class HgExtPropertyRenderer(Component):
    138148    implements(IPropertyRenderer)
    139149
    140150    def match_property(self, name, mode):
    141        return name in ('transplant_source') and \
     151       return name in ('transplant_source', 'convert_revision') and \
    142152                mode == 'revprop' and 4 or 0
    143153   
     
    147157            try:
    148158                chgset = MercurialChangeset(repos, value)
    149                 link = tag.a(chgset.rev, class_="changeset",
     159                link = tag.a(repos.display_rev(chgset.rev), class_="changeset",
    150160                             title=shorten_line(chgset.message),
    151                              href=context.href.changeset(short(value),
     161                             href=context.href.changeset(hex(value),
    152162                                                         repos.reponame))
    153163            except LookupError:
     
    156166            return RenderedProperty(name=_("Transplant:"), content=link,
    157167                                    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
    158186
    159187class HgDefaultPropertyRenderer(Component):
     
    176204class MercurialConnector(Component):
    177205
    178     implements(IRepositoryConnector, IWikiSyntaxProvider)
     206    implements(ISystemInfoProvider, IRepositoryConnector, IWikiSyntaxProvider)
    179207
    180208    def __init__(self):
    181         self._version = self._version_info = None
    182209        self.ui = None
    183210        locale_dir = pkg_resources.resource_filename(__name__, 'locale')
    184211        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:
    227214            try:
    228215                from mercurial.version import get_version
     
    237224            if m:
    238225                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`"""
    240274        options = {}
    241275        for key, val in self.config.options(type):
     
    247281        repos.version_info = self._version_info
    248282        return repos
    249 
    250283
    251284    # IWikiSyntaxProvider methods
     
    293326       
    294327class trac_ui(ui):
    295     def __init__(self, log, *args, **kwargs):
     328    def __init__(self, *args, **kwargs):
    296329        ui.__init__(self, *args)
    297330        self.setconfig('ui', 'interactive', 'off')
    298         self.log = log
     331        self.log = kwargs.get('log', args and args[0].log or None)
    299332       
    300     def write(self, *args):
     333    def write(self, *args, **opts):
    301334        for a in args:
    302335            self.log.info('(mercurial status) %s', a)
    303336
    304     def write_err(self, *args):
     337    def write_err(self, *args, **opts):
    305338        for a in args:
    306339            self.log.warn('(mercurial warning) %s', a)
    307340
    308     def isatty(self):
     341    def plain(self):
     342        return True
     343
     344    def interactive(self):
    309345        return False
    310346
     
    394430
    395431    def normalize_path(self, path):
    396         """Remove leading "/", except for the root"""
     432        """Remove leading "/", except for the root."""
    397433        return path and path.strip('/') or ''
    398434
    399435    def normalize_rev(self, rev):
    400         """Return the changelog node for the specified rev"""
     436        """Return the full hash for the specified rev."""
    401437        if rev is not None:
    402438            rev = str(rev)
    403         return self.hg_display(self.hg_node(rev))
     439        return hex(self.hg_node(rev))
    404440
    405441    def short_rev(self, rev):
     
    416452                return rev # it was already a short rev
    417453        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))
    418457
    419458    def get_quickjump_entries(self, rev):
     
    519558
    520559    def get_oldest_rev(self):
    521         return self.hg_display(nullid)
     560        return hex(nullid)
    522561
    523562    def get_youngest_rev(self):
    524         return self.hg_display(self.repo.changelog.tip())
     563        return hex(self.repo.changelog.tip())
    525564
    526565    def previous_rev(self, rev, path=''): # FIXME: path ignored for now
     
    529568        for p in log.parents(n):
    530569            if p != nullid:
    531                 return self.hg_display(p) # always follow first parent
     570                return hex(p) # always follow first parent
    532571   
    533572    def next_rev(self, rev, path=''):
     
    537576            if fc: # it is a file
    538577                for child_fc in fc.children():
    539                     return self.hg_display(child_fc.node())
     578                    return hex(child_fc.node())
    540579                else:
    541580                    return None
     
    543582        log = self.repo.changelog
    544583        for c in log.children(n):
    545             return self.hg_display(c) # always follow first child
     584            return hex(c) # always follow first child
    546585   
    547586    def rev_older_than(self, rev1, rev2):
     
    699738                node = log.tip()
    700739            else:
    701                 raise NoSuchNode(path, self.repos.hg_display(self.n))
     740                raise NoSuchNode(path, hex(self.n))
    702741        self.time = self.repos.hg_time(log.read(node)[2])
    703         rev = self.repos.hg_display(node)
     742        rev = hex(node)
    704743        Node.__init__(self, self.repos, path, rev, kind)
    705744        self.created_path = path
     
    795834                count += 1
    796835                yield entry
    797             entry = (path, self.repos.hg_display(ctx.node()), Changeset.EDIT)
     836            entry = (path, hex(ctx.node()), Changeset.EDIT)
    798837        if entry:
    799838            if count < limit:
     
    827866                    yield entry
    828867                n = repo.changelog.node(rev)
    829                 entry = (path, self.repos.hg_display(n), Changeset.EDIT)
     868                entry = (path, hex(n), Changeset.EDIT)
    830869        if entry:
    831870            if count < limit:
     
    879918            extra = log_data[5]
    880919        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),
    882921                           to_unicode(user), time)
    883922        self.repos = repos
     
    885924        self.manifest_n = manifest
    886925        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)]
    890928        self.tags = [t for t in repos.repo.nodetags(n)]
    891929        self.branch = extra.pop("branch", None)
     
    953991                    base_path, base_filenode = rename_info
    954992                    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())
    956994                    if base_path in deletions:
    957995                        action = Changeset.MOVE
     
    9721010            yield change
    9731011
     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.