From: Junio C Hamano <gitster@pobox.com>
To: Jeff King <peff@peff.net>
Cc: Michael J Gruber <git@drmicha.warpmail.net>,
Peter Oberndorfer <kumbayo84@arcor.de>,
Git List <git@vger.kernel.org>
Subject: Re: textconv not invoked when viewing merge commit
Date: Thu, 14 Apr 2011 12:43:00 -0700 [thread overview]
Message-ID: <7vd3kohb5n.fsf@alter.siamese.dyndns.org> (raw)
In-Reply-To: <7vipughbxh.fsf@alter.siamese.dyndns.org> (Junio C. Hamano's message of "Thu, 14 Apr 2011 12:26:18 -0700")
Junio C Hamano <gitster@pobox.com> writes:
> Jeff King <peff@peff.net> writes:
>
>> We just dump the binary goo all over the terminal. So I think the whole
>> combined-diff code path needs to learn how to handle binaries properly.
>
> How would you show multi-way diffs for binary files?
>
> It would probably be sufficient to say "binary files differ" at the
> beginning of the patch-combining codepath of the combined diff, which
> would at least keep the --raw -c/--cc output working.
In other words, I suspect that the only places you need to touch in the
existing codepath would be these places.
diff --git a/combine-diff.c b/combine-diff.c
index 655fa89..9c96f1f 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -201,7 +201,7 @@ static void consume_line(void *state_, char *line, unsigned long len)
}
}
-static void combine_diff(const unsigned char *parent, unsigned int mode,
+static int combine_diff(const unsigned char *parent, unsigned int mode,
mmfile_t *result_file,
struct sline *sline, unsigned int cnt, int n,
int num_parent, int result_deleted)
@@ -215,10 +215,17 @@ static void combine_diff(const unsigned char *parent, unsigned int mode,
unsigned long sz;
if (result_deleted)
- return; /* result deleted */
+ return 0; /* result deleted */
parent_file.ptr = grab_blob(parent, mode, &sz);
parent_file.size = sz;
+
+ if (path has textconv) {
+ parent_file.{ptr,size} = textconv of parent_file;
+ } else if (path is binary) {
+ return -1;
+ }
+
memset(&xpp, 0, sizeof(xpp));
xpp.flags = 0;
memset(&xecfg, 0, sizeof(xecfg));
@@ -255,6 +262,7 @@ static void combine_diff(const unsigned char *parent, unsigned int mode,
p_lno++; /* no '+' means parent had it */
}
sline[lno].p_lno[n] = p_lno; /* trailer */
+ return 0;
}
static unsigned long context = 3;
@@ -777,6 +785,12 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
close(fd);
}
+ if (path has textconv) {
+ result, result_size = textconv of result;
+ } else if (path is binary) {
+ goto exit_binary;
+ }
+
for (cnt = 0, cp = result; cp < result + result_size; cp++) {
if (*cp == '\n')
cnt++;
@@ -820,11 +834,13 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
break;
}
}
- if (i <= j)
- combine_diff(elem->parent[i].sha1,
- elem->parent[i].mode,
- &result_file, sline,
- cnt, i, num_parent, result_deleted);
+ if (i <= j) {
+ if (combine_diff(elem->parent[i].sha1,
+ elem->parent[i].mode,
+ &result_file, sline,
+ cnt, i, num_parent, result_deleted))
+ goto exit_binary;
+ }
if (elem->parent[i].mode != elem->mode)
mode_differs = 1;
}
@@ -892,6 +908,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
dump_sline(sline, cnt, num_parent,
DIFF_OPT_TST(opt, COLOR_DIFF), result_deleted);
}
+
+free_exit:
free(result);
for (lno = 0; lno < cnt; lno++) {
@@ -906,6 +924,11 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
}
free(sline[0].p_lno);
free(sline);
+ return;
+
+exit_binary:
+ printf("path '%s' is binary\n", elem->path);
+ goto free_exit;
}
#define COLONS "::::::::::::::::::::::::::::::::"
next prev parent reply other threads:[~2011-04-14 19:43 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-11 17:12 textconv not invoked when viewing merge commit Peter Oberndorfer
2011-04-12 9:04 ` Michael J Gruber
2011-04-14 19:09 ` Jeff King
2011-04-14 19:15 ` Jeff King
2011-04-14 19:26 ` Junio C Hamano
2011-04-14 19:28 ` Jeff King
2011-04-14 19:35 ` Michael J Gruber
2011-04-14 19:43 ` Junio C Hamano [this message]
2011-04-14 20:06 ` Junio C Hamano
2011-04-14 20:23 ` Jeff King
2011-04-14 21:05 ` Junio C Hamano
2011-04-14 21:30 ` Jeff King
2011-04-15 15:29 ` [PATCH] combine-diff: use textconv for combined diff format Michael J Gruber
2011-04-15 18:34 ` Junio C Hamano
2011-04-16 10:24 ` Michael J Gruber
2011-04-16 17:19 ` Junio C Hamano
2011-04-16 21:37 ` Jakub Narebski
2011-04-15 23:56 ` Jeff King
2011-04-21 16:08 ` Peter Oberndorfer
2011-04-15 6:54 ` textconv not invoked when viewing merge commit Matthieu Moy
2011-04-15 20:45 ` Junio C Hamano
2011-04-16 1:47 ` Jeff King
2011-04-16 6:10 ` Junio C Hamano
2011-04-16 6:33 ` Jeff King
2011-04-16 16:23 ` Junio C Hamano
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=7vd3kohb5n.fsf@alter.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=git@drmicha.warpmail.net \
--cc=git@vger.kernel.org \
--cc=kumbayo84@arcor.de \
--cc=peff@peff.net \
/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;
as well as URLs for NNTP newsgroup(s).