diff --git a/modules/git/repo_compare.go b/modules/git/repo_compare.go index 98a1930ac2..f97d7b67fa 100644 --- a/modules/git/repo_compare.go +++ b/modules/git/repo_compare.go @@ -189,7 +189,7 @@ var ( // `useMergebase` is specified then the merge base between `base` and `head` is // used to compare against `head`. func (repo *Repository) GetShortStat(base, head string, useMergebase bool) (numFiles, totalAdditions, totalDeletions int, err error) { - cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat") + cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat", "--find-renames") if useMergebase { cmd = cmd.AddArguments("--merge-base") } @@ -211,7 +211,7 @@ func (repo *Repository) GetShortStat(base, head string, useMergebase bool) (numF // GetCommitShortStat returns the number of files, total additions and total deletions the commit has. func (repo *Repository) GetCommitShortStat(commitID string) (numFiles, totalAdditions, totalDeletions int, err error) { - cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat", "--no-commit-id", "--root").AddDynamicArguments(commitID) + cmd := NewCommand(repo.Ctx, "diff-tree", "--shortstat", "--no-commit-id", "--root", "--find-renames").AddDynamicArguments(commitID) stdout, _, err := cmd.RunStdString(&RunOpts{Dir: repo.Path}) if err != nil { return 0, 0, 0, err diff --git a/modules/git/repo_compare_test.go b/modules/git/repo_compare_test.go index fcdc256112..aa8e92e0ea 100644 --- a/modules/git/repo_compare_test.go +++ b/modules/git/repo_compare_test.go @@ -242,6 +242,18 @@ func TestGetCommitShortStat(t *testing.T) { assert.Equal(t, 6, totalAddition) assert.Equal(t, 0, totalDeletions) }) + + t.Run("Renames", func(t *testing.T) { + repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "renames")) + require.NoError(t, err) + defer repo.Close() + + numFiles, totalAddition, totalDeletions, err := repo.GetCommitShortStat("f667f3a24223414e3bfbe01ab6e445c703ab8e25") + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Zero(t, totalAddition) + assert.Zero(t, totalDeletions) + }) } func TestGetShortStat(t *testing.T) { @@ -301,6 +313,28 @@ func TestGetShortStat(t *testing.T) { assert.Zero(t, totalAdditions) assert.Zero(t, totalDeletions) }) + + t.Run("Renames", func(t *testing.T) { + repo, err := OpenRepository(t.Context(), filepath.Join(testReposDir, "renames")) + require.NoError(t, err) + defer repo.Close() + + t.Run("Only rename", func(t *testing.T) { + numFiles, totalAdditions, totalDeletions, err := repo.GetShortStat("bc40f00489096a7d4090a609a6572f528e1acb76", "f667f3a24223414e3bfbe01ab6e445c703ab8e25", true) + require.NoError(t, err) + assert.Equal(t, 1, numFiles) + assert.Zero(t, totalAdditions) + assert.Zero(t, totalDeletions) + }) + + t.Run("Too much diverged", func(t *testing.T) { + numFiles, totalAdditions, totalDeletions, err := repo.GetShortStat("bc40f00489096a7d4090a609a6572f528e1acb76", "acdee217ada3fea6e503acfb969724cc799fc516", true) + require.NoError(t, err) + assert.Equal(t, 2, numFiles) + assert.Equal(t, 3, totalAdditions) + assert.Equal(t, 1, totalDeletions) + }) + }) } func TestGetMergeBaseSimple(t *testing.T) { diff --git a/modules/git/tests/repos/renames/HEAD b/modules/git/tests/repos/renames/HEAD new file mode 100644 index 0000000000..b870d82622 --- /dev/null +++ b/modules/git/tests/repos/renames/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/modules/git/tests/repos/renames/config b/modules/git/tests/repos/renames/config new file mode 100644 index 0000000000..4ea33d92c0 --- /dev/null +++ b/modules/git/tests/repos/renames/config @@ -0,0 +1,6 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = true +[remote "origin"] + url = /home/gusted/Desktop/renames diff --git a/modules/git/tests/repos/renames/objects/info/commit-graph b/modules/git/tests/repos/renames/objects/info/commit-graph new file mode 100644 index 0000000000..383b1bc443 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/info/commit-graph differ diff --git a/modules/git/tests/repos/renames/objects/info/packs b/modules/git/tests/repos/renames/objects/info/packs new file mode 100644 index 0000000000..226626bf64 --- /dev/null +++ b/modules/git/tests/repos/renames/objects/info/packs @@ -0,0 +1,3 @@ +P pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.pack +P pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.pack + diff --git a/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.idx b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.idx new file mode 100644 index 0000000000..7e7196c5c8 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.idx differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.mtimes b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.mtimes new file mode 100644 index 0000000000..31e93d8189 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.mtimes differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.pack b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.pack new file mode 100644 index 0000000000..880b956c0c Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.pack differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.rev b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.rev new file mode 100644 index 0000000000..d2a0203abc Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-3c04d9ebf3e2c4620d7142f736b92d739834e2d4.rev differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.bitmap b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.bitmap new file mode 100644 index 0000000000..43debf60a7 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.bitmap differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.idx b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.idx new file mode 100644 index 0000000000..4c69d3a347 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.idx differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.pack b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.pack new file mode 100644 index 0000000000..8b808eb5f2 Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.pack differ diff --git a/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.rev b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.rev new file mode 100644 index 0000000000..44f5b3412e Binary files /dev/null and b/modules/git/tests/repos/renames/objects/pack/pack-d1cbea94fcad36c556cd5921e8df7feff7cbbbb2.rev differ diff --git a/modules/git/tests/repos/renames/packed-refs b/modules/git/tests/repos/renames/packed-refs new file mode 100644 index 0000000000..0688fe7613 --- /dev/null +++ b/modules/git/tests/repos/renames/packed-refs @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled sorted +acdee217ada3fea6e503acfb969724cc799fc516 refs/heads/main diff --git a/modules/git/tests/repos/renames/refs/heads/.gitkeep b/modules/git/tests/repos/renames/refs/heads/.gitkeep new file mode 100644 index 0000000000..e69de29bb2