diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-08-11 11:04:28 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-08-11 11:04:28 -0700 |
commit | 0af53e188a3a8915f65c3b3edaeed3e07d8d3802 (patch) | |
tree | bcce70ab66b456b001140964f5c89e5b5888a35c /setup.c | |
parent | b81b758d5001c4ebab1a5b8202bb1b0f4cdf3391 (diff) | |
parent | 8894d5358095a08c2f700a87ce9fdefb0b6eb61b (diff) | |
download | git-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.c | 32 |
1 files changed, 32 insertions, 0 deletions
@@ -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: |