]> thyrsus.com Git - src.git/commitdiff
Purify tag_helper.
authorEric S. Raymond <esr@thyrsus.com>
Mon, 10 Nov 2014 17:23:29 +0000 (12:23 -0500)
committerEric S. Raymond <esr@thyrsus.com>
Mon, 10 Nov 2014 17:23:29 +0000 (12:23 -0500)
src

diff --git a/src b/src
index fce15d362819626f61181d2be533238acb4edd7d..7b34d31bf1b158c1dfc2f96e0c78447f4bfe9c97 100755 (executable)
--- a/src
+++ b/src
@@ -601,7 +601,7 @@ def diff_method(*args):
         with backend.lifter(arg):
             backend.diff(diffspec1, diffspec2, diffopts, arg)
 
-def tag_helper(args, legend, delete_method, set_method):
+def tag_helper(args, legend, validation_hook, delete_method, set_method):
     "Dispatch to handlers for tag and branch manipulation."
     if not os.path.exists(repodir):
         croak("repository subdirectory %s does not exist" % repodir)
@@ -669,32 +669,37 @@ def tag_helper(args, legend, delete_method, set_method):
         croak("can't accept a range when setting a %s" % legend)
     for arg in ctx.args:
         metadata = History(arg)
-        # Semantics differs between tags and branches here
-        if legend == "tag":
-            ctx.resolve(metadata)
-            if name in metadata.symbols:
-                croak("%s %s already set." % (legend, name))
-            if ctx.is_empty():
-                ctx.start = metadata.tip().revno
-        elif legend == "branch":
-            if not ctx.is_empty():
-                croak("cannot accept a revision after a branch name")
-            if name not in metadata.symbols:
-                backend.create_branch(metadata.new_branchpoint(metadata_current()))
-        else:
-            croak("internal error - what is this thing called %s" % legend)
+        revision = validation_hook(ctx, metadata, name)
         with backend.lifter(arg):
-            set_method(name, metadata.revno_to_rcs(ctx.start), arg)
+            set_method(name, revision, arg)
             if not quiet and len(args) > 1:
                 announce("%s %s = %s in " % (legend, name, revno, arg))
 
 def tag_method(*args):
     "Inspect, create, and delete tags."
-    tag_helper(args, "tag", backend.delete_tag, backend.set_tag)
+    def tag_set_validate(ctx, metadata, name):
+        ctx.resolve(metadata)
+        if name in metadata.symbols:
+            croak("%s %s already set." % (legend, name))
+        if ctx.is_empty():
+            ctx.start = metadata.tip().revno
+        return metadata.revno_to_rcs(ctx.start)
+    tag_helper(args, "tag",
+               tag_set_validate,
+               backend.delete_tag, backend.set_tag)
 
 def branch_method(*args):
     "Inspect, create, and delete branches."
-    tag_helper(args, "branch", backend.delete_branch, backend.set_branch)
+    def branch_set_validate(ctx, metadata, name):
+        if not ctx.is_empty():
+            croak("cannot accept a revision after a branch name")
+        if name not in metadata.symbols:
+            with backend.lifter(arg):
+                backend.create_branch(metadata.new_branchpoint(metadata_current()))
+        return None    # Not ready yet
+    tag_helper(args, "branch",
+               branch_set_validate,
+               backend.delete_branch, backend.set_branch)
 
 def filecmd(legend, hook, args):
     ctx = CommandContext(legend, args, require_empty=True)