Signed-off-by: Steven Grimm <koreth@xxxxxxxxxxxxx> --- Modified as suggested by Junio. diff.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- diffcore.h | 1 + 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/diff.c b/diff.c index a5fc56b..5f2e1fe 100644 --- a/diff.c +++ b/diff.c @@ -2979,7 +2979,7 @@ int diff_flush_patch_id(struct diff_options *options, unsigned char *sha1) free(q->queue); q->queue = NULL; - q->nr = q->alloc = 0; + q->nr = q->alloc = q->removed = 0; return result; } @@ -3074,6 +3074,12 @@ void diff_flush(struct diff_options *options) if (check_pair_status(p)) diff_flush_patch(p, options); } + + if (q->removed > 0) { + printf("Warning: %d %s touched but not modified. " + "Consider running git-status.\n", + q->removed, q->removed == 1 ? "path" : "paths"); + } } if (output_format & DIFF_FORMAT_CALLBACK) @@ -3084,7 +3090,7 @@ void diff_flush(struct diff_options *options) free_queue: free(q->queue); q->queue = NULL; - q->nr = q->alloc = 0; + q->nr = q->alloc = q->removed = 0; } static void diffcore_apply_filter(const char *filter) @@ -3093,7 +3099,7 @@ static void diffcore_apply_filter(const char *filter) struct diff_queue_struct *q = &diff_queued_diff; struct diff_queue_struct outq; outq.queue = NULL; - outq.nr = outq.alloc = 0; + outq.nr = outq.alloc = outq.removed = 0; if (!filter) return; @@ -3143,6 +3149,47 @@ static void diffcore_apply_filter(const char *filter) *q = outq; } +static void diffcore_remove_empty(void) +{ + int i; + struct diff_queue_struct *q = &diff_queued_diff; + struct diff_queue_struct outq; + outq.queue = NULL; + outq.nr = outq.alloc = outq.removed = 0; + + for (i = 0; i < q->nr; i++) { + struct diff_filepair *p = q->queue[i]; + + /* + * 1. Keep the ones that cannot be diff-files + * "false" match that are only queued due to + * cache dirtyness. + * + * 2. Modified, same size and mode, and the object + * name of one side is unknown. If they do not + * have identical contents, keep them. + * They are different. + */ + if ((p->status != DIFF_STATUS_MODIFIED) || /* (1) */ + (p->one->sha1_valid && p->two->sha1_valid) || + (p->one->mode != p->two->mode) || + + diff_populate_filespec(p->one, 1) || /* (2) */ + diff_populate_filespec(p->two, 1) || + (p->one->size != p->two->size) || + diff_populate_filespec(p->one, 0) || + diff_populate_filespec(p->two, 0) || + memcmp(p->one->data, p->two->data, p->one->size)) + diff_q(&outq, p); + else { + diff_free_filepair(p); + outq.removed++; + } + } + free(q->queue); + *q = outq; +} + void diffcore_std(struct diff_options *options) { if (options->quiet) @@ -3160,6 +3207,8 @@ void diffcore_std(struct diff_options *options) diffcore_order(options->orderfile); diff_resolve_rename_copy(); diffcore_apply_filter(options->filter); + if (options->output_format & DIFF_FORMAT_PATCH) + diffcore_remove_empty(); options->has_changes = !!diff_queued_diff.nr; } diff --git a/diffcore.h b/diffcore.h index eef17c4..e5a9244 100644 --- a/diffcore.h +++ b/diffcore.h @@ -81,6 +81,7 @@ struct diff_queue_struct { struct diff_filepair **queue; int alloc; int nr; + int removed; }; extern struct diff_queue_struct diff_queued_diff; -- 1.5.3.rc2.4.g726f9 - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html