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. Because the "len" parameter to quote_path can be passed in as -1 to indicate a NUL-terminated string, we have to consider that possibility in our loop conditional (but no additional checks are necessary, since we already check that prefix[off] and in[off] are identical, and that prefix[off] is not NUL. Signed-off-by: Jeff King <peff@xxxxxxxx> --- This behavior in git-status had been bugging me, and when I went to fix it, I was surprised to find code already there to do it. :) Dscho, please confirm that the test is in fact in error, and that I've read the intent of your code correctly. t/t7502-status.sh | 2 +- wt-status.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/t/t7502-status.sh b/t/t7502-status.sh index 269b334..d6ae69d 100755 --- a/t/t7502-status.sh +++ b/t/t7502-status.sh @@ -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) diff --git a/wt-status.c b/wt-status.c index e77120d..09666ec 100644 --- a/wt-status.c +++ b/wt-status.c @@ -90,7 +90,8 @@ static char *quote_path(const char *in, int len, if (prefix) { int off = 0; - while (prefix[off] && off < len && prefix[off] == in[off]) + while (prefix[off] && (len < 0 || off < len) + && prefix[off] == in[off]) if (prefix[off] == '/') { prefix += off + 1; in += off + 1; -- 1.5.3.7.2070.g88cf2-dirty - 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