]> thyrsus.com Git - src.git/commitdiff
Refactor delete methods. Regression test passes.
authorEric S. Raymond <esr@thyrsus.com>
Sat, 15 Nov 2014 14:27:03 +0000 (09:27 -0500)
committerEric S. Raymond <esr@thyrsus.com>
Sat, 15 Nov 2014 14:27:03 +0000 (09:27 -0500)
src

diff --git a/src b/src
index 07442a09a2a71600474752892f5a248b1c3697c5..6dacd5b4e9528a9be26bbcc5ccc546742dcd0a66 100755 (executable)
--- a/src
+++ b/src
@@ -1010,7 +1010,7 @@ def tag_helper(args, legend, validation_hook, delete_method, set_method):
                     croak("in %s, %s is not a %s" % (arg, name, legend))
                 else:
                     with backend.lifter(arg):
-                        delete_method(name, arg)
+                        delete_method(name, metadata)
                     if not quiet and len(args) > 1:
                         announce("in %s, %s %s removed" % (arg, legend, name))
                 return
@@ -1066,7 +1066,7 @@ def tag_helper(args, legend, validation_hook, delete_method, set_method):
                 # tag reference.
                 with backend.lifter(arg):
                     backend.set_tag(newname, metadata.symbols[name], metadata)
-                    backend.delete_tag(name, arg)
+                    backend.delete_tag(name, metadata)
                 if not quiet and len(args) > 1:
                     announce("in %s, %s -> %s" % (arg, name, newname))
             return
@@ -1377,13 +1377,13 @@ class RCS:
         if fn:
             arg += " >" + fn
         do_or_die("co -q -p -r{1} {0}".format(arg, revision), loud=True)
-    def delete_tag(self, tagname, arg):
+    def delete_tag(self, tagname, metadata):
         "Delete a specified tag."
-        do_or_die("rcs -n{0} {1}".format(tagname, arg))
+        do_or_die("rcs -n{0} {1}".format(tagname, metadata.name))
     def set_tag(self, tagname, revision, metadata):
         "Set a specified tag."
         do_or_die("rcs -n{0}:{1} {2}".format(tagname, revision, metadata.name))
-    def delete_branch(self, branchname, arg):
+    def delete_branch(self, branchname, metadata):
         "Delete a specified branch."
         # From rcs(1): -orange deletes ("outdates") the revisions
         # given by range.  A range consisting of a single revision
@@ -1398,8 +1398,14 @@ class RCS:
         # What we need do is find the branch tip, then walk back to
         # just after the first point where it joins another branch,
         # then do a delete to end of branch from there.
-        croak("branch deletion is not yet supported")
-        #do_or_die("rcs -o{0}: {1}".format(revision, arg)
+        base = metadata.branch_to_tip(branchname)
+        while True:
+            if base is not None and metadata.by_native_d[base].branches:
+                break
+            else:
+                base = self.pred(base)
+        do_or_die("rcs -o{0}: {1}".format(self.succ(base), arg))
+        self.delete_tag(branchname, metadata.name)
     def set_branch(self, name, revision, metadata):
         "Set the specified branch to be default, creating it if required."
         if name in metadata.symbols: