diff options
author | Luke Diamand <luke@diamand.org> | 2015-08-27 08:18:58 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-08-28 12:02:58 -0700 |
commit | b43702ac56e602d5163ef662fb9caf382da90b94 (patch) | |
tree | 7a191b3f6d5ef25f03b5c00ea8de43c327d3dbbc | |
parent | git-p4: do not terminate creating tag for unknown commit (diff) | |
download | tgif-b43702ac56e602d5163ef662fb9caf382da90b94.tar.xz |
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 <luke@diamand.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-x | git-p4.py | 25 | ||||
-rwxr-xr-x | t/t9811-git-p4-label-import.sh | 2 |
2 files changed, 18 insertions, 9 deletions
@@ -2322,8 +2322,11 @@ class P4Sync(Command, P4UserMap): else: return "%s <a@b>" % 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, ":<p4commit>" + """ + 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") diff --git a/t/t9811-git-p4-label-import.sh b/t/t9811-git-p4-label-import.sh index 22d1fd3e3e..decb66ba30 100755 --- a/t/t9811-git-p4-label-import.sh +++ b/t/t9811-git-p4-label-import.sh @@ -222,7 +222,7 @@ p4_head_revision() { # has not been seen. The presence of a label on a commit # we haven't seen should not cause git-p4 to fail. It should # merely skip that label, and still import other labels. -test_expect_failure 'importing labels with missing revisions' ' +test_expect_success 'importing labels with missing revisions' ' test_when_finished cleanup_git && ( rm -fr "$cli" "$git" && |