v3 of the series, reworked WRT v2: * Change longest_ancestor_length() to take a string_list for its prefixes argument (instead of a PATH_SEP-separated string). * Move the responsibility for canonicalizing prefixes from longest_ancestor_length() to its caller in setup_git_directory_gently_1(). This keeps longest_ancestor_length() testable, though the test inputs now have to be canonicalized. * Remove function string_list_longest_prefix(), which was mainly intended to be used in the implementation of longest_ancestor_length() but is now unneeded. Thanks to Junio for his comments. I would like to explicitly point out a possible objection to this whole enterprise. GIT_CEILING_DIRECTORIES is used to prevent git from mucking around in certain directories, to avoid expensive accesses (for example of remote directories). The original motivation for the feature was a user whose home directory /home/$USER was automounted. When git was invoked outside of a git tree, it would crawl up the filesystem tree, eventually reaching /home, and then try to access the paths /home /home/.git /home/.git/objects /home/objects The last three accesses would be very expensive because the system would attempt to automount the entries listed. This patch series has the side effect that all of the directories listed in GIT_CEILING_DIRECTORIES are accessed *unconditionally* to resolve any symlinks that are present in their paths. It is admittedly odd that a feature intended to avoid accessing expensive directories would now *intentionally* access directories near the expensive ones. In the above scenario this shouldn't be a problem, because /home would be the directory listed in GIT_CEILING_DIRECTORIES, and accessing /home itself shouldn't be expensive. But there might be other scenarios for which this patch series causes a performance regression. Another point: After this change, it would be trivially possible to support non-absolute paths in GIT_CEILING_DIRECTORIES; just remove the call to is_absolute_path() from normalize_ceiling_entry(). This might be convenient for the test suite. Michael Haggerty (8): Introduce new static function real_path_internal() real_path_internal(): add comment explaining use of cwd Introduce new function real_path_if_valid() longest_ancestor_length(): use string_list_split() longest_ancestor_length(): take a string_list argument for prefixes longest_ancestor_length(): require prefix list entries to be normalized normalize_ceiling_entry(): resolve symlinks string_list_longest_prefix(): remove function Documentation/technical/api-string-list.txt | 8 --- abspath.c | 105 ++++++++++++++++++++++------ cache.h | 3 +- path.c | 46 ++++++------ setup.c | 32 ++++++++- string-list.c | 20 ------ string-list.h | 8 --- t/t0060-path-utils.sh | 41 ++++------- t/t0063-string-list.sh | 30 -------- test-path-utils.c | 8 ++- test-string-list.c | 20 ------ 11 files changed, 157 insertions(+), 164 deletions(-) -- 1.7.11.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html