Merge branch 'jc/combined'
authorJunio C Hamano <junkio@cox.net>
Thu, 26 Oct 2006 08:18:55 +0000 (01:18 -0700)
committerJunio C Hamano <junkio@cox.net>
Thu, 26 Oct 2006 08:18:55 +0000 (01:18 -0700)
* jc/combined:
combine-diff: a few more finishing touches.
Documentation: clarify refname disambiguation rules.
diff-format.txt: Combined diff format documentation supplement
Remove --syslog in git-daemon inetd documentation examples.
Documentation: updates to "Everyday GIT"

1  2 
combine-diff.c
diff --combined combine-diff.c
index 65c786807b3cca8408d5119d03a8e4e268bd3e76,01a8437f5c837f30eb463d19b98774d56f182283..466156fb4dba2e7349fa9aa28a89907c0dbf56ff
@@@ -489,6 -489,12 +489,12 @@@ static void show_parent_lno(struct slin
        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)
  {
                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 {
                        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 +734,8 @@@ static void show_patch_diff(struct comb
                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);
                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)
                                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++) {
                        }
                        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);
@@@ -856,10 -894,8 +894,10 @@@ void diff_tree_combined(const unsigned 
                /* show stat against the first parent even
                 * when doing combined diff.
                 */
 -              if (i == 0 && opt->output_format & DIFF_FORMAT_DIFFSTAT)
 -                      diffopts.output_format = DIFF_FORMAT_DIFFSTAT;
 +              int stat_opt = (opt->output_format &
 +                              (DIFF_FORMAT_NUMSTAT|DIFF_FORMAT_DIFFSTAT));
 +              if (i == 0 && stat_opt)
 +                      diffopts.output_format = stat_opt;
                else
                        diffopts.output_format = DIFF_FORMAT_NO_OUTPUT;
                diff_tree_sha1(parent[i], sha1, "", &diffopts);
                        }
                        needsep = 1;
                }
 -              else if (opt->output_format & DIFF_FORMAT_DIFFSTAT)
 +              else if (opt->output_format &
 +                       (DIFF_FORMAT_NUMSTAT|DIFF_FORMAT_DIFFSTAT))
                        needsep = 1;
                if (opt->output_format & DIFF_FORMAT_PATCH) {
                        if (needsep)