From: Junio C Hamano Date: Tue, 9 Sep 2014 19:53:58 +0000 (-0700) Subject: Merge branch 'jc/apply-ws-prefix' X-Git-Tag: v2.2.0-rc0~168 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/ead51a75d5ca432daa7429b70d363dba0cdf6507 Merge branch 'jc/apply-ws-prefix' Applying a patch not generated by Git in a subdirectory used to check the whitespace breakage using the attributes for incorrect paths. Also whitespace checks were performed even for paths excluded via "git apply --exclude=" mechanism. * jc/apply-ws-prefix: apply: omit ws check for excluded paths apply: hoist use_patch() helper for path exclusion up apply: use the right attribute for paths in non-Git patches --- ead51a75d5ca432daa7429b70d363dba0cdf6507 diff --cc builtin/apply.c index be2b4ce2fd,13319e8f2f..6b7c764918 --- a/builtin/apply.c +++ b/builtin/apply.c @@@ -1920,6 -1920,66 +1920,66 @@@ static int parse_binary(char *buffer, u return used; } + static void prefix_one(char **name) + { + char *old_name = *name; + if (!old_name) + return; + *name = xstrdup(prefix_filename(prefix, prefix_length, *name)); + free(old_name); + } + + static void prefix_patch(struct patch *p) + { + if (!prefix || p->is_toplevel_relative) + return; + prefix_one(&p->new_name); + prefix_one(&p->old_name); + } + + /* + * include/exclude + */ + + 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(&limit_by_name, 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; + 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; + } + + /* 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)) ++ if (!wildmatch(it->string, pathname, 0, NULL)) + 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; + } + + /* * Read the patch text in "buffer" that extends for "size" bytes; stop * reading after seeing a single patch (i.e. changes to a single file).