On 27 February 2018 at 19:00, Nuno Subtil <subtil@xxxxxxxxx> wrote: > I originally thought this had been designed such that the p4 client spec > determines the paths, which would make sense. However, git-p4 still ignores > the local path mappings in the client spec when syncing p4 depot paths > w/--use-client-spec. Effectively, it looks as though --use-client-spec > always implies --keep-paths, which didn't seem to me like what was intended. > > For the use case I'm dealing with (syncing a p4 path but ignoring some > directories inside it), there seems to be no way today to generate a git > tree rooted at the p4 path location instead of the root of the depot, which > looks like a bug to me. I don't really understand the overall design well > enough to tell whether the bug lies in stripRepoPath or somewhere else, to > be honest, but that's where I saw the inconsistency manifest itself. I replied but managed to drop git-users off the thread. So trying again! The behavior is a touch surprising, but I _think_ it's correct. With --use-client-spec enabled, paths in the git repot get mapped as if you had used the file mapping in the client spec, using "p4 where". So, for example, if you have a client spec which looks like: //depot/... //my_client_spec/... then you're going to get the full repo structure, even if you only clone a subdirectory. e.g. if you clone //depot/a/b/c then with "--use-client-spec" enabled, you will get a/b/c in your git repo, and with it not enabled, you will just get c/. If instead your client spec looks like: //depot/a/b/... //my_client_spec/... then you should only get c/d. (And a quick test confirms that). I think Nuno's original question comes from wanting to map some files into place which the clientspec mapping emulation in git-p4 was possibly not handling - if we can get a test case for that (or an example) then we can see if it's just that the client mapping code that Pete put in is insufficient, or if there's some other way around. Or if indeed I'm wrong, and there's a bug! There may be some weird corner-cases where it might do the wrong thing. Thanks, Luke > > Nuno > > > On Tue, Feb 27, 2018 at 3:12 AM, Luke Diamand <luke@xxxxxxxxxxx> wrote: >> >> On 27 February 2018 at 08:43, Nuno Subtil <subtil@xxxxxxxxx> wrote: >> > The issue is that passing in --use-client-spec will always cause git-p4 >> > to >> > preserve the full depot path in the working tree that it creates, even >> > when >> > --keep-path is not used. >> > >> > The repro case is fairly simple: cloning a given p4 path that is nested >> > 2 or >> > more levels below the depot root will have different results with and >> > without --use-client-spec (even when the client spec is just a >> > straightforward map of the entire depot). >> > >> > E.g., 'git p4 clone //p4depot/path/to/some/project/...' will create a >> > working tree rooted at project. However, 'git p4 clone --use-client-spec >> > //p4depot/path/to/some/project/...' will create a working tree rooted at >> > the >> > root of the depot. >> >> I think it _might_ be by design. >> >> At least, the test ./t9809-git-p4-client-view.sh seems to fail for me >> with your change, although I haven't investigated what's going on: >> >> $ ./t9809-git-p4-client-view.sh >> ... >> ... >> Doing initial import of //depot/dir1/ from revision #head into >> refs/remotes/p4/master >> ./t9809-git-p4-client-view.sh: 10: eval: cannot create dir1/file13: >> Directory nonexistent >> not ok 23 - subdir clone, submit add >> >> I think originally the logic came from this change: >> >> 21ef5df43 git p4: make branch detection work with --use-client-spec >> >> which was fixing what seems like the same problem but with branch >> detection enabled. >> >> >> > >> > Thanks, >> > Nuno >> > >> > >> > On Tue, Feb 27, 2018 at 12:10 AM, Luke Diamand <luke@xxxxxxxxxxx> wrote: >> >> >> >> On 27 February 2018 at 04:16, Nuno Subtil <subtil@xxxxxxxxx> wrote: >> >> > When useClientSpec=true, stripping of P4 depot paths doesn't happen >> >> > correctly on sync. Modifies stripRepoPath to handle this case better. >> >> >> >> Can you give an example of how this shows up? I could quickly write a >> >> test case for this if I knew what was going on. >> >> >> >> Thanks >> >> Luke >> >> >> >> >> >> > >> >> > Signed-off-by: Nuno Subtil <subtil@xxxxxxxxx> >> >> > --- >> >> > git-p4.py | 12 +++++++++--- >> >> > 1 file changed, 9 insertions(+), 3 deletions(-) >> >> > >> >> > diff --git a/git-p4.py b/git-p4.py >> >> > index 7bb9cadc69738..3df95d0fd1d83 100755 >> >> > --- a/git-p4.py >> >> > +++ b/git-p4.py >> >> > @@ -2480,7 +2480,7 @@ def stripRepoPath(self, path, prefixes): >> >> > if path.startswith(b + "/"): >> >> > path = path[len(b)+1:] >> >> > >> >> > - elif self.keepRepoPath: >> >> > + if 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. >> >> > @@ -2490,6 +2490,12 @@ def stripRepoPath(self, path, prefixes): >> >> > >> >> > else: >> >> > for p in prefixes: >> >> > + if self.useClientSpec and not self.keepRepoPath: >> >> > + # when useClientSpec is false, the prefix will >> >> > contain the depot name but the path will not >> >> > + # extract the depot name and add it to the path >> >> > so >> >> > the match below will do the right thing >> >> > + depot = re.sub("^(//[^/]+/).*", r'\1', p) >> >> > + path = depot + path >> >> > + >> >> > if p4PathStartsWith(path, p): >> >> > path = path[len(p):] >> >> > break >> >> > @@ -2526,8 +2532,8 @@ def splitFilesIntoBranches(self, commit): >> >> > # go in a p4 client >> >> > if self.useClientSpec: >> >> > relPath = self.clientSpecDirs.map_in_client(path) >> >> > - else: >> >> > - relPath = self.stripRepoPath(path, self.depotPaths) >> >> > + >> >> > + relPath = self.stripRepoPath(path, self.depotPaths) >> >> > >> >> > for branch in self.knownBranches.keys(): >> >> > # add a trailing slash so that a commit into >> >> > qt/4.2foo >> >> > >> >> > -- >> >> > https://github.com/git/git/pull/463 >> > >> > > >