All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robert Fitzsimons <robfitz@273k.net>
To: git@vger.kernel.org
Cc: Robert Fitzsimons <robfitz@273k.net>
Subject: [PATCH 6/9] New option --ignore-whitespace for git-apply.
Date: Sun, 28 Aug 2005 15:24:52 +0000	[thread overview]
Message-ID: <1125242692932-git-send-email-robfitz@273k.net> (raw)
In-Reply-To: <11252426793534-git-send-email-robfitz@273k.net>

Allow the user to force a patch to be applied even though there might
be whitespace differences.  Added a test case for the new option.

Signed-off-by: Robert Fitzsimons <robfitz@273k.net>

---

 Documentation/git-apply.txt        |    7 +++-
 apply.c                            |   38 ++++++++++++++++++-
 t/t4107-apply-ignore-whitespace.sh |   72 ++++++++++++++++++++++++++++++++++++
 3 files changed, 113 insertions(+), 4 deletions(-)
 create mode 100644 t/t4107-apply-ignore-whitespace.sh

a928441d83ccc347b1d57fc561d413da56b93197
diff --git a/Documentation/git-apply.txt b/Documentation/git-apply.txt
--- a/Documentation/git-apply.txt
+++ b/Documentation/git-apply.txt
@@ -11,7 +11,8 @@ SYNOPSIS
 --------
 'git-apply' [--no-merge] [--stat] [--summary] [--check]
 		[--index] [--show-files] [--apply]
-		[--force-delete] [<patch>...]
+		[--force-delete] [--ignore-whitespace]
+		[<patch>...]
 
 DESCRIPTION
 -----------
@@ -68,6 +69,10 @@ OPTIONS
 	file contents would be left behind, lines added or the
 	patch will not apply.
 
+--ignore-whitespace::
+	When matching the patch to the file contents ignore
+	sequences of tabs or spaces.
+
 Author
 ------
 Written by Linus Torvalds <torvalds@osdl.org>
diff --git a/apply.c b/apply.c
--- a/apply.c
+++ b/apply.c
@@ -33,8 +33,9 @@ static int check = 0;
 static int apply = 1;
 static int show_files = 0;
 static int force_delete = 0;
+static int ignore_whitespace = 0;
 static const char apply_usage[] =
-"git-apply [--no-merge] [--stat] [--summary] [--check] [--index] [--apply] [--show-files] [--force-delete] <patch>...";
+"git-apply [--no-merge] [--stat] [--summary] [--check] [--index] [--apply] [--show-files] [--force-delete] [--ignore-whitespace] <patch>...";
 
 /*
  * For "diff-stat" like behaviour, we keep track of the biggest change
@@ -109,6 +110,27 @@ static void *read_patch_file(int fd, uns
 	return buffer;
 }
 
+static int memcmp_ignore_whitespace(const char *s1, const char *s2, size_t n)
+{
+	const char *stop = s1 + n;
+	int result;
+
+	if (!n)
+		return 0;
+
+	do {
+		if (((*s1 == ' ') || (*s1 == '\t')) && ((*s2 == ' ') || (*s2 == '\t'))) {
+			while ((*s1 == ' ') || (*s1 == '\t'))
+				s1++;
+			while ((*s2 == ' ') || (*s2 == '\t'))
+				s2++;
+		}
+		result = *s1++ - *s2++;
+	} while (!result && (s1 < stop));
+
+	return result;
+}
+
 static unsigned long linelen(const char *buffer, unsigned long size)
 {
 	unsigned long len = 0;
@@ -839,7 +861,10 @@ static int find_offset(const char *buf, 
 	}
 
 	/* Exact line number? */
