Skip to content

Commit

Permalink
Fix GIT_CEILING_DIRECTORIES on Windows
Browse files Browse the repository at this point in the history
Using git with GIT_CEILING_DIRECTORIES crashed on Windows due to a failed
assertion in normalize_absolute_path(): This function expects absolute
paths to start with a slash, while on Windows they can start with a drive
letter or a backslash.

This fixes it by using the alternative, normalize_path_copy() instead,
which can handle Windows-style paths just fine.

Secondly, the portability macro PATH_SEP is used instead of expecting
colons to be used as path list delimiter.

The test script t1504 is also changed to help MSYS's bash recognize some
program arguments as path list. (MSYS's bash must translate POSIX-style
path lists to Windows-style path lists, and the heuristic did not catch
some cases.)

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
René Scharfe authored and Junio C Hamano committed Feb 7, 2009
1 parent f3cad0a commit 43a7ddb
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 8 deletions.
11 changes: 6 additions & 5 deletions path.c
Original file line number Diff line number Diff line change
Expand Up @@ -524,15 +524,16 @@ int longest_ancestor_length(const char *path, const char *prefix_list)
return -1;

for (colon = ceil = prefix_list; *colon; ceil = colon+1) {
for (colon = ceil; *colon && *colon != ':'; colon++);
for (colon = ceil; *colon && *colon != PATH_SEP; colon++);
len = colon - ceil;
if (len == 0 || len > PATH_MAX || !is_absolute_path(ceil))
continue;
strlcpy(buf, ceil, len+1);
len = normalize_absolute_path(buf, buf);
/* Strip "trailing slashes" from "/". */
if (len == 1)
len = 0;
if (normalize_path_copy(buf, buf) < 0)
continue;
len = strlen(buf);
if (len > 0 && buf[len-1] == '/')
buf[--len] = '\0';

if (!strncmp(path, buf, len) &&
path[len] == '/' &&
Expand Down
6 changes: 3 additions & 3 deletions t/t1504-ceiling-dirs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,13 @@ GIT_CEILING_DIRECTORIES="$TRASH_ROOT/subdi"
test_prefix subdir_ceil_at_subdi_slash "sub/dir/"


GIT_CEILING_DIRECTORIES="foo:$TRASH_ROOT/sub"
GIT_CEILING_DIRECTORIES="/foo:$TRASH_ROOT/sub"
test_fail second_of_two

GIT_CEILING_DIRECTORIES="$TRASH_ROOT/sub:bar"
GIT_CEILING_DIRECTORIES="$TRASH_ROOT/sub:/bar"
test_fail first_of_two

GIT_CEILING_DIRECTORIES="foo:$TRASH_ROOT/sub:bar"
GIT_CEILING_DIRECTORIES="/foo:$TRASH_ROOT/sub:/bar"
test_fail second_of_three


Expand Down

0 comments on commit 43a7ddb

Please sign in to comment.