Ticket #13: tracmtn-65cc6f.patch

File tracmtn-65cc6f.patch, 7.5 KB (added by alien.technology+trac@…, 12 years ago)

Patch for TracMonotone, apply to revision 65cc6f5a3ee53454c0232be02a6d63ba5c973fdb

  • tracmtn/backend.py

    #
    # old_revision [65cc6f5a3ee53454c0232be02a6d63ba5c973fdb]
    #
    # patch "tracmtn/backend.py"
    #  from [d1ea39556f9842df75cb1502b4f227297ae35679]
    #    to [3509a4ab43f67c6d8077f29e4cd86be8f25de7ea]
    #
    ============================================================
    class MonotoneConnector(Component):  
    133133        dir.
    134134        """
    135135        self.lock.acquire()
     136
     137        tok = path.split(':', 1)
     138        if len(tok) == 2:
     139            sel = tok[1]
     140            path = tok[0]
     141        else:
     142            sel = None
     143
    136144        try:
    137145            # note: we don't use type or authname, therefore we can always
    138146            # return the same Repository object for the same database path
    class MonotoneConnector(Component):  
    141149            except KeyError:
    142150                mtn = MTN(path, self.log, self.mtn_binary)
    143151                self.mtn_procs[path] = mtn
     152
    144153            repos = MonotoneRepository(
    145                 mtn, path, self.log, self.cachespec, self.get_revprops())
     154                mtn, path, sel, self.log, self.cachespec,
     155                self.get_revprops())
    146156
    147157            # this is the main entry point for users of this plugin, so let's set
    148158            # version information here
    if IPropertyRenderer:  
    210220
    211221        def match_property(self, name, mode):
    212222            if mode == 'revprop' and name in ('Parents', 'Children',
    213                                               'Branches', 'Tags'):
     223                                              'Branches', 'Tags', 'Repository'):
    214224                return 4
    215225            return 0
    216226
    217227        def render_property(self, name, mode, context, props):
    218228            fragments = []
    219             repos = self.env.get_repository()
     229            repos = props['Repository'][0]
     230            if name == 'Repository':
     231                return
    220232            for val in props[name]:
    221233                if name in ('Branches', 'Tags'):
    222234                    # don't create links here
    223235                    fragments.append(tag(val))
    224236                else:
    225237                    changeset = repos.get_changeset(val)
    226                     fragments.append(tag.a(val, class_="changeset",
    227                                      title=shorten_line(changeset.message),
    228                                      href=context.href.changeset(val)))
     238                    if repos.reponame:
     239                        fragments.append(tag.a(val, class_="changeset",
     240                                               title=shorten_line(changeset.message),
     241                                               href=context.href.changeset(val + '/' + repos.reponame)))
     242                    else:
     243                        fragments.append(tag.a(val, class_="changeset",
     244                                               title=shorten_line(changeset.message),
     245                                               href=context.href.changeset(val)))
    229246            return tag([tag(f, ', ') for f in fragments[:-1]], fragments[-1])
    230247
    231248
    class MonotoneRepository(Repository):  
    307324    Represents a Monotone repository.
    308325    """
    309326
    310     def __init__(self, mtn, path, log, cachespec, revpropspec = None):
     327    def __init__(self, mtn, path, sel, log, cachespec, revpropspec = None):
    311328        Repository.__init__(self, 'mtn:%s' % path, None, log)
    312329        self.mtn = CachedMTN(mtn, cachespec)
     330        self.selector = sel
     331        self.path = path
     332        self.reponame = None
    313333        self.revpropspec = revpropspec or {}
    314334
    315335    def close(self):
    class MonotoneRepository(Repository):  
    329349        Like get_changeset, but skips the revision normalization.
    330350        """
    331351        try:
    332             return MonotoneChangeset(self.mtn, rev, self.revpropspec)
     352            return MonotoneChangeset(self, self.mtn, rev, self.revpropspec)
    333353        except AutomateException:
    334354            raise NoSuchChangeset(rev)
    335355
    class MonotoneRepository(Repository):  
    337357        """
    338358        Generate Changesets belonging to the given time period (start, stop).
    339359        """
    340         for rev in self.mtn.select('l:%s/e:%s' %
    341                 (format_datetime(start), format_datetime(stop))):
     360        selector = ('l:%s/e:%s' %
     361                (format_datetime(start), format_datetime(stop)))
     362        if self.selector != None:
     363            selector += '/' + self.selector
     364        for rev in self.mtn.select(selector):
    342365            yield self._get_changeset(rev)
    343366
    344367    def get_node(self, path, rev=None):
    class MonotoneRepository(Repository):  
    356379        rev = self.normalize_rev(rev)
    357380        path = self.normalize_path(path)
    358381        try:
    359             return MonotoneNode(self.mtn, rev, path)
     382            return MonotoneNode(self, self.mtn, rev, path)
    360383        except AutomateException:
    361384            raise NoSuchChangeset(rev)
    362385
    class MonotoneRepository(Repository):  
    498521        `rev` might be needed in order to retrieve the branches, but
    499522        in general it's best to produce all known branches.
    500523        """
    501         return self.mtn.non_merged_branches()
     524        return self.mtn.branches()
    502525
    503526    def get_quickjump_entries(self, from_rev):
    504527        """
    class MonotoneNode(Node):  
    540563    revision.
    541564    """
    542565
    543     def __init__(self, mtn, rev, path, manifest = None):
     566    def __init__(self, repos, mtn, rev, path, manifest = None):
     567        self.repos = repos
     568        self.selector = repos.selector
    544569        self.mtn = mtn
    545570        self.manifest = manifest or self.mtn.manifest(rev)
    546571
    class MonotoneNode(Node):  
    593618            return get_parent(path) == self.path
    594619
    595620        for path in filter(ischild, self.manifest.keys()): # IGNORE:W0141
    596             yield MonotoneNode(self.mtn, self.rev, path, self.manifest)
     621            yield MonotoneNode(self.repos, self.mtn, self.rev, path, self.manifest)
    597622
    598623    def get_history(self, limit=None):
    599624        """
    class MonotoneNode(Node):  
    604629        first element of the tuple (i.e. the path) changing.  Starts
    605630        with an entry for the current revision.
    606631        """
    607         # FIXME: this is only a stub
    608         yield (self.path, self.rev, None)
     632        # Use selector, if exists, otherwise just return all revisions for
     633        # the (entire?!) repository.
    609634
     635        if self.selector == None:
     636            revs = self.mtn.all_revs()
     637            topo = reversed(self.mtn.toposort(revs))
     638            for i in topo:
     639                yield (self.path, i, None)
     640        else:
     641            revs = self.mtn.select(self.selector)
     642            topo = reversed(self.mtn.toposort(revs))
     643            for i in topo:
     644                yield (self.path, i, None)
     645
    610646    def get_properties(self):
    611647        """
    612648        Returns a dictionary containing the properties (meta-data) of
    class MonotoneChangeset(Changeset):  
    635671    Represents the set of changes in one revision.
    636672    """
    637673    # changesets are retrieved via MonotoneRepository.get_changeset()
    638     def __init__(self, mtn, rev, revpropspec = None):
     674    def __init__(self, repos, mtn, rev, revpropspec = None):
     675        self.repos = repos
    639676        self.certs = mtn.certs(rev)
    640677        self.messages = self.certs.get('changelog', ['-'])
    641678        self.authors = self.certs.get('author', ['-'])
    class MonotoneChangeset(Changeset):  
    707744            if self.tags:
    708745                properties['Tags'] = self.tags
    709746            # FIXME: add user-defined revision properties
     747            properties['Repository'] = (self.repos, self.rev)
    710748            return properties
    711749
    712750    else: # legacy