mirror of
https://github.com/go-gitea/gitea.git
synced 2024-12-24 04:23:47 +08:00
8d11946d67
Backport #31778 by @lunny Fix #31738 When pushing a new branch, the old commit is zero. Most git commands cannot recognize the zero commit id. To get the changed files in the push, we need to get the first diverge commit of this branch. In most situations, we could check commits one by one until one commit is contained by another branch. Then we will think that commit is the diverge point. And in a pre-receive hook, this will be more difficult because all commits haven't been merged and they actually stored in a temporary place by git. So we need to bring some envs to let git know the commit exist. Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
104 lines
3.5 KiB
Go
104 lines
3.5 KiB
Go
// Copyright 2018 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package git
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestRepository_GetCommitBranches(t *testing.T) {
|
|
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
|
|
bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path)
|
|
assert.NoError(t, err)
|
|
defer bareRepo1.Close()
|
|
|
|
// these test case are specific to the repo1_bare test repo
|
|
testCases := []struct {
|
|
CommitID string
|
|
ExpectedBranches []string
|
|
}{
|
|
{"2839944139e0de9737a044f78b0e4b40d989a9e3", []string{"branch1"}},
|
|
{"5c80b0245c1c6f8343fa418ec374b13b5d4ee658", []string{"branch2"}},
|
|
{"37991dec2c8e592043f47155ce4808d4580f9123", []string{"master"}},
|
|
{"95bb4d39648ee7e325106df01a621c530863a653", []string{"branch1", "branch2"}},
|
|
{"8d92fc957a4d7cfd98bc375f0b7bb189a0d6c9f2", []string{"branch2", "master"}},
|
|
{"master", []string{"master"}},
|
|
}
|
|
for _, testCase := range testCases {
|
|
commit, err := bareRepo1.GetCommit(testCase.CommitID)
|
|
assert.NoError(t, err)
|
|
branches, err := bareRepo1.getBranches(os.Environ(), commit.ID.String(), 2)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, testCase.ExpectedBranches, branches)
|
|
}
|
|
}
|
|
|
|
func TestGetTagCommitWithSignature(t *testing.T) {
|
|
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
|
|
bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path)
|
|
assert.NoError(t, err)
|
|
defer bareRepo1.Close()
|
|
|
|
// both the tag and the commit are signed here, this validates only the commit signature
|
|
commit, err := bareRepo1.GetCommit("28b55526e7100924d864dd89e35c1ea62e7a5a32")
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, commit)
|
|
assert.NotNil(t, commit.Signature)
|
|
// test that signature is not in message
|
|
assert.Equal(t, "signed-commit\n", commit.CommitMessage)
|
|
}
|
|
|
|
func TestGetCommitWithBadCommitID(t *testing.T) {
|
|
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
|
|
bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path)
|
|
assert.NoError(t, err)
|
|
defer bareRepo1.Close()
|
|
|
|
commit, err := bareRepo1.GetCommit("bad_branch")
|
|
assert.Nil(t, commit)
|
|
assert.Error(t, err)
|
|
assert.True(t, IsErrNotExist(err))
|
|
}
|
|
|
|
func TestIsCommitInBranch(t *testing.T) {
|
|
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
|
|
bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path)
|
|
assert.NoError(t, err)
|
|
defer bareRepo1.Close()
|
|
|
|
result, err := bareRepo1.IsCommitInBranch("2839944139e0de9737a044f78b0e4b40d989a9e3", "branch1")
|
|
assert.NoError(t, err)
|
|
assert.True(t, result)
|
|
|
|
result, err = bareRepo1.IsCommitInBranch("2839944139e0de9737a044f78b0e4b40d989a9e3", "branch2")
|
|
assert.NoError(t, err)
|
|
assert.False(t, result)
|
|
}
|
|
|
|
func TestRepository_CommitsBetweenIDs(t *testing.T) {
|
|
bareRepo1Path := filepath.Join(testReposDir, "repo4_commitsbetween")
|
|
bareRepo1, err := openRepositoryWithDefaultContext(bareRepo1Path)
|
|
assert.NoError(t, err)
|
|
defer bareRepo1.Close()
|
|
|
|
cases := []struct {
|
|
OldID string
|
|
NewID string
|
|
ExpectedCommits int
|
|
}{
|
|
{"fdc1b615bdcff0f0658b216df0c9209e5ecb7c78", "78a445db1eac62fe15e624e1137965969addf344", 1}, // com1 -> com2
|
|
{"78a445db1eac62fe15e624e1137965969addf344", "fdc1b615bdcff0f0658b216df0c9209e5ecb7c78", 0}, // reset HEAD~, com2 -> com1
|
|
{"78a445db1eac62fe15e624e1137965969addf344", "a78e5638b66ccfe7e1b4689d3d5684e42c97d7ca", 1}, // com2 -> com2_new
|
|
}
|
|
for i, c := range cases {
|
|
commits, err := bareRepo1.CommitsBetweenIDs(c.NewID, c.OldID)
|
|
assert.NoError(t, err)
|
|
assert.Len(t, commits, c.ExpectedCommits, "case %d", i)
|
|
}
|
|
}
|