Merge branch 'jc/combined' into maint

* jc/combined:
  combine-diff: honour --no-commit-id
  combine-diff: fix hunk_comment_line logic.
  combine-diff: a few more finishing touches.
This commit is contained in:
Junio C Hamano 2006-10-26 18:45:52 -07:00
commit ac1a1f9927
2 changed files with 53 additions and 11 deletions

View File

@ -214,9 +214,9 @@ copying detection) are designed to work with diff of two
--- a/file --- a/file
+++ b/file +++ b/file
+ +
Contrary to two-line header for traditional 'unified' diff Similar to two-line header for traditional 'unified' diff
format, and similar to filenames in ordinary "diff header", format, `/dev/null` is used to signal created or deleted
/dev/null is not used for creation or deletion. files.
4. Chunk header format is modified to prevent people from 4. Chunk header format is modified to prevent people from
accidentally feeding it to `patch -p1`. Combined diff format accidentally feeding it to `patch -p1`. Combined diff format

View File

@ -489,6 +489,16 @@ static void show_parent_lno(struct sline *sline, unsigned long l0, unsigned long
printf(" -%lu,%lu", l0, l1-l0); printf(" -%lu,%lu", l0, l1-l0);
} }
static int hunk_comment_line(const char *bol)
{
int ch;
if (!bol)
return 0;
ch = *bol & 0xff;
return (isalpha(ch) || ch == '_' || ch == '$');
}
static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent, static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
int use_color) int use_color)
{ {
@ -508,8 +518,13 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
struct sline *sl = &sline[lno]; struct sline *sl = &sline[lno];
unsigned long hunk_end; unsigned long hunk_end;
unsigned long rlines; unsigned long rlines;
while (lno <= cnt && !(sline[lno].flag & mark)) const char *hunk_comment = NULL;
while (lno <= cnt && !(sline[lno].flag & mark)) {
if (hunk_comment_line(sline[lno].bol))
hunk_comment = sline[lno].bol;
lno++; lno++;
}
if (cnt < lno) if (cnt < lno)
break; break;
else { else {
@ -526,6 +541,22 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
show_parent_lno(sline, lno, hunk_end, i); show_parent_lno(sline, lno, hunk_end, i);
printf(" +%lu,%lu ", lno+1, rlines); printf(" +%lu,%lu ", lno+1, rlines);
for (i = 0; i <= num_parent; i++) putchar(combine_marker); for (i = 0; i <= num_parent; i++) putchar(combine_marker);
if (hunk_comment) {
int comment_end = 0;
for (i = 0; i < 40; i++) {
int ch = hunk_comment[i] & 0xff;
if (!ch || ch == '\n')
break;
if (!isspace(ch))
comment_end = i;
}
if (comment_end)
putchar(' ');
for (i = 0; i < comment_end; i++)
putchar(hunk_comment[i]);
}
printf("%s\n", c_reset); printf("%s\n", c_reset);
while (lno < hunk_end) { while (lno < hunk_end) {
struct lline *ll; struct lline *ll;
@ -707,8 +738,10 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
int use_color = opt->color_diff; int use_color = opt->color_diff;
const char *c_meta = diff_get_color(use_color, DIFF_METAINFO); const char *c_meta = diff_get_color(use_color, DIFF_METAINFO);
const char *c_reset = diff_get_color(use_color, DIFF_RESET); const char *c_reset = diff_get_color(use_color, DIFF_RESET);
int added = 0;
int deleted = 0;
if (rev->loginfo) if (rev->loginfo && !rev->no_commit_id)
show_log(rev, opt->msg_sep); show_log(rev, opt->msg_sep);
dump_quoted_path(dense ? "diff --cc " : "diff --combined ", dump_quoted_path(dense ? "diff --cc " : "diff --combined ",
elem->path, c_meta, c_reset); elem->path, c_meta, c_reset);
@ -722,7 +755,10 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
printf("..%s%s\n", abb, c_reset); printf("..%s%s\n", abb, c_reset);
if (mode_differs) { if (mode_differs) {
int added = !!elem->mode; deleted = !elem->mode;
/* We say it was added if nobody had it */
added = !deleted;
for (i = 0; added && i < num_parent; i++) for (i = 0; added && i < num_parent; i++)
if (elem->parent[i].status != if (elem->parent[i].status !=
DIFF_STATUS_ADDED) DIFF_STATUS_ADDED)
@ -731,7 +767,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
printf("%snew file mode %06o", printf("%snew file mode %06o",
c_meta, elem->mode); c_meta, elem->mode);
else { else {
if (!elem->mode) if (deleted)
printf("%sdeleted file ", c_meta); printf("%sdeleted file ", c_meta);
printf("mode "); printf("mode ");
for (i = 0; i < num_parent; i++) { for (i = 0; i < num_parent; i++) {
@ -743,8 +779,14 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
} }
printf("%s\n", c_reset); printf("%s\n", c_reset);
} }
dump_quoted_path("--- a/", elem->path, c_meta, c_reset); if (added)
dump_quoted_path("+++ b/", elem->path, c_meta, c_reset); dump_quoted_path("--- /dev/", "null", c_meta, c_reset);
else
dump_quoted_path("--- a/", elem->path, c_meta, c_reset);
if (deleted)
dump_quoted_path("+++ /dev/", "null", c_meta, c_reset);
else
dump_quoted_path("+++ b/", elem->path, c_meta, c_reset);
dump_sline(sline, cnt, num_parent, opt->color_diff); dump_sline(sline, cnt, num_parent, opt->color_diff);
} }
free(result); free(result);
@ -777,7 +819,7 @@ static void show_raw_diff(struct combine_diff_path *p, int num_parent, struct re
if (!line_termination) if (!line_termination)
inter_name_termination = 0; inter_name_termination = 0;
if (rev->loginfo) if (rev->loginfo && !rev->no_commit_id)
show_log(rev, opt->msg_sep); show_log(rev, opt->msg_sep);
if (opt->output_format & DIFF_FORMAT_RAW) { if (opt->output_format & DIFF_FORMAT_RAW) {
@ -849,7 +891,7 @@ void diff_tree_combined(const unsigned char *sha1,
diffopts.output_format = DIFF_FORMAT_NO_OUTPUT; diffopts.output_format = DIFF_FORMAT_NO_OUTPUT;
diffopts.recursive = 1; diffopts.recursive = 1;
show_log_first = !!rev->loginfo; show_log_first = !!rev->loginfo && !rev->no_commit_id;
needsep = 0; needsep = 0;
/* find set of paths that everybody touches */ /* find set of paths that everybody touches */
for (i = 0; i < num_parent; i++) { for (i = 0; i < num_parent; i++) {