• Michael Haggerty's avatar
    Provide a mechanism to turn off symlink resolution in ceiling paths · 7ec30aaa
    Michael Haggerty authored
    Commit 1b77d83c 'setup_git_directory_gently_1(): resolve symlinks
    in ceiling paths' changed the setup code to resolve symlinks in the
    entries in GIT_CEILING_DIRECTORIES.  Because those entries are
    compared textually to the symlink-resolved current directory, an
    entry in GIT_CEILING_DIRECTORIES that contained a symlink would have
    no effect.  It was known that this could cause performance problems
    if the symlink resolution *itself* touched slow filesystems, but it
    was thought that such use cases would be unlikely.  The intention of
    the earlier change was to deal with a case when the user has this:
    
    	GIT_CEILING_DIRECTORIES=/home/gitster
    
    but in reality, /home/gitster is a symbolic link to somewhere else,
    e.g. /net/machine/home4/gitster. A textual comparison between the
    specified value /home/gitster and the location getcwd(3) returns
    would not help us, but readlink("/home/gitster") would still be
    fast.
    
    After this change was released, Anders Kaseorg <andersk@mit.edu>
    reported:
    
    > [...] my computer has been acting so slow when I’m not connected to
    > the network.  I put various network filesystem paths in
    > $GIT_CEILING_DIRECTORIES, such as
    > /afs/athena.mit.edu/user/a/n/andersk (to avoid hitting its parents
    > /afs/athena.mit.edu, /afs/athena.mit.edu/user/a, and
    > /afs/athena.mit.edu/user/a/n which all live in different AFS
    > volumes).  Now when I’m not connected to the network, every
    > invocation of Git, including the __git_ps1 in my shell prompt, waits
    > for AFS to timeout.
    
    To allow users to work around this problem, give them a mechanism to
    turn off symlink resolution in GIT_CEILING_DIRECTORIES entries.  All
    the entries that follow an empty entry will not be checked for symbolic
    links and used literally in comparison.  E.g. with these:
    
    	GIT_CEILING_DIRECTORIES=:/foo/bar:/xyzzy or
    	GIT_CEILING_DIRECTORIES=/foo/bar::/xyzzy
    
    we will not readlink("/xyzzy") because it comes after an empty entry.
    
    With the former (but not with the latter), "/foo/bar" comes after an
    empty entry, and we will not readlink it, either.
    Signed-off-by: default avatarMichael Haggerty <mhagger@alum.mit.edu>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    7ec30aaa
t1504-ceiling-dirs.sh 4.01 KB