Re: [PATCH] git p4: chdir resolves symlinks only for relative paths
- From
- Pete Wyckoff <pw@padd.com>
- Date
- Feb 3, 2013, 23:08 UTC
- Message-ID
- <20130203230803.GA25555@padd.com>
- In-Reply-To
- <CAAMmcSSEzs3+vZDO=FDMV9c2rp-8HTdMuPeeQCkok6y7sRDYJw@mail.gmail.com>
mfazekas@szemafor.com wrote on Tue, 29 Jan 2013 09:37 +0100:
Show 32 quoted lines
> If a p4 client is configured to /p/foo which is a symlink > to /vol/bar/projects/foo, then resolving symlink, which > is done by git-p4's chdir will confuse p4: "Path > /vol/bar/projects/foo/... is not under client root /p/foo" > While AltRoots in p4 client specification can be used as a > workaround on p4 side, git-p4 should not resolve symlinks > in client paths. > chdir(dir) uses os.getcwd() after os.chdir(dir) to resolve > relative paths, but as a side effect it resolves symlinks > too. Now it checks if the dir is relative before resolving. > > Signed-off-by: Miklós Fazekas <mfazekas@szemafor.com> > --- > git-p4.py | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/git-p4.py b/git-p4.py > index 2da5649..5d74649 100755 > --- a/git-p4.py > +++ b/git-p4.py > @@ -64,7 +64,10 @@ def chdir(dir): > # not using the shell, we have to set it ourselves. This path could > # be relative, so go there first, then figure out where we ended up. > os.chdir(dir) > - os.environ['PWD'] = os.getcwd() > + if os.path.isabs(dir): > + os.environ['PWD'] = dir > + else: > + os.environ['PWD'] = os.getcwd() > > def die(msg): > if verbose:
Thanks, this is indeed a bug and I have reproduced it with a test case. Your patch works, but I think it would be better to separate the callers of chdir(): those that know they are cd-ing to a path from a p4 client, and everybody else. The former should not use os.getcwd(), as you show.
I'll whip something up soon, unless you beat me to it.
-- Pete