Code

Print empty line between raw, stat, summary and patch
authorTimo Hirvonen <tihirvon@gmail.com>
Tue, 27 Jun 2006 12:09:17 +0000 (15:09 +0300)
committerJunio C Hamano <junkio@cox.net>
Tue, 27 Jun 2006 17:59:34 +0000 (10:59 -0700)
Signed-off-by: Timo Hirvonen <tihirvon@gmail.com>
Signed-off-by: Junio C Hamano <junkio@cox.net>
diff.c

diff --git a/diff.c b/diff.c
index 54698f511ae402d1051f059d926dc8682e097ba0..71fb0967fd9c78e50b9f563ba4c57bed208d76e4 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -2093,15 +2093,43 @@ static void diff_summary(struct diff_filepair *p)
        }
 }
 
+static int is_summary_empty(const struct diff_queue_struct *q)
+{
+       int i;
+
+       for (i = 0; i < q->nr; i++) {
+               const struct diff_filepair *p = q->queue[i];
+
+               switch (p->status) {
+               case DIFF_STATUS_DELETED:
+               case DIFF_STATUS_ADDED:
+               case DIFF_STATUS_COPIED:
+               case DIFF_STATUS_RENAMED:
+                       return 0;
+               default:
+                       if (p->score)
+                               return 0;
+                       if (p->one->mode && p->two->mode &&
+                           p->one->mode != p->two->mode)
+                               return 0;
+                       break;
+               }
+       }
+       return 1;
+}
+
 void diff_flush(struct diff_options *options)
 {
        struct diff_queue_struct *q = &diff_queued_diff;
        int i, output_format = options->output_format;
+       int separator = 0;
 
        /*
         * Order: raw, stat, summary, patch
         * or:    name/name-status/checkdiff (other bits clear)
         */
+       if (!q->nr)
+               goto free_queue;
 
        if (output_format & (DIFF_FORMAT_RAW |
                             DIFF_FORMAT_NAME |
@@ -2112,11 +2140,15 @@ void diff_flush(struct diff_options *options)
                        if (check_pair_status(p))
                                flush_one_pair(p, options);
                }
+               separator++;
        }
 
        if (output_format & DIFF_FORMAT_DIFFSTAT) {
                struct diffstat_t diffstat;
 
+               if (separator++)
+                       putchar('\n');
+
                memset(&diffstat, 0, sizeof(struct diffstat_t));
                diffstat.xm.consume = diffstat_consume;
                for (i = 0; i < q->nr; i++) {
@@ -2127,18 +2159,22 @@ void diff_flush(struct diff_options *options)
                show_stats(&diffstat);
        }
 
-       if (output_format & DIFF_FORMAT_SUMMARY) {
+       if (output_format & DIFF_FORMAT_SUMMARY && !is_summary_empty(q)) {
+               if (separator++)
+                       putchar('\n');
+
                for (i = 0; i < q->nr; i++)
                        diff_summary(q->queue[i]);
        }
 
        if (output_format & DIFF_FORMAT_PATCH) {
-               if (output_format & (DIFF_FORMAT_DIFFSTAT |
-                                    DIFF_FORMAT_SUMMARY)) {
-                       if (options->stat_sep)
+               if (separator) {
+                       if (options->stat_sep) {
+                               /* attach patch instead of inline */
                                fputs(options->stat_sep, stdout);
-                       else
+                       } else {
                                putchar(options->line_termination);
+                       }
                }
 
                for (i = 0; i < q->nr; i++) {
@@ -2150,6 +2186,7 @@ void diff_flush(struct diff_options *options)
 
        for (i = 0; i < q->nr; i++)
                diff_free_filepair(q->queue[i]);
+free_queue:
        free(q->queue);
        q->queue = NULL;
        q->nr = q->alloc = 0;