From: Eric S. Raymond Date: Thu, 13 Nov 2014 01:00:05 +0000 (-0500) Subject: Branch labels are almost reseolved. Checkpoint - regression test passes. X-Git-Tag: 0.6~6 X-Git-Url: http://thyrsus.com/gitweb/?a=commitdiff_plain;h=d2c4088cdf66da0de40774bf82ba886ff5d20c36;p=src.git Branch labels are almost reseolved. Checkpoint - regression test passes. --- diff --git a/src b/src index 8f3c776..751582c 100755 --- 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