Merge branch 'cb/partial-commit-relative-pathspec'

* cb/partial-commit-relative-pathspec:
  commit: allow partial commits with relative paths
This commit is contained in:
Junio C Hamano 2011-08-11 11:04:28 -07:00
commit 0af53e188a
4 changed files with 39 additions and 38 deletions

View file

@ -256,8 +256,10 @@ static int list_paths(struct string_list *list, const char *with_tree,
;
m = xcalloc(1, i);
if (with_tree)
overlay_tree_on_cache(with_tree, prefix);
if (with_tree) {
const char *max_prefix = pathspec_prefix(prefix, pattern);
overlay_tree_on_cache(with_tree, max_prefix);
}
for (i = 0; i < active_nr; i++) {
struct cache_entry *ce = active_cache[i];

View file

@ -276,41 +276,6 @@ static void prune_cache(const char *prefix)
active_nr = last;
}
static const char *pathspec_prefix(const char *prefix)
{
const char **p, *n, *prev;
unsigned long max;
if (!pathspec) {
max_prefix_len = prefix ? strlen(prefix) : 0;
return prefix;
}
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;
}
}
max_prefix_len = max;
return max ? xmemdupz(prev, max) : NULL;
}
static void strip_trailing_slash_from_submodules(void)
{
const char **p;
@ -576,7 +541,8 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
strip_trailing_slash_from_submodules();
/* Find common prefix for all pathspec's */
max_prefix = pathspec_prefix(prefix);
max_prefix = pathspec_prefix(prefix, pathspec);
max_prefix_len = max_prefix ? strlen(max_prefix) : 0;
/* Treat unmatching pathspec elements as errors */
if (pathspec && error_unmatch) {

View file

@ -441,6 +441,7 @@ extern void set_git_work_tree(const char *tree);
#define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
extern const char **get_pathspec(const char *prefix, const char **pathspec);
extern const char *pathspec_prefix(const char *prefix, const char **pathspec);
extern void setup_work_tree(void);
extern const char *setup_git_directory_gently(int *);
extern const char *setup_git_directory(void);

32
setup.c
View file

@ -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: