summaryrefslogtreecommitdiff
path: root/setup.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2011-08-11 11:04:28 -0700
committerJunio C Hamano <gitster@pobox.com>2011-08-11 11:04:28 -0700
commit0af53e188a3a8915f65c3b3edaeed3e07d8d3802 (patch)
treebcce70ab66b456b001140964f5c89e5b5888a35c /setup.c
parentb81b758d5001c4ebab1a5b8202bb1b0f4cdf3391 (diff)
parent8894d5358095a08c2f700a87ce9fdefb0b6eb61b (diff)
downloadgit-0af53e188a3a8915f65c3b3edaeed3e07d8d3802.tar.gz
Merge branch 'cb/partial-commit-relative-pathspec'
* cb/partial-commit-relative-pathspec: commit: allow partial commits with relative paths
Diffstat (limited to 'setup.c')
-rw-r--r--setup.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/setup.c b/setup.c
index 5ea5502e48..2c51a9a4c7 100644
--- a/setup.c
+++ b/setup.c
@@ -264,6 +264,38 @@ const char **get_pathspec(const char *prefix, const char **pathspec)
return pathspec;
}
+const char *pathspec_prefix(const char *prefix, const char **pathspec)
+{
+ const char **p, *n, *prev;
+ unsigned long max;
+
+ if (!pathspec)
+ return prefix ? xmemdupz(prefix, strlen(prefix)) : NULL;
+
+ prev = NULL;
+ max = PATH_MAX;
+ for (p = pathspec; (n = *p) != NULL; p++) {
+ int i, len = 0;
+ for (i = 0; i < max; i++) {
+ char c = n[i];
+ if (prev && prev[i] != c)
+ break;
+ if (!c || c == '*' || c == '?')
+ break;
+ if (c == '/')
+ len = i+1;
+ }
+ prev = n;
+ if (len < max) {
+ max = len;
+ if (!max)
+ break;
+ }
+ }
+
+ return max ? xmemdupz(prev, max) : NULL;
+}
+
/*
* Test if it looks like we're at a git directory.
* We want to see: