Brand new smart incremental import that doesn't need tags or git repo-config :)
authorSimon Hausmann <simon@lst.de>
Thu, 22 Mar 2007 21:17:42 +0000 (22:17 +0100)
committerSimon Hausmann <simon@lst.de>
Thu, 22 Mar 2007 21:17:42 +0000 (22:17 +0100)
Signed-off-by: Simon Hausmann <simon@lst.de>
contrib/fast-import/git-p4
contrib/fast-import/git-p4.txt
index e6a34f4f478db2451de28687a55c9387d16c7c9d..8684e4b20f01e80797e472bada4fdc6a2925cdcf 100755 (executable)
@@ -84,7 +84,9 @@ def extractDepotPathAndChangeFromGitLog(log):
     return values.get("depot-path"), values.get("change")
 
 def gitBranchExists(branch):
     return values.get("depot-path"), values.get("change")
 
 def gitBranchExists(branch):
-    return os.system("git-rev-parse %s 2>/dev/null >/dev/null") == 0
+    if os.system("git-rev-parse %s 2>/dev/null >/dev/null" % branch) == 0:
+        return True
+    return False
 
 class Command:
     def __init__(self):
 
 class Command:
     def __init__(self):
@@ -706,17 +708,40 @@ class GitSync(Command):
             self.users[output["User"]] = output["FullName"] + " <" + output["Email"] + ">"
 
     def run(self, args):
             self.users[output["User"]] = output["FullName"] + " <" + output["Email"] + ">"
 
     def run(self, args):
+        self.globalPrefix = ""
+        self.changeRange = ""
+        self.initialParent = ""
+        self.tagLastChange = True
+
         if len(self.branch) == 0:
             self.branch = "p4"
         if len(self.branch) == 0:
             self.branch = "p4"
+            if len(args) == 0:
+                if not gitBranchExists(self.branch) and gitBranchExists("origin"):
+                    if not self.silent:
+                        print "Creating %s branch in git repository based on origin" % self.branch
+                    system("git branch %s origin" % self.branch)
+
+                [self.previousDepotPath, p4Change] = extractDepotPathAndChangeFromGitLog(extractLogMessageFromGitCommit(self.branch))
+                if len(self.previousDepotPath) > 0 and len(p4Change) > 0:
+                    p4Change = int(p4Change) + 1
+                    self.globalPrefix = self.previousDepotPath
+                    self.changeRange = "@%s,#head" % p4Change
+                    self.initialParent = self.branch
+                    self.tagLastChange = False
+                    if not self.silent:
+                        print "Performing incremental import into %s git branch" % self.branch
 
         self.branch = "refs/heads/" + self.branch
 
         self.branch = "refs/heads/" + self.branch
-        self.globalPrefix = self.previousDepotPath = os.popen("git-repo-config --get p4.depotpath").read()
+
+        if len(self.globalPrefix) == 0:
+            self.globalPrefix = self.previousDepotPath = os.popen("git-repo-config --get p4.depotpath").read()
+
         if len(self.globalPrefix) != 0:
             self.globalPrefix = self.globalPrefix[:-1]
 
         if len(args) == 0 and len(self.globalPrefix) != 0:
             if not self.silent:
         if len(self.globalPrefix) != 0:
             self.globalPrefix = self.globalPrefix[:-1]
 
         if len(args) == 0 and len(self.globalPrefix) != 0:
             if not self.silent:
-                print "[using previously specified depot path %s]" % self.globalPrefix
+                print "Depot path: %s" % self.globalPrefix
         elif len(args) != 1:
             return False
         else:
         elif len(args) != 1:
             return False
         else:
@@ -725,10 +750,8 @@ class GitSync(Command):
                 sys.exit(1)
             self.globalPrefix = args[0]
 
                 sys.exit(1)
             self.globalPrefix = args[0]
 
-        self.changeRange = ""
         self.revision = ""
         self.users = {}
         self.revision = ""
         self.users = {}
-        self.initialParent = ""
         self.lastChange = 0
         self.initialTag = ""
 
         self.lastChange = 0
         self.initialTag = ""
 
@@ -890,8 +913,9 @@ class GitSync(Command):
         if not self.silent:
             print ""
 
         if not self.silent:
             print ""
 
-        self.gitStream.write("reset refs/tags/p4/%s\n" % self.lastChange)
-        self.gitStream.write("from %s\n\n" % self.branch);
+        if self.tagLastChange:
+            self.gitStream.write("reset refs/tags/p4/%s\n" % self.lastChange)
+            self.gitStream.write("from %s\n\n" % self.branch);
 
 
         self.gitStream.close()
 
 
         self.gitStream.close()
index 0d30aff64cdc91fa48551dcee474493b48c2b498..4319c82dcd5d1da50f2f78cec578e012f020b4e7 100644 (file)
@@ -38,11 +38,9 @@ Incremental Imports
 After an initial import you can easily synchronize your git repository with
 newer changes from the Perforce depot by just calling
 
 After an initial import you can easily synchronize your git repository with
 newer changes from the Perforce depot by just calling
 
-  git-p4.p4 sync
+  git-p4 sync
 
 
-in your git repository. git-p4 stores the depot path of the original import in
-the .git/config file and remembers the last imported p4 revision as a git tag
-called p4/<changenum> .
+in your git repository.
 
 It is recommended to run 'git repack -a -d -f' from time to time when using
 incremental imports to optimally combine the individual git packs that each
 
 It is recommended to run 'git repack -a -d -f' from time to time when using
 incremental imports to optimally combine the individual git packs that each