diff options
author | Junio C Hamano <junkio@cox.net> | 2005-07-22 09:56:57 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-22 10:26:01 -0700 |
commit | d854f783af2a441827d66b4b70e9d0d9e3434b15 (patch) | |
tree | 7b9ed44c29d4318bcd6c598e260a79be63a6cbe7 | |
parent | 8b64647dd9009f52e23e7fdb443b7b8f9502278a (diff) | |
download | git-d854f783af2a441827d66b4b70e9d0d9e3434b15.tar.gz git-d854f783af2a441827d66b4b70e9d0d9e3434b15.tar.xz |
[PATCH] apply.c: --exclude=fnmatch-pattern option.
Adds --exclude=pattern option to the "git-apply" command. This
was useful while reimporting the BKCVS patchset dump of the
Linux kernel, starting at 2.4.0 and ending at 2.6.12-rc2 Ingo
announced some time ago to exclude BitKeeper directory.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | apply.c | 45 |
1 files changed, 38 insertions, 7 deletions
@@ -13,7 +13,7 @@ * uses the working tree as a "branch" for a 3-way merge. */ #include <ctype.h> - +#include <fnmatch.h> #include "cache.h" // We default to the merge behaviour, since that's what most people would @@ -1345,9 +1345,9 @@ static void write_out_one_result(struct patch *patch) create_file(patch); } -static void write_out_results(struct patch *list) +static void write_out_results(struct patch *list, int skipped_patch) { - if (!list) + if (!list && !skipped_patch) die("No changes"); while (list) { @@ -1358,12 +1358,30 @@ static void write_out_results(struct patch *list) static struct cache_file cache_file; +static struct excludes { + struct excludes *next; + const char *path; +} *excludes; + +static int use_patch(struct patch *p) +{ + const char *pathname = p->new_name ? : p->old_name; + struct excludes *x = excludes; + while (x) { + if (fnmatch(x->path, pathname, 0) == 0) + return 0; + x = x->next; + } + return 1; +} + static int apply_patch(int fd) { int newfd; unsigned long offset, size; char *buffer = read_patch_file(fd, &size); struct patch *list = NULL, **listp = &list; + int skipped_patch = 0; if (!buffer) return -1; @@ -1377,9 +1395,15 @@ static int apply_patch(int fd) nr = parse_chunk(buffer + offset, size, patch); if (nr < 0) break; - patch_stats(patch); - *listp = patch; - listp = &patch->next; + if (use_patch(patch)) { + patch_stats(patch); + *listp = patch; + listp = &patch->next; + } else { + /* perhaps free it a bit better? */ + free(patch); + skipped_patch++; + } offset += nr; size -= nr; } @@ -1397,7 +1421,7 @@ static int apply_patch(int fd) exit(1); if (apply) - write_out_results(list); + write_out_results(list, skipped_patch); if (write_index) { if (write_cache(newfd, active_cache, active_nr) || @@ -1432,6 +1456,13 @@ int main(int argc, char **argv) read_stdin = 0; continue; } + if (!strncmp(arg, "--exclude=", 10)) { + struct excludes *x = xmalloc(sizeof(*x)); + x->path = arg + 10; + x->next = excludes; + excludes = x; + continue; + } /* NEEDSWORK: this does not do anything at this moment. */ if (!strcmp(arg, "--no-merge")) { merge_patch = 0; |