Re: [PATCH] Introduce Git.pm (v3)

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: [PATCH] Introduce Git.pm (v3)

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:42:30

Junio C Hamano [off-list ref] writes:
quoted
It should be enough to -I../perl/blib/lib -I../perl/blib/arch/auto/Git.
-- >8 --
[PATCH] Perl interface: add build-time configuration to allow building with -fPIC

On x86-64 it seems that Git.xs does not link without compiling
the main git objects with -fPIC.

Signed-off-by: Junio C Hamano <redacted>
Eh, sorry this was in response to this part of Pasky's message:
quoted
Well, for the .xs you do need an .so and for that you apparently need
-fPIC on most architectures, so there's no way around it.

There's a patch to build libgit.so, would you take it as an excuse to
always compile with -fPIC? ;-)
By the way, I noticed NO_ACCURATE_DIFF is a compile time option
to cause git-apply to accept diff output from implementations
that botch "\No newline at the end of file", and I think it is
wrong -- it should be a run time option to git-apply if we would
want to support it, because the version of diff you have does
not have much to do with which implementations of diff were used
to generate patches you would receive and apply.

Thoughts?

Re: [PATCH] Introduce Git.pm (v3)

From: Johannes Schindelin <hidden>
Date: 2016-06-15 22:42:31

Hi,

On Fri, 23 Jun 2006, Junio C Hamano wrote:
By the way, I noticed NO_ACCURATE_DIFF is a compile time option
to cause git-apply to accept diff output from implementations
that botch "\No newline at the end of file", and I think it is
wrong -- it should be a run time option to git-apply if we would
want to support it, because the version of diff you have does
not have much to do with which implementations of diff were used
to generate patches you would receive and apply.

Thoughts?
My original idea: on a machine where you have no accurate diff, you at 
least want to pass the tests, and you want to ensure you can apply a diff 
you generated on that machine.

But I was wrong. This patch is just compile tested, but obviously correct 
(lacking usage() and Documentation updates as usual, since I do not want 
to do that work before I know the patch is applied):

---
[PATCH] apply: add --no-accurate-diff and --accurate-diff options

You can still set the default behaviour in the Makefile, but at least you
can override it.

Signed-off-by: Johannes Schindelin <redacted>

---

 builtin-apply.c |   32 +++++++++++++++++++++++---------
 1 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/builtin-apply.c b/builtin-apply.c
index e113c74..2d26ade 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -125,6 +125,7 @@ #define BINARY_LITERAL_DEFLATED 2
 	unsigned long deflate_origlen;
 	int lines_added, lines_deleted;
 	int score;
+	int no_accurate_diff:1;
 	struct fragment *fragments;
 	char *result;
 	unsigned long resultsize;
@@ -1333,7 +1334,8 @@ static int apply_line(char *output, cons
 	return plen;
 }
 
-static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag)
+static int apply_one_fragment(struct buffer_desc *desc, struct fragment *frag,
+	int no_accurate_diff)
 {
 	int match_beginning, match_end;
 	char *buf = desc->buffer;
@@ -1386,13 +1388,11 @@ static int apply_one_fragment(struct buf
 		size -= len;
 	}
 
-#ifdef NO_ACCURATE_DIFF
-	if (oldsize > 0 && old[oldsize - 1] == '\n' &&
+	if (no_accurate_diff && oldsize > 0 && old[oldsize - 1] == '\n' &&
 			newsize > 0 && new[newsize - 1] == '\n') {
 		oldsize--;
 		newsize--;
 	}
-#endif
 
 	oldlines = old;
 	newlines = new;
@@ -1614,7 +1614,7 @@ static int apply_fragments(struct buffer
 		return apply_binary(desc, patch);
 
 	while (frag) {
-		if (apply_one_fragment(desc, frag) < 0)
+		if (apply_one_fragment(desc, frag, patch->no_accurate_diff) < 0)
 			return error("patch failed: %s:%ld",
 				     name, frag->oldpos);
 		frag = frag->next;
@@ -2097,7 +2097,7 @@ static int use_patch(struct patch *p)
 	return 1;
 }
 
-static int apply_patch(int fd, const char *filename)
+static int apply_patch(int fd, const char *filename, int no_accurate_diff)
 {
 	unsigned long offset, size;
 	char *buffer = read_patch_file(fd, &size);
@@ -2113,6 +2113,7 @@ static int apply_patch(int fd, const cha
 		int nr;
 
 		patch = xcalloc(1, sizeof(*patch));
+		patch->no_accurate_diff = no_accurate_diff;
 		nr = parse_chunk(buffer + offset, size, patch);
 		if (nr < 0)
 			break;
@@ -2180,6 +2181,11 @@ int cmd_apply(int argc, const char **arg
 {
 	int i;
 	int read_stdin = 1;
+#ifdef NO_ACCURATE_DIFF
+	int no_accurate_diff = 1;
+#else
+	int no_accurate_diff = 0;
+#endif
 	const char *whitespace_option = NULL;
 
 	for (i = 1; i < argc; i++) {
@@ -2188,7 +2194,7 @@ int cmd_apply(int argc, const char **arg
 		int fd;
 
 		if (!strcmp(arg, "-")) {
-			apply_patch(0, "<stdin>");
+			apply_patch(0, "<stdin>", no_accurate_diff);
 			read_stdin = 0;
 			continue;
 		}
@@ -2265,6 +2271,14 @@ int cmd_apply(int argc, const char **arg
 			parse_whitespace_option(arg + 13);
 			continue;
 		}
+		if (!strcmp(arg, "--no-accurate-diff")) {
+			no_accurate_diff = 1;
+			continue;
+		}
+		if (!strcmp(arg, "--accurate-diff")) {
+			no_accurate_diff = 0;
+			continue;
+		}
 
 		if (check_index && prefix_length < 0) {
 			prefix = setup_git_directory();
@@ -2281,12 +2295,12 @@ int cmd_apply(int argc, const char **arg
 			usage(apply_usage);
 		read_stdin = 0;
 		set_default_whitespace_mode(whitespace_option);
-		apply_patch(fd, arg);
+		apply_patch(fd, arg, no_accurate_diff);
 		close(fd);
 	}
 	set_default_whitespace_mode(whitespace_option);
 	if (read_stdin)
-		apply_patch(0, "<stdin>");
+		apply_patch(0, "<stdin>", no_accurate_diff);
 	if (whitespace_error) {
 		if (squelch_whitespace_errors &&
 		    squelch_whitespace_errors < whitespace_error) {
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help