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

Re: [PATCH] test: some testcases failed if cwd is on a symlink

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Aug 21, 2012, 05:59 UTC
Message-ID
<503323C5.9050500@alum.mit.edu>
In-Reply-To
<7vharyq1c6.fsf@alter.siamese.dyndns.org>
On 08/19/2012 06:43 PM, Junio C Hamano wrote:
Show 18 quoted lines
> Michael Haggerty <mhagger@alum.mit.edu> writes:
> 
>> I just verified that the combination of your two suggestions (i.e., the
>> patch below) fixes the problem for me.
> 
> Good to know.
> 
> The only remaining two worries from me are if everybody has working
> pwd at that early point in the script (I think MINGW replaces pwd
> with its own), and if the latter one should really be "/bin/pwd"
> everywhere.  Saying "Give the true path to --root when you run it"
> can sidestep the latter issue ;-)
> 
>> Nevertheless, I'm not sure that this is the best solution.  The test
>> failures that occur without this change suggest to me that
>> GIT_CEILING_DIRECTORIES is implemented in a fragile way.
> 
> Hrmph.  How would you improve it?  chdir() around twice and compare?

I believe that the old-school method is to stat(2) the two directories and check whether their device IDs and inode numbers are identical. But I don't know whether that is portable to other allegedly POSIX-compatible OSs, or even works with all modern filesystems (I think there was just a thread about a FUSE filesystem that sometimes changes inode numbers).

Another alternative is to write a function that knows how to convert an arbitrary path into an absolute path, including converting relative paths to absolute, resolving symlinks, eliminating redundant "/" and ".", resolving "..", and perhaps canonicalizing "/" vs. "\" and who-knows-what-else on Windows. It takes a bit of care to implement this correctly, but it might be a useful function to have around. Python's library function os.path.realpath() is an example [1].

Either approach would avoid chdir()ing around even temporarily, which would anyway be bad form in git proper (as opposed to the test suite). And it would avoid the need to chdir() permanently in the test suite, which can have the effect of making directory names appear in unfamiliar forms.

I'm afraid I don't have time to work on this now; I'm still trying to finish the next iteration of the post-receive-email hook script replacement.

Michael
[1] (Python) source code here:
    http://hg.python.org/cpython/file/20985f52b65e/Lib/posixfile.py
-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
Previous: Junio C HamanoNext: Jiang Xin
Message 10 of 38 in “test: some testcases failed if cwd is on a symlink”
  1. test: some testcases failed if cwd is on a symlinkJiang Xin, Jul 24, 2012
  2. Stefano LattariniJul 24, 2012
  3. Pete WyckoffJul 24, 2012
  4. Junio C HamanoJul 24, 2012
  5. Jiang XinJul 24, 2012
  6. Michael HaggertyAug 18, 2012
  7. Junio C HamanoAug 18, 2012
  8. Michael HaggertyAug 19, 2012
  9. Junio C HamanoAug 19, 2012
  10. Michael HaggertyAug 21, 2012
  11. test: set the realpath of CWD as TRASH_DIRECTORYJiang Xin, Aug 27, 2012
  12. Junio C HamanoAug 27, 2012
  13. Michael HaggertyAug 29, 2012
  14. Junio C HamanoAug 29, 2012
  15. Michael HaggertyAug 29, 2012
  16. Junio C HamanoAug 29, 2012
  17. Michael HaggertyAug 30, 2012
  18. Junio C HamanoAug 30, 2012
  19. Michael HaggertyAug 31, 2012
  20. 0/8 Fix GIT_CEILING_DIRECTORIES that contain symlinksMichael Haggerty, Sep 26, 2012
  21. 1/8 Introduce new static function real_path_internal()Michael Haggerty, Sep 26, 2012
  22. Junio C HamanoSep 27, 2012
  23. Michael HaggertySep 29, 2012
  24. Junio C HamanoSep 29, 2012
  25. 2/8 Introduce new function real_path_if_valid()Michael Haggerty, Sep 26, 2012
  26. 3/8 longest_ancestor_length(): use string_list_split()Michael Haggerty, Sep 26, 2012
  27. Junio C HamanoSep 27, 2012
  28. Michael HaggertySep 29, 2012
  29. Junio C HamanoSep 29, 2012
  30. 4/8 longest_ancestor_length(): explicitly filter list before loopMichael Haggerty, Sep 26, 2012
  31. Junio C HamanoSep 27, 2012
  32. 5/8 longest_ancestor_length(): always add a slash to the end of prefixesMichael Haggerty, Sep 26, 2012
  33. 6/8 longest_ancestor_length(): use string_list_longest_prefix()Michael Haggerty, Sep 26, 2012
  34. 7/8 longest_ancestor_length(): resolve symlinks before comparing pathsMichael Haggerty, Sep 26, 2012
  35. Junio C HamanoSep 27, 2012
  36. Michael HaggertySep 29, 2012
  37. 8/8 t1504: stop resolving symlinks in GIT_CEILING_DIRECTORIESMichael Haggerty, Sep 26, 2012
  38. Junio C HamanoSep 27, 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.