@ -1538,8 +1538,36 @@ static void show_dirstat(struct diff_options *options)
struct diff_filepair *p = q->queue[i];
struct diff_filepair *p = q->queue[i];
const char *name;
const char *name;
unsigned long copied, added, damage;
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)) {
if (DIFF_FILE_VALID(p->one) && DIFF_FILE_VALID(p->two)) {
diff_populate_filespec(p->one, 0);
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,
* Original minus copied is the removed material,
* added is the new material. They are both damages
* added is the new material. They are both damages
* made to the preimage. In --dirstat-by-file mode, count
* made to the preimage.
* damaged files, not damaged lines. This is done by
* If the resulting damage is zero, we know that
* counting only a single damaged line per file.
* 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;
damage = (p->one->size - copied) + added;
if (DIFF_OPT_TST(options, DIRSTAT_BY_FILE) && damage > 0)
if (!damage)
damage = 1;
damage = 1;
found_damage:
ALLOC_GROW(dir.files, dir.nr + 1, dir.alloc);
ALLOC_GROW(dir.files, dir.nr + 1, dir.alloc);
dir.files[dir.nr].name = name;
dir.files[dir.nr].name = name;
dir.files[dir.nr].changed = damage;
dir.files[dir.nr].changed = damage;