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

Re: [PATCH v2] test: set the realpath of CWD as TRASH_DIRECTORY

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 29, 2012, 16:33 UTC
Message-ID
<7vy5kxwtdo.fsf@alter.siamese.dyndns.org>
In-Reply-To
<503DCFAE.6060307@alum.mit.edu>
Michael Haggerty <mhagger@alum.mit.edu> writes:
Show 30 quoted lines
> On 08/29/2012 08:06 AM, Junio C Hamano wrote:
>> Michael Haggerty <mhagger@alum.mit.edu> writes:
>
> It is in fact the whole approach that I object to.
> ...
>> What exactly is broken in CEILING?
>
> CEILING is used in setup_git_directory_gently_1() when trying to find
> the GIT_DIR appropriate for the current directory.  The entries in
> CEILING are compared textually to getcwd(), looking for the entry that
> is the longest proper prefix of PWD.  This is then used to limit a loop
> that is vaguely
>
>     while (!is_git_directory())
>             chdir("..");
>
> The problem, as I understand it, is that when the tests are run with
> root set to a path that includes a symlink, then test and
> TRASH_DIRECTORY are set to the textual value of "$root/trash
> directory.tXXXX", but then a little bit later test-lib.sh chdirs into
> the trash directory using "cd -P $test" (thereby resolving symlinks).
> So, taking my concrete example "--root=/dev/shm" where /dev/shm is a
> symlink to /run/shm, we have
>
>     test="/dev/shm/trash directory.tXXXX"
>     TRASH_DIRECTORY="$test"
>     ...
>     cd -P "$test"
>
> which results in PWD being "/run/shm/trash directory.tXXXX".

The components of CEILING should be adjusted to strip the symlink so that it begins with "/run/shm/" before it is used; otherwise it would not work. As the current code does not do that at runtime (I am describing the situation, not justifying), it won't match if CEILING is built out of $TRASH_DIRECTORY. In the above, setting of $test and $TRASH is wrong; it does not match the realpath.

So "I somehow thought that Jiang's patch was to make sure any variables that contain pathnames (and make sure future paths we might grab out of $(pwd)) are realpath without symlinks early in the test set-up," in my previous message was not correct. The patch is not doing that, and that is what breaks your setup.

My preference is to set things up in such a way that most of the tests do not have to worry about these symlink aliases. I know you said you do not like the "whole approach", but I'd like to see our tests run in a stable and reproducible testing environment.

We should have specific tests (on symlink enabled platforms) that creates a directory and an alias to it via a symlink, goes into it and checks the CEILING (and whatever else) behaviour. We know that the current code does not account for the alias introduced by symlinks, and setup_git_directory_gently() may want to be patched to fix _that_ specific test.

Previous: Michael HaggertyNext: Michael Haggerty
Message 16 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.