summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2010-06-22 16:45:23 (GMT)
committerJunio C Hamano <gitster@pobox.com>2010-06-22 16:45:23 (GMT)
commit2c177a1ca1b82ee6cbaa32521da75b8b1c137a73 (patch)
tree01ae3a70267876ffefc7662e7798254fd8a4c5ad
parent6bead0c3203431ca63a6b1e7cf47c659f1a7021d (diff)
parent42f9852f3c7476b5608ad297443e6d459516f8c0 (diff)
downloadgit-2c177a1ca1b82ee6cbaa32521da75b8b1c137a73.zip
git-2c177a1ca1b82ee6cbaa32521da75b8b1c137a73.tar.gz
git-2c177a1ca1b82ee6cbaa32521da75b8b1c137a73.tar.bz2
Merge branch 'jc/maint-simpler-common-prefix'
* jc/maint-simpler-common-prefix: common_prefix: simplify and fix scanning for prefixes
-rw-r--r--dir.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/dir.c b/dir.c
index 5e36f8e..151ea67 100644
--- a/dir.c
+++ b/dir.c
@@ -31,22 +31,22 @@ static int common_prefix(const char **pathspec)
if (!slash)
return 0;
+ /*
+ * The first 'prefix' characters of 'path' are common leading
+ * path components among the pathspecs we have seen so far,
+ * including the trailing slash.
+ */
prefix = slash - path + 1;
while ((next = *++pathspec) != NULL) {
- int len = strlen(next);
- if (len >= prefix && !memcmp(path, next, prefix))
+ int len, last_matching_slash = -1;
+ for (len = 0; len < prefix && next[len] == path[len]; len++)
+ if (next[len] == '/')
+ last_matching_slash = len;
+ if (len == prefix)
continue;
- len = prefix - 1;
- for (;;) {
- if (!len)
- return 0;
- if (next[--len] != '/')
- continue;
- if (memcmp(path, next, len+1))
- continue;
- prefix = len + 1;
- break;
- }
+ if (last_matching_slash < 0)
+ return 0;
+ prefix = last_matching_slash + 1;
}
return prefix;
}