]> thyrsus.com Git - src.git/commitdiff
Branch labels are almost reseolved. Checkpoint - regression test passes.
authorEric S. Raymond <esr@thyrsus.com>
Thu, 13 Nov 2014 01:00:05 +0000 (20:00 -0500)
committerEric S. Raymond <esr@thyrsus.com>
Thu, 13 Nov 2014 01:00:05 +0000 (20:00 -0500)
src

diff --git a/src b/src
index 8f3c7766f1156769e6a7ea909877ad06f743b9ec..751582cafdedc9630caa055bc8a2c953f5da5494 100755 (executable)
--- a/src
+++ b/src
@@ -440,7 +440,7 @@ class CommandContext:
     def resolve(self, metadata, reversed=True):
         "Resolve a revision spec that may contain tags into revnos."
         if debug >= DEBUG_SEQUENCE:
-            sys.stderr.write("Entering do_resolve with start=%s, end=%s\n" % (self.start, self.end))
+            sys.stderr.write("Entering resolve with start=%s, end=%s\n" % (self.start, self.end))
         if self.is_empty():
             if self.default_to == "branch":
                 self.seq = metadata.current_branch(reversed=False)
@@ -449,16 +449,20 @@ class CommandContext:
             else:
                 self.seq = []
             return self.seq
-        if type(self.start) == type(""):
-            if self.start in metadata.symbols:
-                self.start =  metadata.native_to_revno(metadata.symbols[self.start])
+        def subresolve(token):
+            part = token
+            if type(part) == type(0):
+                return part
+            if part not in metadata.symbols:
+                croak("in {0}, can't resolve symbol {0}".format(metadata.name,token))
             else:
-                croak("can't resolve symbol {0} in {1}".format(self.start,metadata.name))
-        if type(self.end) == type(""):
-            if self.end in metadata.symbols:
-                self.end = metadata.native_to_revno(metadata.symbols[self.end])
-            else:
-                croak("can't resolve symbol {0} in {1}".format(self.end, metadata.name))
+                part = metadata.symbols[part]
+            if metadata.isbranch(part):
+                part = backend.branch_to_tip(part)
+            return metadata.native_to_revno(part)
+            croak("internal error: in %s, failed to resolve %s" % (metadata.name, token))         
+        self.start = subresolve(self.start)
+        self.end = subresolve(self.end)
         if self.end > len(metadata):
             croak("{0} has no {1} revision".format(metadata.name, self.end))
         if not self.branchwise:
@@ -755,6 +759,9 @@ def tag_helper(args, legend, validation_hook, delete_method, set_method):
                 for key in keys:
                     value = metadata.symbols[key]
                     if legend == "branch":
+                        # Note! This code relies on backend.branch_to_base()
+                        # returning an empty string when called on a trunk
+                        # revision.
                         display = backend.branch_to_base(value)
                         if not display:
                             display = 0
@@ -1047,7 +1054,11 @@ class RCS:
         return self.joinrev(n)
     def branch_to_base(self, revid):
         "Go from a branch ID sticky tag to the revision it was based on."
+        # Must return an emptry string for the fake root sticky tag.
         return self.joinrev(self.splitrev(revid)[:-2])
+    def branch_to_tip(self, revid):
+        "Go from a branch ID sticky tag to the tip revision of its base."
+        croak("branch_to_tip() is not yet implemented")
     def add(self, arg):
         "Register a file"
         # Key choices here: -b suppresses all keyword expansion, -U sets