From f42302b49333d035a323f5d80fb9562d375b17f1 Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Sat, 7 Feb 2009 16:08:30 +0100 Subject: Test and fix normalize_path_copy() This changes the test-path-utils utility to invoke normalize_path_copy() instead of normalize_absolute_path() because the latter is about to be removed. The test cases in t0060 are adjusted in two regards: - normalize_path_copy() more often leaves a trailing slash in the result. This has no negative side effects because the new user of this function, longest_ancester_length(), already accounts for this behavior. - The function can fail. The tests uncover a flaw in normalize_path_copy(): If there are sufficiently many '..' path components so that the root is reached, such as in "/d1/s1/../../d2", then the leading slash was lost. This manifested itself that (assuming there is a repository at /tmp/foo) $ git add /d1/../tmp/foo/some-file reported 'pathspec is outside repository'. This is now fixed. Moreover, the test case descriptions of t0060 now include the test data and expected outcome. Signed-off-by: Johannes Sixt Signed-off-by: Junio C Hamano --- path.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) (limited to 'path.c') diff --git a/path.c b/path.c index 79c5c104c3..6b7be5b869 100644 --- a/path.c +++ b/path.c @@ -484,18 +484,12 @@ int normalize_path_copy(char *dst, const char *src) * dst0..dst is prefix portion, and dst[-1] is '/'; * go up one level. */ - dst -= 2; /* go past trailing '/' if any */ - if (dst < dst0) + dst--; /* go to trailing '/' */ + if (dst <= dst0) return -1; - while (1) { - if (dst <= dst0) - break; - c = *dst--; - if (c == '/') { /* MinGW: cannot be '\\' anymore */ - dst += 2; - break; - } - } + /* Windows: dst[-1] cannot be backslash anymore */ + while (dst0 < dst && dst[-1] != '/') + dst--; } *dst = '\0'; return 0; -- cgit v1.2.1