Merge branch 'jh/dirstat' into maint
* jh/dirstat: --dirstat: In case of renames, use target filename instead of source filename Teach --dirstat not to completely ignore rearranged lines within a file --dirstat-by-file: Make it faster and more correct --dirstat: Describe non-obvious differences relative to --stat or regular diff
This commit is contained in:
42
diff.c
42
diff.c
@ -1538,8 +1538,36 @@ static void show_dirstat(struct diff_options *options)
|
||||
struct diff_filepair *p = q->queue[i];
|
||||
const char *name;
|
||||
unsigned long copied, added, damage;
|
||||
int content_changed;
|
||||
|
||||
name = p->one->path ? p->one->path : p->two->path;
|
||||
name = p->two->path ? p->two->path : p->one->path;
|
||||
|
||||
if (p->one->sha1_valid && p->two->sha1_valid)
|
||||
content_changed = hashcmp(p->one->sha1, p->two->sha1);
|
||||
else
|
||||
content_changed = 1;
|
||||
|
||||
if (!content_changed) {
|
||||
/*
|
||||
* The SHA1 has not changed, so pre-/post-content is
|
||||
* identical. We can therefore skip looking at the
|
||||
* file contents altogether.
|
||||
*/
|
||||
damage = 0;
|
||||
goto found_damage;
|
||||
}
|
||||
|
||||
if (DIFF_OPT_TST(options, DIRSTAT_BY_FILE)) {
|
||||
/*
|
||||
* In --dirstat-by-file mode, we don't really need to
|
||||
* look at the actual file contents at all.
|
||||
* The fact that the SHA1 changed is enough for us to
|
||||
* add this file to the list of results
|
||||
* (with each file contributing equal damage).
|
||||
*/
|
||||
damage = 1;
|
||||
goto found_damage;
|
||||
}
|
||||
|
||||
if (DIFF_FILE_VALID(p->one) && DIFF_FILE_VALID(p->two)) {
|
||||
diff_populate_filespec(p->one, 0);
|
||||
@ -1563,14 +1591,18 @@ static void show_dirstat(struct diff_options *options)
|
||||
/*
|
||||
* Original minus copied is the removed material,
|
||||
* added is the new material. They are both damages
|
||||
* made to the preimage. In --dirstat-by-file mode, count
|
||||
* damaged files, not damaged lines. This is done by
|
||||
* counting only a single damaged line per file.
|
||||
* made to the preimage.
|
||||
* If the resulting damage is zero, we know that
|
||||
* diffcore_count_changes() considers the two entries to
|
||||
* be identical, but since content_changed is true, we
|
||||
* know that there must have been _some_ kind of change,
|
||||
* so we force all entries to have damage > 0.
|
||||
*/
|
||||
damage = (p->one->size - copied) + added;
|
||||
if (DIFF_OPT_TST(options, DIRSTAT_BY_FILE) && damage > 0)
|
||||
if (!damage)
|
||||
damage = 1;
|
||||
|
||||
found_damage:
|
||||
ALLOC_GROW(dir.files, dir.nr + 1, dir.alloc);
|
||||
dir.files[dir.nr].name = name;
|
||||
dir.files[dir.nr].changed = damage;
|
||||
|
||||
Reference in New Issue
Block a user