From: Junio C Hamano <junkio@cox.net>
To: Linus Torvalds <torvalds@osdl.org>
Cc: git@vger.kernel.org
Subject: [PATCH 2/2] apply.c: --exclude=fnmatch-pattern option.
Date: Fri, 22 Jul 2005 09:56:57 -0700 [thread overview]
Message-ID: <7vll3ywzhi.fsf@assigned-by-dhcp.cox.net> (raw)
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;
reply other threads:[~2005-07-22 16:57 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7vll3ywzhi.fsf@assigned-by-dhcp.cox.net \
--to=junkio@cox.net \
--cc=git@vger.kernel.org \
--cc=torvalds@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox