#
# old_revision [65cc6f5a3ee53454c0232be02a6d63ba5c973fdb]
#
# patch "tracmtn/backend.py"
#  from [d1ea39556f9842df75cb1502b4f227297ae35679]
#    to [3509a4ab43f67c6d8077f29e4cd86be8f25de7ea]
#
============================================================
--- tracmtn/backend.py	d1ea39556f9842df75cb1502b4f227297ae35679
+++ tracmtn/backend.py	3509a4ab43f67c6d8077f29e4cd86be8f25de7ea
@@ -133,6 +133,14 @@ class MonotoneConnector(Component):
         dir.
         """
         self.lock.acquire()
+
+        tok = path.split(':', 1)
+        if len(tok) == 2:
+            sel = tok[1]
+            path = tok[0]
+        else:
+            sel = None
+
         try:
             # note: we don't use type or authname, therefore we can always
             # return the same Repository object for the same database path
@@ -141,8 +149,10 @@ class MonotoneConnector(Component):
             except KeyError:
                 mtn = MTN(path, self.log, self.mtn_binary)
                 self.mtn_procs[path] = mtn
+
             repos = MonotoneRepository(
-                mtn, path, self.log, self.cachespec, self.get_revprops())
+                mtn, path, sel, self.log, self.cachespec, 
+                self.get_revprops())
 
             # this is the main entry point for users of this plugin, so let's set
             # version information here
@@ -210,22 +220,29 @@ if IPropertyRenderer:
 
         def match_property(self, name, mode):
             if mode == 'revprop' and name in ('Parents', 'Children',
-                                              'Branches', 'Tags'):
+                                              'Branches', 'Tags', 'Repository'):
                 return 4
             return 0
 
         def render_property(self, name, mode, context, props):
             fragments = []
-            repos = self.env.get_repository()
+            repos = props['Repository'][0]
+            if name == 'Repository':
+                return
             for val in props[name]:
                 if name in ('Branches', 'Tags'):
                     # don't create links here
                     fragments.append(tag(val))
                 else:
                     changeset = repos.get_changeset(val)
-                    fragments.append(tag.a(val, class_="changeset",
-                                     title=shorten_line(changeset.message),
-                                     href=context.href.changeset(val)))
+                    if repos.reponame:
+                        fragments.append(tag.a(val, class_="changeset",
+                                               title=shorten_line(changeset.message),
+                                               href=context.href.changeset(val + '/' + repos.reponame)))
+                    else:
+                        fragments.append(tag.a(val, class_="changeset",
+                                               title=shorten_line(changeset.message),
+                                               href=context.href.changeset(val)))
             return tag([tag(f, ', ') for f in fragments[:-1]], fragments[-1])
 
 
@@ -307,9 +324,12 @@ class MonotoneRepository(Repository):
     Represents a Monotone repository.
     """
 
-    def __init__(self, mtn, path, log, cachespec, revpropspec = None):
+    def __init__(self, mtn, path, sel, log, cachespec, revpropspec = None):
         Repository.__init__(self, 'mtn:%s' % path, None, log)
         self.mtn = CachedMTN(mtn, cachespec)
+        self.selector = sel
+        self.path = path
+        self.reponame = None
         self.revpropspec = revpropspec or {}
 
     def close(self):
@@ -329,7 +349,7 @@ class MonotoneRepository(Repository):
         Like get_changeset, but skips the revision normalization.
         """
         try:
-            return MonotoneChangeset(self.mtn, rev, self.revpropspec)
+            return MonotoneChangeset(self, self.mtn, rev, self.revpropspec)
         except AutomateException:
             raise NoSuchChangeset(rev)
 
@@ -337,8 +357,11 @@ class MonotoneRepository(Repository):
         """
         Generate Changesets belonging to the given time period (start, stop).
         """
-        for rev in self.mtn.select('l:%s/e:%s' %
-                (format_datetime(start), format_datetime(stop))):
+        selector = ('l:%s/e:%s' %
+                (format_datetime(start), format_datetime(stop)))
+        if self.selector != None:
+            selector += '/' + self.selector
+        for rev in self.mtn.select(selector):
             yield self._get_changeset(rev)
 
     def get_node(self, path, rev=None):
@@ -356,7 +379,7 @@ class MonotoneRepository(Repository):
         rev = self.normalize_rev(rev)
         path = self.normalize_path(path)
         try:
-            return MonotoneNode(self.mtn, rev, path)
+            return MonotoneNode(self, self.mtn, rev, path)
         except AutomateException:
             raise NoSuchChangeset(rev)
 
@@ -498,7 +521,7 @@ class MonotoneRepository(Repository):
         `rev` might be needed in order to retrieve the branches, but
         in general it's best to produce all known branches.
         """
-        return self.mtn.non_merged_branches()
+        return self.mtn.branches()
 
     def get_quickjump_entries(self, from_rev):
         """
@@ -540,7 +563,9 @@ class MonotoneNode(Node):
     revision.
     """
 
-    def __init__(self, mtn, rev, path, manifest = None):
+    def __init__(self, repos, mtn, rev, path, manifest = None):
+        self.repos = repos
+        self.selector = repos.selector
         self.mtn = mtn
         self.manifest = manifest or self.mtn.manifest(rev)
 
@@ -593,7 +618,7 @@ class MonotoneNode(Node):
             return get_parent(path) == self.path
 
         for path in filter(ischild, self.manifest.keys()): # IGNORE:W0141
-            yield MonotoneNode(self.mtn, self.rev, path, self.manifest)
+            yield MonotoneNode(self.repos, self.mtn, self.rev, path, self.manifest)
 
     def get_history(self, limit=None):
         """
@@ -604,9 +629,20 @@ class MonotoneNode(Node):
         first element of the tuple (i.e. the path) changing.  Starts
         with an entry for the current revision.
         """
-        # FIXME: this is only a stub
-        yield (self.path, self.rev, None)
+        # Use selector, if exists, otherwise just return all revisions for
+        # the (entire?!) repository.
 
+        if self.selector == None:
+            revs = self.mtn.all_revs()
+            topo = reversed(self.mtn.toposort(revs))
+            for i in topo:
+                yield (self.path, i, None)
+        else:
+            revs = self.mtn.select(self.selector)
+            topo = reversed(self.mtn.toposort(revs))
+            for i in topo:
+                yield (self.path, i, None)
+
     def get_properties(self):
         """
         Returns a dictionary containing the properties (meta-data) of
@@ -635,7 +671,8 @@ class MonotoneChangeset(Changeset):
     Represents the set of changes in one revision.
     """
     # changesets are retrieved via MonotoneRepository.get_changeset()
-    def __init__(self, mtn, rev, revpropspec = None):
+    def __init__(self, repos, mtn, rev, revpropspec = None):
+        self.repos = repos
         self.certs = mtn.certs(rev)
         self.messages = self.certs.get('changelog', ['-'])
         self.authors = self.certs.get('author', ['-'])
@@ -707,6 +744,7 @@ class MonotoneChangeset(Changeset):
             if self.tags:
                 properties['Tags'] = self.tags
             # FIXME: add user-defined revision properties
+            properties['Repository'] = (self.repos, self.rev)
             return properties
 
     else: # legacy
