mirror of
https://github.com/git/git
synced 2024-08-28 20:20:07 +00:00
Merge branch 'jh/dirstat'
* 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:
commit
d98a509ec3
|
@ -72,6 +72,10 @@ endif::git-format-patch[]
|
||||||
a cut-off percent (3% by default) are not shown. The cut-off percent
|
a cut-off percent (3% by default) are not shown. The cut-off percent
|
||||||
can be set with `--dirstat=<limit>`. Changes in a child directory are not
|
can be set with `--dirstat=<limit>`. Changes in a child directory are not
|
||||||
counted for the parent directory, unless `--cumulative` is used.
|
counted for the parent directory, unless `--cumulative` is used.
|
||||||
|
+
|
||||||
|
Note that the `--dirstat` option computes the changes while ignoring
|
||||||
|
the amount of pure code movements within a file. In other words,
|
||||||
|
rearranging lines in a file is not counted as much as other changes.
|
||||||
|
|
||||||
--dirstat-by-file[=<limit>]::
|
--dirstat-by-file[=<limit>]::
|
||||||
Same as `--dirstat`, but counts changed files instead of lines.
|
Same as `--dirstat`, but counts changed files instead of lines.
|
||||||
|
|
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];
|
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;
|
||||||
|
|
|
@ -80,18 +80,31 @@ test_expect_success setup '
|
||||||
|
|
||||||
git config log.showroot false &&
|
git config log.showroot false &&
|
||||||
git commit --amend &&
|
git commit --amend &&
|
||||||
|
|
||||||
|
GIT_AUTHOR_DATE="2006-06-26 00:06:00 +0000" &&
|
||||||
|
GIT_COMMITTER_DATE="2006-06-26 00:06:00 +0000" &&
|
||||||
|
export GIT_AUTHOR_DATE GIT_COMMITTER_DATE &&
|
||||||
|
git checkout -b rearrange initial &&
|
||||||
|
for i in B A; do echo $i; done >dir/sub &&
|
||||||
|
git add dir/sub &&
|
||||||
|
git commit -m "Rearranged lines in dir/sub" &&
|
||||||
|
git checkout master &&
|
||||||
|
|
||||||
git show-branch
|
git show-branch
|
||||||
'
|
'
|
||||||
|
|
||||||
: <<\EOF
|
: <<\EOF
|
||||||
! [initial] Initial
|
! [initial] Initial
|
||||||
* [master] Merge branch 'side'
|
* [master] Merge branch 'side'
|
||||||
! [side] Side
|
! [rearrange] Rearranged lines in dir/sub
|
||||||
---
|
! [side] Side
|
||||||
- [master] Merge branch 'side'
|
----
|
||||||
*+ [side] Side
|
+ [rearrange] Rearranged lines in dir/sub
|
||||||
* [master^] Second
|
- [master] Merge branch 'side'
|
||||||
+*+ [initial] Initial
|
* + [side] Side
|
||||||
|
* [master^] Third
|
||||||
|
* [master~2] Second
|
||||||
|
+*++ [initial] Initial
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
V=`git version | sed -e 's/^git version //' -e 's/\./\\./g'`
|
V=`git version | sed -e 's/^git version //' -e 's/\./\\./g'`
|
||||||
|
@ -287,6 +300,8 @@ diff --no-index --name-status -- dir2 dir
|
||||||
diff --no-index dir dir3
|
diff --no-index dir dir3
|
||||||
diff master master^ side
|
diff master master^ side
|
||||||
diff --dirstat master~1 master~2
|
diff --dirstat master~1 master~2
|
||||||
|
diff --dirstat initial rearrange
|
||||||
|
diff --dirstat-by-file initial rearrange
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
test_expect_success 'log -S requires an argument' '
|
test_expect_success 'log -S requires an argument' '
|
||||||
|
|
3
t/t4013/diff.diff_--dirstat-by-file_initial_rearrange
Normal file
3
t/t4013/diff.diff_--dirstat-by-file_initial_rearrange
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
$ git diff --dirstat-by-file initial rearrange
|
||||||
|
100.0% dir/
|
||||||
|
$
|
3
t/t4013/diff.diff_--dirstat_initial_rearrange
Normal file
3
t/t4013/diff.diff_--dirstat_initial_rearrange
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
$ git diff --dirstat initial rearrange
|
||||||
|
100.0% dir/
|
||||||
|
$
|
|
@ -1,7 +1,7 @@
|
||||||
$ git format-patch --stdout --cover-letter -n initial..master^
|
$ git format-patch --stdout --cover-letter -n initial..master^
|
||||||
From 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 Mon Sep 17 00:00:00 2001
|
From 9a6d4949b6b76956d9d5e26f2791ec2ceff5fdc0 Mon Sep 17 00:00:00 2001
|
||||||
From: C O Mitter <committer@example.com>
|
From: C O Mitter <committer@example.com>
|
||||||
Date: Mon, 26 Jun 2006 00:05:00 +0000
|
Date: Mon, 26 Jun 2006 00:06:00 +0000
|
||||||
Subject: [DIFFERENT_PREFIX 0/2] *** SUBJECT HERE ***
|
Subject: [DIFFERENT_PREFIX 0/2] *** SUBJECT HERE ***
|
||||||
|
|
||||||
*** BLURB HERE ***
|
*** BLURB HERE ***
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
$ git log --decorate=full --all
|
$ git log --decorate=full --all
|
||||||
|
commit cd4e72fd96faed3f0ba949dc42967430374e2290 (refs/heads/rearrange)
|
||||||
|
Author: A U Thor <author@example.com>
|
||||||
|
Date: Mon Jun 26 00:06:00 2006 +0000
|
||||||
|
|
||||||
|
Rearranged lines in dir/sub
|
||||||
|
|
||||||
commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (HEAD, refs/heads/master)
|
commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (HEAD, refs/heads/master)
|
||||||
Merge: 9a6d494 c7a2ab9
|
Merge: 9a6d494 c7a2ab9
|
||||||
Author: A U Thor <author@example.com>
|
Author: A U Thor <author@example.com>
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
$ git log --decorate --all
|
$ git log --decorate --all
|
||||||
|
commit cd4e72fd96faed3f0ba949dc42967430374e2290 (rearrange)
|
||||||
|
Author: A U Thor <author@example.com>
|
||||||
|
Date: Mon Jun 26 00:06:00 2006 +0000
|
||||||
|
|
||||||
|
Rearranged lines in dir/sub
|
||||||
|
|
||||||
commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (HEAD, master)
|
commit 59d314ad6f356dd08601a4cd5e530381da3e3c64 (HEAD, master)
|
||||||
Merge: 9a6d494 c7a2ab9
|
Merge: 9a6d494 c7a2ab9
|
||||||
Author: A U Thor <author@example.com>
|
Author: A U Thor <author@example.com>
|
||||||
|
|
Loading…
Reference in a new issue