mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
Merge branch 'cb/partial-commit-relative-pathspec'
* cb/partial-commit-relative-pathspec: commit: allow partial commits with relative paths
This commit is contained in:
commit
0af53e188a
|
@ -256,8 +256,10 @@ static int list_paths(struct string_list *list, const char *with_tree,
|
||||||
;
|
;
|
||||||
m = xcalloc(1, i);
|
m = xcalloc(1, i);
|
||||||
|
|
||||||
if (with_tree)
|
if (with_tree) {
|
||||||
overlay_tree_on_cache(with_tree, prefix);
|
const char *max_prefix = pathspec_prefix(prefix, pattern);
|
||||||
|
overlay_tree_on_cache(with_tree, max_prefix);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < active_nr; i++) {
|
for (i = 0; i < active_nr; i++) {
|
||||||
struct cache_entry *ce = active_cache[i];
|
struct cache_entry *ce = active_cache[i];
|
||||||
|
|
|
@ -276,41 +276,6 @@ static void prune_cache(const char *prefix)
|
||||||
active_nr = last;
|
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)
|
static void strip_trailing_slash_from_submodules(void)
|
||||||
{
|
{
|
||||||
const char **p;
|
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();
|
strip_trailing_slash_from_submodules();
|
||||||
|
|
||||||
/* Find common prefix for all pathspec's */
|
/* 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 */
|
/* Treat unmatching pathspec elements as errors */
|
||||||
if (pathspec && error_unmatch) {
|
if (pathspec && error_unmatch) {
|
||||||
|
|
1
cache.h
1
cache.h
|
@ -441,6 +441,7 @@ extern void set_git_work_tree(const char *tree);
|
||||||
#define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
|
#define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
|
||||||
|
|
||||||
extern const char **get_pathspec(const char *prefix, const char **pathspec);
|
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 void setup_work_tree(void);
|
||||||
extern const char *setup_git_directory_gently(int *);
|
extern const char *setup_git_directory_gently(int *);
|
||||||
extern const char *setup_git_directory(void);
|
extern const char *setup_git_directory(void);
|
||||||
|
|
32
setup.c
32
setup.c
|
@ -264,6 +264,38 @@ const char **get_pathspec(const char *prefix, const char **pathspec)
|
||||||
return 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.
|
* Test if it looks like we're at a git directory.
|
||||||
* We want to see:
|
* We want to see:
|
||||||
|
|
Loading…
Reference in a new issue