-	if (!memcmp(buf + start, fragment, fragsize))
+	if (ignore_whitespace) {
+		if (!memcmp_ignore_whitespace(buf + start, fragment, fragsize))
+			return start;
+	} else if (!memcmp(buf + start, fragment, fragsize))
 		return start;
 
 	/*
@@ -873,7 +898,10 @@ static int find_offset(const char *buf, 
 
 		if (try + fragsize > size)
 			continue;
-		if (memcmp(buf + try, fragment, fragsize))
+		if (ignore_whitespace) {
+			if (memcmp_ignore_whitespace(buf + try, fragment, fragsize))
+				continue;
+		} else if (memcmp(buf + try, fragment, fragsize))
 			continue;
 		n = (i >> 1)+1;
 		if (i & 1)
@@ -1575,6 +1603,10 @@ int main(int argc, char **argv)
 			force_delete = 1;
 			continue;
 		}
+		if (!strcmp(arg, "--ignore-whitespace")) {
+			ignore_whitespace = 1;
+			continue;
+		}
 		fd = open(arg, O_RDONLY);
 		if (fd < 0)
 			usage(apply_usage);
diff --git a/t/t4107-apply-ignore-whitespace.sh b/t/t4107-apply-ignore-whitespace.sh
new file mode 100644
--- /dev/null
+++ b/t/t4107-apply-ignore-whitespace.sh
@@ -0,0 +1,72 @@
+#!/bin/sh
+#
+# Copyright (c) 2005 Junio C Hamano
+# Copyright (c) 2005 Robert Fitzsimons
+#
+
+test_description='git-apply --ignore-whitespace.
+
+'
+. ./test-lib.sh
+
+# setup
+
+cat > patch1.patch <<\EOF
+diff --git a/main.c b/main.c
+new file mode 100644
+--- /dev/null
++++ b/main.c
+@@ -0,0 +1,23 @@
++#include <stdio.h>
++
++void print_int(int num);
++int func(int num);
++
++int main() {
++       int i;
++
++       for (i = 0; i < 10; i++) {
++               print_int(func(i));
++       }
++
++       return 0;
++}
++
++int func(int num) {
++       return num * num;
++}
++
++void print_int(int num) {
++       printf("%d", num);
++}
++
+EOF
+cat > patch2.patch <<\EOF
+diff --git a/main.c b/main.c
+--- a/main.c
++++ b/main.c
+@@ -10,6 +10,8 @@
+ 		print_int(func(i));
+ 	}
+ 
++	printf("\n");
++
+ 	return 0;
+ }
+EOF
+
+test_expect_success "S = patch1" \
+    'git-apply patch1.patch'
+
+test_expect_failure "F = patch2" \
+    'git-apply patch2.patch'
+
+test_expect_success "S = patch2 (--ignore-whitespace)" \
+    'git-apply --ignore-whitespace patch2.patch'
+
+rm -f main.c
+test_expect_success "S = patch1 (--ignore-whitespace)" \
+    'git-apply --ignore-whitespace patch1.patch'
+
+test_done
+

  reply	other threads:[~2005-08-28 15:23 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-08-28 15:24 [PATCH 1/9] Fix git patch header processing in git-apply Robert Fitzsimons
2005-08-28 15:24 ` [PATCH 2/9] Fix detection of files with only one line " Robert Fitzsimons
2005-08-28 15:24   ` [PATCH 3/9] Fix processing of a patch file which modifies the same file " Robert Fitzsimons
2005-08-28 15:24     ` [PATCH 4/9] Fix the procssing of multiple patch files with --check " Robert Fitzsimons
2005-08-28 15:24       ` [PATCH 5/9] New option --force-delete for git-apply Robert Fitzsimons
2005-08-28 15:24         ` Robert Fitzsimons [this message]
2005-08-28 15:24           ` [PATCH 7/9] New option --ignore-applied " Robert Fitzsimons
2005-08-28 15:25             ` [PATCH 8/9] New git-apply test cases for patches with mulitple fragments Robert Fitzsimons
2005-08-28 15:25               ` [PATCH 9/9] New git-apply test cases for scanning forwards and backwards Robert Fitzsimons
2005-08-28 16:58           ` [PATCH 6/9] New option --ignore-whitespace for git-apply Linus Torvalds
2005-08-28 20:49             ` A Large Angry SCM
2005-08-28 21:06           ` Junio C Hamano
2005-08-28 21:06         ` [PATCH 5/9] New option --force-delete " Junio C Hamano
2005-08-28 21:06     ` [PATCH 3/9] Fix processing of a patch file which modifies the same file in git-apply Junio C Hamano
2005-08-28 16:55   ` [PATCH 2/9] Fix detection of files with only one line " Linus Torvalds
2005-08-28 23:39 ` [PATCH 1/9] Fix git patch header processing " Junio C Hamano
2005-08-29 23:58   ` Robert Fitzsimons
2005-08-30  0:47     ` Linus Torvalds
2005-08-30  1:09       ` Junio C Hamano
2005-08-30  1:24         ` Linus Torvalds
2005-08-30  1:34           ` Junio C Hamano
2005-08-30  2:00             ` Linus Torvalds
2005-08-30  7:36               ` Martin Langhoff

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=1125242692932-git-send-email-robfitz@273k.net \
    --to=robfitz@273k.net \
    --cc=git@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.