Skip to content

Commit

Permalink
combine-diff: a few more finishing touches.
Browse files Browse the repository at this point in the history
"new file" and "deleted file" were already reported in the
original code, but the logic was not as transparent as it could
have.  This uses a few variables and more comments to clarify
the flow.  The rule is: (1) if a path exists in the merge result
when no parent had it, we report "new" (otherwise it came from
the parents, as opposed to have added by the evil merge). (2) if
the path does not exist in the merge result, it is "deleted".

Since we can say "new" and "deleted", there is no reason not to
follow the /dev/null convention.  This fixes it.

Appending function name after @@@ ... @@@ is trivial, so
implement it.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Oct 26, 2006
1 parent 0ac3056 commit d5f6a01
Showing 2 changed files with 46 additions and 8 deletions.
6 changes: 3 additions & 3 deletions Documentation/diff-format.txt
Original file line number Diff line number Diff line change
@@ -212,9 +212,9 @@ copying detection) are designed to work with diff of two
--- a/file
+++ b/file
+
Contrary to two-line header for traditional 'unified' diff
format, and similar to filenames in ordinary "diff header",
/dev/null is not used for creation or deletion.
Similar to two-line header for traditional 'unified' diff
format, `/dev/null` is used to signal created or deleted
files.

4. Chunk header format is modified to prevent people from
accidentally feeding it to `patch -p1`. Combined diff format
48 changes: 43 additions & 5 deletions combine-diff.c
Original file line number Diff line number Diff line change
@@ -489,6 +489,12 @@ static void show_parent_lno(struct sline *sline, unsigned long l0, unsigned long
printf(" -%lu,%lu", l0, l1-l0);
}

static int hunk_comment_line(const char *bol)
{
int ch = *bol & 0xff;
return (isalpha(ch) || ch == '_' || ch == '$');
}

static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
int use_color)
{
@@ -508,8 +514,13 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
struct sline *sl = &sline[lno];
unsigned long hunk_end;
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++;
}
if (cnt < lno)
break;
else {
@@ -526,6 +537,22 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
show_parent_lno(sline, lno, hunk_end, i);
printf(" +%lu,%lu ", lno+1, rlines);
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);
while (lno < hunk_end) {
struct lline *ll;
@@ -707,6 +734,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
int use_color = opt->color_diff;
const char *c_meta = diff_get_color(use_color, DIFF_METAINFO);
const char *c_reset = diff_get_color(use_color, DIFF_RESET);
int added = 0;
int deleted = 0;

if (rev->loginfo)
show_log(rev, opt->msg_sep);
@@ -722,7 +751,10 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
printf("..%s%s\n", abb, c_reset);

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++)
if (elem->parent[i].status !=
DIFF_STATUS_ADDED)
@@ -731,7 +763,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
printf("%snew file mode %06o",
c_meta, elem->mode);
else {
if (!elem->mode)
if (deleted)
printf("%sdeleted file ", c_meta);
printf("mode ");
for (i = 0; i < num_parent; i++) {
@@ -743,8 +775,14 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
}
printf("%s\n", c_reset);
}
dump_quoted_path("--- a/", elem->path, c_meta, c_reset);
dump_quoted_path("+++ b/", elem->path, c_meta, c_reset);
if (added)
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);
}
free(result);

0 comments on commit d5f6a01

Please sign in to comment.