git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 5/5] git p4: make branch detection work with --use-client-spec

From
PWPete Wyckoff <pw@padd.com>
Date
Aug 11, 2012, 16:55 UTC
Message-ID
<1344704104-17727-5-git-send-email-pw@padd.com>
In-Reply-To
<20120811165143.GA2004@padd.com>

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>
---
 git-p4.py                | 37 +++++++++++++++++++++++++++++++------
 t/t9801-git-p4-branch.sh |  2 +-
 2 files changed, 32 insertions(+), 7 deletions(-)
diff --git a/git-p4.py b/git-p4.py
index e20ff5d..aed1a2d 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -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 ca3a7f9..c5f0977 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" &&
 	(
-- 
1.7.12.rc2.24.gc304662
Previous: Pete WyckoffNext: Junio C Hamano
Message 7 of 10 in “git-p4 migrates perforce “main” branch into git branches as subdirectories (doubled code in git branches)”
  1. Matthew KorichAug 10, 2012
  2. 0/5 git p4: fix branch detection with --use-client-specPete Wyckoff, Aug 11, 2012
  3. 1/5 git p4 test: move client_view() function to libraryPete Wyckoff, Aug 11, 2012
  4. 2/5 git p4 test: add broken --use-client-spec --detect-branches testsPete Wyckoff, Aug 11, 2012
  5. 3/5 git p4: set self.branchPrefixes in initializationPete Wyckoff, Aug 11, 2012
  6. 4/5 git p4: do wildcard decoding in stripRepoPathPete Wyckoff, Aug 11, 2012
  7. 5/5 git p4: make branch detection work with --use-client-specPete Wyckoff, Aug 11, 2012
  8. Junio C HamanoAug 12, 2012
  9. Pete WyckoffAug 12, 2012
  10. Junio C HamanoAug 12, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.