зеркало из https://github.com/microsoft/git.git
Merge branch 'jc/apply-include-exclude'
* jc/apply-include-exclude: git-apply:--include=pathspec
This commit is contained in:
Коммит
81b84bcbe3
|
@ -14,7 +14,8 @@ SYNOPSIS
|
|||
[--allow-binary-replacement | --binary] [--reject] [-z]
|
||||
[-pNUM] [-CNUM] [--inaccurate-eof] [--recount] [--cached]
|
||||
[--whitespace=<nowarn|warn|fix|error|error-all>]
|
||||
[--exclude=PATH] [--directory=<root>] [--verbose] [<patch>...]
|
||||
[--exclude=PATH] [--include=PATH] [--directory=<root>]
|
||||
[--verbose] [<patch>...]
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
|
@ -137,6 +138,17 @@ discouraged.
|
|||
be useful when importing patchsets, where you want to exclude certain
|
||||
files or directories.
|
||||
|
||||
--include=<path-pattern>::
|
||||
Apply changes to files matching the given path pattern. This can
|
||||
be useful when importing patchsets, where you want to include certain
|
||||
files or directories.
|
||||
+
|
||||
When --exclude and --include patterns are used, they are examined in the
|
||||
order they appear on the command line, and the first match determines if a
|
||||
patch to each path is used. A patch to a path that does not match any
|
||||
include/exclude pattern is used by default if there is no include pattern
|
||||
on the command line, and ignored if there is any include pattern.
|
||||
|
||||
--whitespace=<action>::
|
||||
When applying a patch, detect a new or modified line that has
|
||||
whitespace errors. What are considered whitespace errors is
|
||||
|
|
|
@ -2994,29 +2994,45 @@ static int write_out_results(struct patch *list, int skipped_patch)
|
|||
|
||||
static struct lock_file lock_file;
|
||||
|
||||
static struct excludes {
|
||||
struct excludes *next;
|
||||
const char *path;
|
||||
} *excludes;
|
||||
static struct string_list limit_by_name;
|
||||
static int has_include;
|
||||
static void add_name_limit(const char *name, int exclude)
|
||||
{
|
||||
struct string_list_item *it;
|
||||
|
||||
it = string_list_append(name, &limit_by_name);
|
||||
it->util = exclude ? NULL : (void *) 1;
|
||||
}
|
||||
|
||||
static int use_patch(struct patch *p)
|
||||
{
|
||||
const char *pathname = p->new_name ? p->new_name : p->old_name;
|
||||
struct excludes *x = excludes;
|
||||
while (x) {
|
||||
if (fnmatch(x->path, pathname, 0) == 0)
|
||||
return 0;
|
||||
x = x->next;
|
||||
}
|
||||
int i;
|
||||
|
||||
/* Paths outside are not touched regardless of "--include" */
|
||||
if (0 < prefix_length) {
|
||||
int pathlen = strlen(pathname);
|
||||
if (pathlen <= prefix_length ||
|
||||
memcmp(prefix, pathname, prefix_length))
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
|
||||
/* See if it matches any of exclude/include rule */
|
||||
for (i = 0; i < limit_by_name.nr; i++) {
|
||||
struct string_list_item *it = &limit_by_name.items[i];
|
||||
if (!fnmatch(it->string, pathname, 0))
|
||||
return (it->util != NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we had any include, a path that does not match any rule is
|
||||
* not used. Otherwise, we saw bunch of exclude rules (or none)
|
||||
* and such a path is used.
|
||||
*/
|
||||
return !has_include;
|
||||
}
|
||||
|
||||
|
||||
static void prefix_one(char **name)
|
||||
{
|
||||
char *old_name = *name;
|
||||
|
@ -3157,10 +3173,12 @@ int cmd_apply(int argc, const char **argv, const char *unused_prefix)
|
|||
continue;
|
||||
}
|
||||
if (!prefixcmp(arg, "--exclude=")) {
|
||||
struct excludes *x = xmalloc(sizeof(*x));
|
||||
x->path = arg + 10;
|
||||
x->next = excludes;
|
||||
excludes = x;
|
||||
add_name_limit(arg + 10, 1);
|
||||
continue;
|
||||
}
|
||||
if (!prefixcmp(arg, "--include=")) {
|
||||
add_name_limit(arg + 10, 0);
|
||||
has_include = 1;
|
||||
continue;
|
||||
}
|
||||
if (!prefixcmp(arg, "-p")) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче