git p4: gracefully fail if some commits could not be applied
[gitweb.git] / git-p4.py
index e67d37d2f93361337df6e680d2b2ab961e31ad66..2405f383e1907a2d36edcb018fd9a5c654c31b80 100755 (executable)
--- a/git-p4.py
+++ b/git-p4.py
@@ -1088,7 +1088,10 @@ def edit_template(self, template_file):
                 return False
 
     def applyCommit(self, id):
-        print "Applying %s" % (read_pipe("git log --max-count=1 --pretty=oneline %s" % id))
+        """Apply one commit, return True if it succeeded."""
+
+        print "Applying", read_pipe(["git", "show", "-s",
+                                     "--format=format:%h %s", id])
 
         (p4User, gitEmail) = self.p4UserForCommit(id)
 
@@ -1206,7 +1209,7 @@ def applyCommit(self, id):
                     p4_revert(f)
                 for f in filesToAdd:
                     os.remove(f)
-                return
+                return False
             elif response == "a":
                 os.system(applyPatchCmd)
                 if len(filesToAdd) > 0:
@@ -1312,6 +1315,7 @@ def applyCommit(self, id):
                 os.remove(f)
 
         os.remove(fileName)
+        return True  # success
 
     # Export git tags as p4 labels. Create a p4 label and then tag
     # with that.
@@ -1487,14 +1491,16 @@ def run(self, args):
         if gitConfig("git-p4.detectCopiesHarder", "--bool") == "true":
             self.diffOpts += " --find-copies-harder"
 
-        while len(commits) > 0:
-            commit = commits[0]
-            commits = commits[1:]
-            self.applyCommit(commit)
+        applied = []
+        for commit in commits:
+            ok = self.applyCommit(commit)
+            if ok:
+                applied.append(commit)
 
-        if len(commits) == 0:
-            print "All changes applied!"
-            chdir(self.oldWorkingDirectory)
+        chdir(self.oldWorkingDirectory)
+
+        if len(commits) == len(applied):
+            print "All commits applied!"
 
             sync = P4Sync()
             sync.run([])
@@ -1502,6 +1508,20 @@ def run(self, args):
             rebase = P4Rebase()
             rebase.rebase()
 
+        else:
+            if len(applied) == 0:
+                print "No commits applied."
+            else:
+                print "Applied only the commits marked with '*':"
+                for c in commits:
+                    if c in applied:
+                        star = "*"
+                    else:
+                        star = " "
+                    print star, read_pipe(["git", "show", "-s",
+                                           "--format=format:%h %s",  c])
+                print "You will have to do 'git p4 sync' and rebase."
+
         if gitConfig("git-p4.exportLabels", "--bool") == "true":
             self.exportLabels = True
 
@@ -1512,6 +1532,10 @@ def run(self, args):
             missingGitTags = gitTags - p4Labels
             self.exportGitTags(missingGitTags)
 
+        # exit with error unless everything applied perfecly
+        if len(commits) != len(applied):
+                sys.exit(1)
+
         return True
 
 class View(object):