[PATCH 2/2] apply.c: --exclude=fnmatch-pattern option.

From: Junio C Hamano <junkio@cox.net>
Date: 2005-07-23 02:56:57
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>
---

 apply.c |   45 ++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 38 insertions(+), 7 deletions(-)

3206526a0af9403fc6184dc17879206b9216924f
diff --git a/apply.c b/apply.c
--- a/apply.c
+++ b/apply.c
@@ -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 
 	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 pat
 
 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;


-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Received on Sat Jul 23 02:57:05 2005

This archive was generated by hypermail 2.1.8 : 2005-07-23 02:57:07 EST