More code cleanups and preparations for more branch detection heuristics.
authorSimon Hausmann <hausmann@kde.org>
Sat, 10 Mar 2007 10:46:26 +0000 (11:46 +0100)
committerSimon Hausmann <hausmann@kde.org>
Sat, 10 Mar 2007 10:46:26 +0000 (11:46 +0100)
Signed-off-by: Simon Hausmann <hausmann@kde.org>
contrib/fast-import/p4-fast-export.py

index bd2f03064b0e67ea4a8ce53326087f3fee1de376..65b7fca4b6571d4bfc231005a63a77ccb148347f 100755 (executable)
@@ -278,7 +278,7 @@ def findBranchParent(branchPrefix, files):
         for branch in knownBranches:
             if isSubPathOf(relPath, branch):
 #                print "determined parent branch branch %s due to change in file %s" % (branch, source)
-                return "refs/heads/%s" % branch
+                return branch
 #            else:
 #                print "%s is not a subpath of branch %s" % (relPath, branch)
 
@@ -350,6 +350,57 @@ def extractFilesInCommitToBranch(files, branchPrefix):
 
     return newFiles
 
+def findBranchSourceHeuristic(files, branch, branchPrefix):
+    for file in files:
+        action = file["action"]
+        if action != "integrate" and action != "branch":
+            continue
+        path = file["path"]
+        rev = file["rev"]
+        depotPath = path + "#" + rev
+
+        log = p4CmdList("filelog \"%s\"" % depotPath)
+        if len(log) != 1:
+            print "eek! I got confused by the filelog of %s" % depotPath
+            sys.exit(1);
+
+        log = log[0]
+        if log["action0"] != action:
+            print "eek! wrong action in filelog for %s : found %s, expected %s" % (depotPath, log["action0"], action)
+            sys.exit(1);
+
+        branchAction = log["how0,0"]
+
+        if not branchAction.endswith(" from"):
+            continue # ignore for branching
+#            print "eek! file %s was not branched from but instead: %s" % (depotPath, branchAction)
+#            sys.exit(1);
+
+        source = log["file0,0"]
+        if source.startswith(branchPrefix):
+            continue
+
+        lastSourceRev = log["erev0,0"]
+
+        sourceLog = p4CmdList("filelog -m 1 \"%s%s\"" % (source, lastSourceRev))
+        if len(sourceLog) != 1:
+            print "eek! I got confused by the source filelog of %s%s" % (source, lastSourceRev)
+            sys.exit(1);
+        sourceLog = sourceLog[0]
+
+        relPath = source[len(globalPrefix):]
+        # strip off the filename
+        relPath = relPath[0:relPath.rfind("/")]
+
+        for candidate in knownBranches:
+            if isSubPathOf(relPath, candidate) and candidate != branch:
+                return candidate
+
+    return ""
+
+def changeIsBranchMerge(sourceBranch, destinationBranch, change):
+    return False
+
 def getUserMap():
     users = {}
 
@@ -470,8 +521,16 @@ else:
 #                    elif len(parent) > 0:
 #                        print "%s branched off of %s" % (branch, parent)
 
+                if len(parent) == 0:
+                    parent = findBranchSourceHeuristic(filesForCommit, branch, branchPrefix)
+                    if len(parent) > 0:
+                        print "change %s could be a merge from %s into %s" % (description["change"], parent, branch)
+                        if not changeIsBranchMerge(parent, branch, description["change"]):
+                            parent = ""
 
                 branch = "refs/heads/" + branch
+                if len(parent) > 0:
+                    parent = "refs/heads/" + parent
                 commit(description, files, branch, branchPrefix, parent)
         else:
             commit(description, filesForCommit, branch, globalPrefix, initialParent)