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

[PATCH 3/3] git p4: avoid expanding client paths in chdir

From
PWPete Wyckoff <pw@padd.com>
Date
Mar 7, 2013, 23:19 UTC
Message-ID
<1362698357-7334-4-git-send-email-pw@padd.com>
In-Reply-To
<1362698357-7334-1-git-send-email-pw@padd.com>
From: Miklós Fazekas <mfazekas@szemafor.com>

The generic chdir() helper sets the PWD environment variable, as that is what is used by p4 to know its current working directory. Normally the shell would do this, but in git-p4, we must do it by hand.

However, when the path contains a symbolic link, os.getcwd() will return the physical location. If the p4 client specification includes symlinks, setting PWD to the physical location causes p4 to think it is not inside the client workspace. It complains, e.g.

    Path /vol/bar/projects/foo/... is not under client root /p/foo

One workaround is to use AltRoots in the p4 client specification, but it is cleaner to handle it directly in git-p4.

Other uses of chdir still require setting PWD to an absolute path so p4 features like P4CONFIG work. See bf1d68f (git-p4: use absolute directory for PWD env var, 2011-12-09).

[ pw: tweak patch and commit message ]
Thanks-to: John Keeping <john@keeping.me.uk>
Signed-off-by: Pete Wyckoff <pw@padd.com>
---
 git-p4.py               | 29 ++++++++++++++++++++++-------
 t/t9808-git-p4-chdir.sh |  2 +-
 2 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/git-p4.py b/git-p4.py
index 647f110..7288c0b 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -79,12 +79,27 @@ def p4_build_cmd(cmd):
         real_cmd += cmd
     return real_cmd
 
-def chdir(dir):
-    # P4 uses the PWD environment variable rather than getcwd(). Since we're
-    # 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()
+def chdir(path, is_client_path=False):
+    """Do chdir to the given path, and set the PWD environment
+       variable for use by P4.  It does not look at getcwd() output.
+       Since we're not using the shell, it is necessary to set the
+       PWD environment variable explicitly.
+       
+       Normally, expand the path to force it to be absolute.  This
+       addresses the use of relative path names inside P4 settings,
+       e.g. P4CONFIG=.p4config.  P4 does not simply open the filename
+       as given; it looks for .p4config using PWD.
+
+       If is_client_path, the path was handed to us directly by p4,
+       and may be a symbolic link.  Do not call os.getcwd() in this
+       case, because it will cause p4 to think that PWD is not inside
+       the client path.
+       """
+
+    os.chdir(path)
+    if not is_client_path:
+        path = os.getcwd()
+    os.environ['PWD'] = path
 
 def die(msg):
     if verbose:
@@ -1624,7 +1639,7 @@ class P4Submit(Command, P4UserMap):
             new_client_dir = True
             os.makedirs(self.clientPath)
 
-        chdir(self.clientPath)
+        chdir(self.clientPath, is_client_path=True)
         if self.dry_run:
             print "Would synchronize p4 checkout in %s" % self.clientPath
         else:
diff --git a/t/t9808-git-p4-chdir.sh b/t/t9808-git-p4-chdir.sh
index af8bd8a..09b2cc4 100755
--- a/t/t9808-git-p4-chdir.sh
+++ b/t/t9808-git-p4-chdir.sh
@@ -58,7 +58,7 @@ test_expect_success 'p4 client root would be relative due to clone --dest' '
 
 # When the p4 client Root is a symlink, make sure chdir() does not use
 # getcwd() to convert it to a physical path.
-test_expect_failure 'p4 client root symlink should stay symbolic' '
+test_expect_success 'p4 client root symlink should stay symbolic' '
 	physical="$TRASH_DIRECTORY/physical" &&
 	symbolic="$TRASH_DIRECTORY/symbolic" &&
 	test_when_finished "rm -rf \"$physical\"" &&
-- 
1.8.2.rc2.64.g8335025
Previous: Pete Wyckoff
Message 13 of 13 in “git p4: chdir resolves symlinks only for relative paths”
  1. git p4: chdir resolves symlinks only for relative pathsMiklós Fazekas, Jan 29, 2013
  2. Pete WyckoffFeb 3, 2013
  3. Miklós FazekasMar 7, 2013
  4. John KeepingMar 7, 2013
  5. 0/3 fix git-p4 client root symlink problemsPete Wyckoff, Mar 7, 2013
  6. 1/3 git p4 test: make sure P4CONFIG relative path worksPete Wyckoff, Mar 7, 2013
  7. 2/3 git p4 test: should honor symlink in p4 client rootPete Wyckoff, Mar 7, 2013
  8. Johannes SixtMar 8, 2013
  9. 0/3 fix git-p4 client root symlink problemsPete Wyckoff, Mar 11, 2013
  10. 1/3 git p4 test: make sure P4CONFIG relative path worksPete Wyckoff, Mar 11, 2013
  11. 2/3 git p4 test: should honor symlink in p4 client rootPete Wyckoff, Mar 11, 2013
  12. 3/3 git p4: avoid expanding client paths in chdirPete Wyckoff, Mar 11, 2013
  13. 3/3 git p4: avoid expanding client paths in chdirPete Wyckoff, Mar 7, 2013

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.