diff options
author | Pete Wyckoff <pw@padd.com> | 2012-08-11 12:55:04 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-08-20 15:52:48 -0700 |
commit | 21ef5df4315b8f4f45bffb6af54d1ea338cb2cf5 (patch) | |
tree | 1761a6cd66bd60c81c8007a73c5f1dbe38bcc377 | |
parent | git p4: do wildcard decoding in stripRepoPath (diff) | |
download | tgif-21ef5df4315b8f4f45bffb6af54d1ea338cb2cf5.tar.xz |
git p4: make branch detection work with --use-client-spec
The bug report in http://stackoverflow.com/questions/11893688
observes that files are mapped into the wrong locations in
git when both --use-client-spec and --branch-detection are enabled.
Fix this by changing the relative path prefix to match discovered
branches when using a client spec.
The problem was likely introduced with ecb7cf9 (git-p4: rewrite view
handling, 2012-01-02).
Signed-off-by: Pete Wyckoff <pw@padd.com>
Tested-by: Matthew Korich <matthew@korich.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-x | git-p4.py | 37 | ||||
-rwxr-xr-x | t/t9801-git-p4-branch.sh | 2 |
2 files changed, 32 insertions, 7 deletions
@@ -1818,21 +1818,41 @@ class P4Sync(Command, P4UserMap): return files def stripRepoPath(self, path, prefixes): + """When streaming files, this is called to map a p4 depot path + to where it should go in git. The prefixes are either + self.depotPaths, or self.branchPrefixes in the case of + branch detection.""" + if self.useClientSpec: + # branch detection moves files up a level (the branch name) + # from what client spec interpretation gives path = self.clientSpecDirs.map_in_client(path) + if self.detectBranches: + for b in self.knownBranches: + if path.startswith(b + "/"): + path = path[len(b)+1:] + + elif self.keepRepoPath: + # Preserve everything in relative path name except leading + # //depot/; just look at first prefix as they all should + # be in the same depot. + depot = re.sub("^(//[^/]+/).*", r'\1', prefixes[0]) + if p4PathStartsWith(path, depot): + path = path[len(depot):] else: - if self.keepRepoPath: - prefixes = [re.sub("^(//[^/]+/).*", r'\1', prefixes[0])] - for p in prefixes: if p4PathStartsWith(path, p): path = path[len(p):] + break path = wildcard_decode(path) return path def splitFilesIntoBranches(self, commit): + """Look at each depotFile in the commit to figure out to what + branch it belongs.""" + branches = {} fnum = 0 while commit.has_key("depotFile%s" % fnum): @@ -1850,11 +1870,16 @@ class P4Sync(Command, P4UserMap): file["type"] = commit["type%s" % fnum] fnum = fnum + 1 - relPath = self.stripRepoPath(path, self.depotPaths) + # start with the full relative path where this file would + # go in a p4 client + if self.useClientSpec: + relPath = self.clientSpecDirs.map_in_client(path) + else: + relPath = self.stripRepoPath(path, self.depotPaths) for branch in self.knownBranches.keys(): - - # add a trailing slash so that a commit into qt/4.2foo doesn't end up in qt/4.2 + # add a trailing slash so that a commit into qt/4.2foo + # doesn't end up in qt/4.2, e.g. if relPath.startswith(branch + "/"): if branch not in branches: branches[branch] = [] diff --git a/t/t9801-git-p4-branch.sh b/t/t9801-git-p4-branch.sh index ca241ae834..9730821c30 100755 --- a/t/t9801-git-p4-branch.sh +++ b/t/t9801-git-p4-branch.sh @@ -438,7 +438,7 @@ test_expect_success 'use-client-spec detect-branches setup' ' ) ' -test_expect_failure 'use-client-spec detect-branches files in top-level' ' +test_expect_success 'use-client-spec detect-branches files in top-level' ' test_when_finished cleanup_git && test_create_repo "$git" && ( |