OSDN Git Service

Merge branch 'jc/apply-ws-prefix' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 19 Sep 2014 21:05:10 +0000 (14:05 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 19 Sep 2014 21:05:10 +0000 (14:05 -0700)
* 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

Conflicts:
builtin/apply.c

1  2 
builtin/apply.c
t/t4119-apply-config.sh

diff --cc builtin/apply.c
@@@ -1920,6 -1920,66 +1920,66 @@@ static int parse_binary(char *buffer, u
        return used;
  }
  
 -              if (!fnmatch(it->string, pathname, 0))
+ 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 (!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).
Simple merge