quote_path: fix collapsing of relative paths
authorJeff King <peff@peff.net>
Mon, 3 Dec 2007 05:30:01 +0000 (00:30 -0500)
committerJunio C Hamano <gitster@pobox.com>
Mon, 3 Dec 2007 07:35:46 +0000 (23:35 -0800)
The code tries to collapse identical leading components
between the prefix and the path. So if we're in "dir1", the
path "dir1/file" should become just "file". However, we were
ending up with "../dir1/file". The included test expected
the wrong output.

The "len" parameter to quote_path can be negative to mean
"this is a NUL terminated string".  Simply count it so that
the loop can rely on it being the length of the path.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t7502-status.sh
wt-status.c

index 269b334..d6ae69d 100755 (executable)
@@ -68,7 +68,7 @@ cat > expect << \EOF
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #
-#      modified:   ../dir1/modified
+#      modified:   modified
 #
 # Untracked files:
 #   (use "git add <file>..." to include in what will be committed)
index 0e0439f..52ab41c 100644 (file)
@@ -82,12 +82,13 @@ static void wt_status_print_trailer(struct wt_status *s)
 }
 
 static char *quote_path(const char *in, int len,
-               struct strbuf *out, const char *prefix)
+                       struct strbuf *out, const char *prefix)
 {
-       if (len > 0)
-               strbuf_grow(out, len);
-       strbuf_setlen(out, 0);
+       if (len < 0)
+               len = strlen(in);
 
+       strbuf_grow(out, len);
+       strbuf_setlen(out, 0);
        if (prefix) {
                int off = 0;
                while (prefix[off] && off < len && prefix[off] == in[off])
@@ -104,7 +105,7 @@ static char *quote_path(const char *in, int len,
                                strbuf_addstr(out, "../");
        }
 
-       for (; (len < 0 && *in) || len > 0; in++, len--) {
+       for ( ; len > 0; in++, len--) {
                int ch = *in;
 
                switch (ch) {