Code

Added a rollback command for debugging. It sets back the heads of the p4 branches...
authorSimon Hausmann <shausman@trolltech.com>
Mon, 21 May 2007 20:57:06 +0000 (22:57 +0200)
committerSimon Hausmann <shausman@trolltech.com>
Mon, 21 May 2007 20:57:06 +0000 (22:57 +0200)
Signed-off-by: Simon Hausmann <shausman@trolltech.com>
contrib/fast-import/git-p4

index b32d8dbfd3c4816baec9cbcfdceb71155b77ac01..40264cdc18187719d0d751977ebce0936583f8d9 100755 (executable)
@@ -7,10 +7,7 @@
 #            2007 Trolltech ASA
 # License: MIT <http://www.opensource.org/licenses/mit-license.php>
 #
-# TODO: * implement git-p4 rollback <perforce change number> for debugging
-#         to roll back all p4 remote branches to a commit older or equal to
-#         the specified change.
-#       * Consider making --with-origin the default, assuming that the git
+# TODO: * Consider making --with-origin the default, assuming that the git
 #         protocol is always more efficient. (needs manual testing first :)
 #
 
@@ -135,6 +132,35 @@ class P4Debug(Command):
             print output
         return True
 
+class P4RollBack(Command):
+    def __init__(self):
+        Command.__init__(self)
+        self.options = [
+        ]
+        self.description = "A tool to debug the multi-branch import. Don't use :)"
+
+    def run(self, args):
+        if len(args) != 1:
+            return False
+        maxChange = int(args[0])
+        for line in mypopen("git rev-parse --symbolic --remotes").readlines():
+            if line.startswith("p4/") and line != "p4/HEAD\n":
+                ref = "refs/remotes/" + line[:-1]
+                log = extractLogMessageFromGitCommit(ref)
+                depotPath, change = extractDepotPathAndChangeFromGitLog(log)
+                changed = False
+                while len(change) > 0 and int(change) > maxChange:
+                    changed = True
+                    print "%s is at %s ; rewinding towards %s" % (ref, change, maxChange)
+                    system("git update-ref %s \"%s^\"" % (ref, ref))
+                    log = extractLogMessageFromGitCommit(ref)
+                    depotPath, change = extractDepotPathAndChangeFromGitLog(log)
+
+                if changed:
+                    print "%s is at %s" % (ref, change)
+
+        return True
+
 class P4Submit(Command):
     def __init__(self):
         Command.__init__(self)
@@ -1109,7 +1135,8 @@ commands = {
     "submit" : P4Submit(),
     "sync" : P4Sync(),
     "rebase" : P4Rebase(),
-    "clone" : P4Clone()
+    "clone" : P4Clone(),
+    "rollback" : P4RollBack()
 }
 
 if len(sys.argv[1:]) == 0: