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

Re: [PATCH 1/8] Introduce new static function real_path_internal()

From
Junio C Hamano <gitster@pobox.com>
Date
Sep 29, 2012, 05:40 UTC
Message-ID
<7vy5jtidyd.fsf@alter.siamese.dyndns.org>
In-Reply-To
<50667F7E.7040903@alum.mit.edu>
Michael Haggerty <mhagger@alum.mit.edu> writes:
Show 23 quoted lines
>> The patch makes sense, but while you are touching this code, I have
>> to wonder if there is an easy way to tell, before entering the loop,
>> if we have to chdir() around in the loop.  That would allow us to
>> hoist the getcwd() that is done only so that we can come back to
>> where we started outside the loop, making it clear why the call is
>> there, instead of cryptic "if (!*cwd &&" to ensure we do getcwd()
>> once and before doing any chdir().
>
> I don't see an easy way to predict, before entering the loop, whether
> chdir() will be needed.  For example, compare
>
>     touch filename
>     ln -s filename foo
>     ./test-path-utils real_path foo
>
> with
>
>     touch filename
>     ln -s $(pwd)/filename foo
>     ./test-path-utils real_path foo
>
> In the first case no chdir() is needed, whereas in the second case a
> chdir() is needed but only on the second loop iteration.

Thanks for an example, and it is perfectly OK if we really have to have that "only fires once and only if needed" logic in the loop.

> All I can offer you is a palliative like the one below.

I think that is an improvement; or we could rename it not cwd[] but some other name that includes the word "original" in it.

Thanks.
Show 23 quoted lines
> Michael
>
> diff --git a/abspath.c b/abspath.c
> index 5748b91..40cdc46 100644
> --- a/abspath.c
> +++ b/abspath.c
> @@ -35,7 +35,14 @@ static const char *real_path_internal(const char
> *path, int die_on_error)
>  {
>         static char bufs[2][PATH_MAX + 1], *buf = bufs[0], *next_buf =
> bufs[1];
>         char *retval = NULL;
> +
> +       /*
> +        * If we have to temporarily chdir(), store the original CWD
> +        * here so that we can chdir() back to it at the end of the
> +        * function:
> +        */
>         char cwd[1024] = "";
> +
>         int buf_index = 1;
>
>         int depth = MAXDEPTH;
Previous: Michael HaggertyNext: Michael Haggerty
Message 24 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.