summaryrefslogtreecommitdiff
path: root/path.c
diff options
context:
space:
mode:
authorJohannes Sixt <j6t@kdbg.org>2009-02-07 15:08:30 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-02-07 20:23:30 (GMT)
commitf42302b49333d035a323f5d80fb9562d375b17f1 (patch)
tree2003fd4dd304aec98199cce60c0fe40aaefa2c2c /path.c
parent43a7ddb55d82d5c6f0c4d2cbe408a1df71d58ef3 (diff)
downloadgit-f42302b49333d035a323f5d80fb9562d375b17f1.zip
git-f42302b49333d035a323f5d80fb9562d375b17f1.tar.gz
git-f42302b49333d035a323f5d80fb9562d375b17f1.tar.bz2
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 <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'path.c')
-rw-r--r--path.c16
1 files changed, 5 insertions, 11 deletions
diff --git a/path.c b/path.c
index 79c5c10..6b7be5b 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;