All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: Jiang Xin <worldhello.net@gmail.com>,
	Lea Wiemann <lewiemann@gmail.com>,
	git@vger.kernel.org
Subject: Re: [PATCH 1/8] Introduce new static function real_path_internal()
Date: Sat, 29 Sep 2012 06:56:30 +0200	[thread overview]
Message-ID: <50667F7E.7040903@alum.mit.edu> (raw)
In-Reply-To: <7vk3vfp36g.fsf@alter.siamese.dyndns.org>

On 09/27/2012 11:27 PM, Junio C Hamano wrote:
> Michael Haggerty <mhagger@alum.mit.edu> writes:
> 
>> @@ -54,20 +73,36 @@ const char *real_path(const char *path)
>>  		}
>>  
>>  		if (*buf) {
>> -			if (!*cwd && !getcwd(cwd, sizeof(cwd)))
>> -				die_errno ("Could not get current working directory");
>> +			if (!*cwd && !getcwd(cwd, sizeof(cwd))) {
>> +				if (die_on_error)
>> +					die_errno("Could not get current working directory");
>> +				else
>> +					goto error_out;
>> +			}
>>  
>> -			if (chdir(buf))
>> -				die_errno ("Could not switch to '%s'", buf);
>> +			if (chdir(buf)) {
>> +				if (die_on_error)
>> +					die_errno("Could not switch to '%s'", buf);
>> +				else
>> +					goto error_out;
>> +			}
>> +		}
> 
> 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.

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

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;

-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/

  reply	other threads:[~2012-09-29  4:56 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-24  8:00 [PATCH] test: some testcases failed if cwd is on a symlink Jiang Xin
2012-07-24  8:24 ` Stefano Lattarini
2012-07-24 10:59 ` Pete Wyckoff
2012-07-24 14:47 ` Junio C Hamano
2012-07-24 22:06   ` Jiang Xin
2012-08-18 14:41   ` Michael Haggerty
2012-08-18 20:36     ` Junio C Hamano
2012-08-19 13:57       ` Michael Haggerty
2012-08-19 16:43         ` Junio C Hamano
2012-08-21  5:59           ` Michael Haggerty
2012-08-27  5:13         ` [PATCH v2] test: set the realpath of CWD as TRASH_DIRECTORY Jiang Xin
2012-08-27 16:15           ` Junio C Hamano
2012-08-29  4:14             ` Michael Haggerty
2012-08-29  6:06               ` Junio C Hamano
2012-08-29  8:15                 ` Michael Haggerty
2012-08-29 16:33                   ` Junio C Hamano
2012-08-30  4:37                     ` Michael Haggerty
2012-08-30  5:26                       ` Junio C Hamano
2012-08-31  7:49                         ` Michael Haggerty
2012-09-26 19:34                           ` [PATCH 0/8] Fix GIT_CEILING_DIRECTORIES that contain symlinks Michael Haggerty
2012-09-26 19:34                             ` [PATCH 1/8] Introduce new static function real_path_internal() Michael Haggerty
2012-09-27 21:27                               ` Junio C Hamano
2012-09-29  4:56                                 ` Michael Haggerty [this message]
2012-09-29  5:40                                   ` Junio C Hamano
2012-09-26 19:34                             ` [PATCH 2/8] Introduce new function real_path_if_valid() Michael Haggerty
2012-09-26 19:34                             ` [PATCH 3/8] longest_ancestor_length(): use string_list_split() Michael Haggerty
2012-09-27 22:48                               ` Junio C Hamano
2012-09-29  5:25                                 ` Michael Haggerty
2012-09-29  5:43                                   ` Junio C Hamano
2012-09-26 19:34                             ` [PATCH 4/8] longest_ancestor_length(): explicitly filter list before loop Michael Haggerty
2012-09-27 22:48                               ` Junio C Hamano
2012-09-26 19:34                             ` [PATCH 5/8] longest_ancestor_length(): always add a slash to the end of prefixes Michael Haggerty
2012-09-26 19:34                             ` [PATCH 6/8] longest_ancestor_length(): use string_list_longest_prefix() Michael Haggerty
2012-09-26 19:34                             ` [PATCH 7/8] longest_ancestor_length(): resolve symlinks before comparing paths Michael Haggerty
2012-09-27 22:51                               ` Junio C Hamano
2012-09-29  5:46                                 ` Michael Haggerty
2012-09-26 19:34                             ` [PATCH 8/8] t1504: stop resolving symlinks in GIT_CEILING_DIRECTORIES Michael Haggerty
2012-09-27 19:42                             ` [PATCH 0/8] Fix GIT_CEILING_DIRECTORIES that contain symlinks Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50667F7E.7040903@alum.mit.edu \
    --to=mhagger@alum.mit.edu \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=lewiemann@gmail.com \
    --cc=worldhello.net@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.