From 9ab1cfe505d43215a61dc5012632dde66fe109db Mon Sep 17 00:00:00 2001 From: Luke Diamand Date: Thu, 27 Aug 2015 08:18:57 +0100 Subject: git-p4: do not terminate creating tag for unknown commit If p4 reports a tag for a commit that git-p4 does not know about (e.g. because it references a P4 changelist that was imported prior to the point at which the repo was cloned into git), make sure that the error is correctly caught and handled. rather than just crashing. Signed-off-by: Luke Diamand Signed-off-by: Junio C Hamano --- git-p4.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'git-p4.py') diff --git a/git-p4.py b/git-p4.py index 073f87bbfd..a62611a919 100755 --- a/git-p4.py +++ b/git-p4.py @@ -2494,9 +2494,9 @@ class P4Sync(Command, P4UserMap): # find the corresponding git commit; take the oldest commit changelist = int(change['change']) gitCommit = read_pipe(["git", "rev-list", "--max-count=1", - "--reverse", ":/\[git-p4:.*change = %d\]" % changelist]) + "--reverse", ":/\[git-p4:.*change = %d\]" % changelist], ignore_error=True) if len(gitCommit) == 0: - print "could not find git commit for changelist %d" % changelist + print "importing label %s: could not find git commit for changelist %d" % (name, changelist) else: gitCommit = gitCommit.strip() commitFound = True -- cgit v1.2.3 From b43702ac56e602d5163ef662fb9caf382da90b94 Mon Sep 17 00:00:00 2001 From: Luke Diamand Date: Thu, 27 Aug 2015 08:18:58 +0100 Subject: git-p4: fix P4 label import for unprocessed commits With --detect-labels enabled, git-p4 will try to create tags using git fast-import by writing a "tag" clause to the fast-import stream. If the commit that the tag references has not yet actually been processed by fast-import, then the tag can't be created and git-p4 fails to import the P4 label. Teach git-p4 to use fast-import "marks" when creating tags which reference commits created during the current run of the program. Commits created before the current run are still referenced in the old way using a normal git commit. Signed-off-by: Luke Diamand Signed-off-by: Junio C Hamano --- git-p4.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'git-p4.py') diff --git a/git-p4.py b/git-p4.py index a62611a919..2018011ae5 100755 --- a/git-p4.py +++ b/git-p4.py @@ -2322,8 +2322,11 @@ class P4Sync(Command, P4UserMap): else: return "%s " % userid - # Stream a p4 tag def streamTag(self, gitStream, labelName, labelDetails, commit, epoch): + """ Stream a p4 tag. + commit is either a git commit, or a fast-import mark, ":" + """ + if verbose: print "writing tag %s for commit %s" % (labelName, commit) gitStream.write("tag %s\n" % labelName) @@ -2374,7 +2377,7 @@ class P4Sync(Command, P4UserMap): self.clientSpecDirs.update_client_spec_path_cache(files) self.gitStream.write("commit %s\n" % branch) -# gitStream.write("mark :%s\n" % details["change"]) + self.gitStream.write("mark :%s\n" % details["change"]) self.committedChanges.add(int(details["change"])) committer = "" if author not in self.users: @@ -2493,13 +2496,19 @@ class P4Sync(Command, P4UserMap): if change.has_key('change'): # find the corresponding git commit; take the oldest commit changelist = int(change['change']) - gitCommit = read_pipe(["git", "rev-list", "--max-count=1", - "--reverse", ":/\[git-p4:.*change = %d\]" % changelist], ignore_error=True) - if len(gitCommit) == 0: - print "importing label %s: could not find git commit for changelist %d" % (name, changelist) - else: - gitCommit = gitCommit.strip() + if changelist in self.committedChanges: + gitCommit = ":%d" % changelist # use a fast-import mark commitFound = True + else: + gitCommit = read_pipe(["git", "rev-list", "--max-count=1", + "--reverse", ":/\[git-p4:.*change = %d\]" % changelist], ignore_error=True) + if len(gitCommit) == 0: + print "importing label %s: could not find git commit for changelist %d" % (name, changelist) + else: + commitFound = True + gitCommit = gitCommit.strip() + + if commitFound: # Convert from p4 time format try: tmwhen = time.strptime(labelDetails['Update'], "%Y/%m/%d %H:%M:%S") -- cgit v1.2.3