This commit is contained in:
Lunny Xiao 2025-01-02 21:11:17 -08:00
parent d08942e300
commit 33286791a2
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
3 changed files with 253 additions and 125 deletions

View File

@ -93,3 +93,41 @@
is_deleted: false is_deleted: false
deleted_by_id: 0 deleted_by_id: 0
deleted_unix: 0 deleted_unix: 0
-
id: 16
repo_id: 1
name: 'DefaultBranch'
commit_id: '90c1019714259b24fb81711d4416ac0f18667dfa'
commit_message: 'add license'
commit_time: 1709259547
pusher_id: 1
is_deleted: false
-
id: 17
repo_id: 1
name: 'develop'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'first commit'
commit_time: 978307100
pusher_id: 1
-
id: 18
repo_id: 11
name: 'develop'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'Initial commit'
commit_time: 1489956479
pusher_id: 1
-
id: 19
repo_id: 10
name: 'DefaultBranch'
commit_id: '65f1bf27bc3bf70f64657658635e66094edbcb4d'
commit_message: 'Initial commit'
commit_time: 1489956479
pusher_id: 1
is_deleted: false

View File

@ -169,7 +169,7 @@ func findHeadRepoFromRootBase(ctx context.Context, baseRepo *repo_model.Reposito
return nil, nil return nil, nil
} }
// test if we are lucky // test if we are lucky
repo, err := repo_model.GetUserFork(ctx, headUserID, baseRepo.ID) repo, err := repo_model.GetUserFork(ctx, baseRepo.ID, headUserID)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -10,6 +10,7 @@ import (
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo" repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest" "code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/gitrepo" "code.gitea.io/gitea/modules/gitrepo"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -144,185 +145,274 @@ func TestCompareRouters(t *testing.T) {
} }
func Test_ParseComparePathParams(t *testing.T) { func Test_ParseComparePathParams(t *testing.T) {
baseRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) assert.NoError(t, unittest.PrepareTestDatabase())
assert.NotNil(t, baseRepo)
assert.NoError(t, baseRepo.LoadOwner(db.DefaultContext)) repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
baseGitRepo, err := gitrepo.OpenRepository(context.Background(), baseRepo) assert.NotNil(t, repo1)
assert.NoError(t, repo1.LoadOwner(db.DefaultContext))
gitRepo1, err := gitrepo.OpenRepository(context.Background(), repo1)
assert.NoError(t, err) assert.NoError(t, err)
defer baseGitRepo.Close() defer gitRepo1.Close()
repo10 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10})
assert.NotNil(t, repo10)
assert.NoError(t, repo10.LoadOwner(db.DefaultContext))
gitRepo10, err := gitrepo.OpenRepository(context.Background(), repo10)
assert.NoError(t, err)
defer gitRepo10.Close()
repo11 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 11})
assert.NotNil(t, repo11)
assert.NoError(t, repo11.LoadOwner(db.DefaultContext))
gitRepo11, err := gitrepo.OpenRepository(context.Background(), repo11)
assert.NoError(t, err)
defer gitRepo11.Close()
assert.True(t, repo11.IsFork) // repo11 is a fork of repo10
kases := []struct { kases := []struct {
repoName string
hasClose bool
router string router string
compareInfo *CompareInfo compareInfo *CompareInfo
}{ }{
{ {
router: "main...develop", repoName: "repo1",
router: "master...branch2",
compareInfo: &CompareInfo{ compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{ CompareRouter: &CompareRouter{
BaseOriRef: "main", BaseOriRef: "master",
HeadOriRef: "develop", BaseFullRef: git.RefNameFromBranch("master"),
HeadOriRef: "branch2",
HeadFullRef: git.RefNameFromBranch("branch2"),
HeadOwnerName: repo1.OwnerName,
HeadRepoName: repo1.Name,
DotTimes: 3, DotTimes: 3,
}, },
BaseRepo: baseRepo, BaseRepo: repo1,
HeadUser: baseRepo.Owner, HeadUser: repo1.Owner,
HeadRepo: baseRepo, HeadRepo: repo1,
HeadGitRepo: baseGitRepo, HeadGitRepo: gitRepo1,
}, },
}, },
{ {
router: "main..develop", repoName: "repo1",
router: "DefaultBranch..branch2",
compareInfo: &CompareInfo{ compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{ CompareRouter: &CompareRouter{
BaseOriRef: "main", BaseOriRef: "DefaultBranch",
HeadOriRef: "develop", BaseFullRef: git.RefNameFromBranch("DefaultBranch"),
HeadOriRef: "branch2",
HeadFullRef: git.RefNameFromBranch("branch2"),
HeadOwnerName: repo1.Owner.Name,
HeadRepoName: repo1.Name,
DotTimes: 2, DotTimes: 2,
}, },
BaseRepo: baseRepo, BaseRepo: repo1,
HeadUser: baseRepo.Owner, HeadUser: repo1.Owner,
HeadRepo: baseRepo, HeadRepo: repo1,
HeadGitRepo: baseGitRepo, HeadGitRepo: gitRepo1,
}, },
}, },
{ {
router: "main^...develop", repoName: "repo1",
router: "DefaultBranch^...branch2",
compareInfo: &CompareInfo{ compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{ CompareRouter: &CompareRouter{
BaseOriRef: "main", BaseOriRef: "DefaultBranch",
HeadOriRef: "develop", BaseFullRef: git.RefNameFromBranch("DefaultBranch"),
HeadOriRef: "branch2",
HeadFullRef: git.RefNameFromBranch("branch2"),
HeadOwnerName: repo1.Owner.Name,
HeadRepoName: repo1.Name,
CaretTimes: 1, CaretTimes: 1,
DotTimes: 3, DotTimes: 3,
}, },
BaseRepo: baseRepo, BaseRepo: repo1,
HeadUser: baseRepo.Owner, HeadUser: repo1.Owner,
HeadRepo: baseRepo, HeadRepo: repo1,
HeadGitRepo: baseGitRepo, HeadGitRepo: gitRepo1,
}, },
}, },
{ {
router: "main^^^^^...develop", repoName: "repo1",
router: "branch2",
compareInfo: &CompareInfo{ compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{ CompareRouter: &CompareRouter{
BaseOriRef: "main", BaseOriRef: repo1.DefaultBranch,
HeadOriRef: "develop", BaseFullRef: git.RefNameFromBranch(repo1.DefaultBranch),
CaretTimes: 5, HeadOriRef: "branch2",
HeadOwnerName: repo1.Owner.Name,
HeadRepoName: repo1.Name,
HeadFullRef: git.RefNameFromBranch("branch2"),
DotTimes: 3, DotTimes: 3,
}, },
BaseRepo: baseRepo, BaseRepo: repo1,
HeadUser: baseRepo.Owner, HeadUser: repo1.Owner,
HeadRepo: baseRepo, HeadRepo: repo1,
HeadGitRepo: baseGitRepo, HeadGitRepo: gitRepo1,
}, },
}, },
{ {
router: "develop", repoName: "repo10",
hasClose: true,
router: "user13/repo11:develop",
compareInfo: &CompareInfo{ compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{ CompareRouter: &CompareRouter{
BaseOriRef: baseRepo.DefaultBranch, BaseOriRef: repo10.DefaultBranch,
BaseFullRef: git.RefNameFromBranch(repo10.DefaultBranch),
HeadOwnerName: "user13",
HeadRepoName: "repo11",
HeadOriRef: "develop", HeadOriRef: "develop",
HeadFullRef: git.RefNameFromBranch("develop"),
DotTimes: 3, DotTimes: 3,
}, },
BaseRepo: baseRepo, BaseRepo: repo10,
HeadUser: baseRepo.Owner, HeadUser: repo11.Owner,
HeadRepo: baseRepo, HeadRepo: repo11,
HeadGitRepo: baseGitRepo, HeadGitRepo: gitRepo11,
}, },
}, },
{ {
router: "lunny/forked_repo:develop", repoName: "repo10",
hasClose: true,
router: "master...user13/repo11:develop",
compareInfo: &CompareInfo{ compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{ CompareRouter: &CompareRouter{
BaseOriRef: baseRepo.DefaultBranch, BaseOriRef: "master",
HeadOwnerName: "lunny", BaseFullRef: git.RefNameFromBranch("master"),
HeadRepoName: "forked_repo", HeadOwnerName: "user13",
HeadRepoName: "repo11",
HeadOriRef: "develop", HeadOriRef: "develop",
HeadFullRef: git.RefNameFromBranch("develop"),
DotTimes: 3, DotTimes: 3,
}, },
BaseRepo: baseRepo, BaseRepo: repo10,
HeadUser: repo11.Owner,
HeadRepo: repo11,
HeadGitRepo: gitRepo11,
}, },
}, },
{ {
router: "main...lunny/forked_repo:develop", repoName: "repo10",
hasClose: true,
router: "DefaultBranch^...user13/repo11:develop",
compareInfo: &CompareInfo{ compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{ CompareRouter: &CompareRouter{
BaseOriRef: "main", BaseOriRef: "DefaultBranch",
HeadOwnerName: "lunny", BaseFullRef: git.RefNameFromBranch("DefaultBranch"),
HeadRepoName: "forked_repo", HeadOwnerName: "user13",
HeadOriRef: "develop", HeadRepoName: "repo11",
DotTimes: 3,
},
},
},
{
router: "main...lunny/forked_repo:develop",
compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{
BaseOriRef: "main",
HeadOwnerName: "lunny",
HeadRepoName: "forked_repo",
HeadOriRef: "develop",
DotTimes: 3,
},
},
},
{
router: "main^...lunny/forked_repo:develop",
compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{
BaseOriRef: "main",
HeadOwnerName: "lunny",
HeadRepoName: "forked_repo",
HeadOriRef: "develop", HeadOriRef: "develop",
HeadFullRef: git.RefNameFromBranch("develop"),
DotTimes: 3, DotTimes: 3,
CaretTimes: 1, CaretTimes: 1,
}, },
BaseRepo: repo10,
HeadUser: repo11.Owner,
HeadRepo: repo11,
HeadGitRepo: gitRepo11,
}, },
}, },
{ {
router: "v1.0...v1.1", repoName: "repo1",
router: "master...v1.1",
compareInfo: &CompareInfo{ compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{ CompareRouter: &CompareRouter{
BaseOriRef: "v1.0", BaseOriRef: "master",
BaseFullRef: git.RefNameFromBranch("master"),
HeadOwnerName: repo1.Owner.Name,
HeadRepoName: repo1.Name,
HeadOriRef: "v1.1", HeadOriRef: "v1.1",
HeadFullRef: git.RefNameFromTag("v1.1"),
DotTimes: 3, DotTimes: 3,
}, },
BaseRepo: repo1,
HeadUser: repo1.Owner,
HeadRepo: repo1,
HeadGitRepo: gitRepo1,
}, },
}, },
{ {
router: "teabot-patch-1...v0.0.1", repoName: "repo10",
hasClose: true,
router: "user13:develop",
compareInfo: &CompareInfo{ compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{ CompareRouter: &CompareRouter{
BaseOriRef: "teabot-patch-1", BaseOriRef: repo10.DefaultBranch,
HeadOriRef: "v0.0.1", BaseFullRef: git.RefNameFromBranch(repo10.DefaultBranch),
HeadOwnerName: "user13",
HeadOriRef: "develop",
HeadFullRef: git.RefNameFromBranch("develop"),
DotTimes: 3, DotTimes: 3,
}, },
BaseRepo: repo10,
HeadUser: repo11.Owner,
HeadRepo: repo11,
HeadGitRepo: gitRepo11,
}, },
}, },
{ {
router: "teabot:feature1", repoName: "repo1",
router: "65f1bf27bc3bf70f64657658635e66094edbcb4d...90c1019714259b24fb81711d4416ac0f18667dfa",
compareInfo: &CompareInfo{ compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{ CompareRouter: &CompareRouter{
HeadOwnerName: "teabot", BaseOriRef: "65f1bf27bc3bf70f64657658635e66094edbcb4d",
HeadOriRef: "feature1", BaseFullRef: git.RefName("65f1bf27bc3bf70f64657658635e66094edbcb4d"),
HeadOwnerName: repo1.Owner.Name,
HeadRepoName: repo1.Name,
HeadOriRef: "90c1019714259b24fb81711d4416ac0f18667dfa",
HeadFullRef: git.RefName("90c1019714259b24fb81711d4416ac0f18667dfa"),
DotTimes: 3, DotTimes: 3,
}, },
BaseRepo: repo1,
HeadUser: repo1.Owner,
HeadRepo: repo1,
HeadGitRepo: gitRepo1,
IsBaseCommit: true,
IsHeadCommit: true,
}, },
}, },
{ {
router: "8eb19a5ae19abae15c0666d4ab98906139a7f439...283c030497b455ecfa759d4649f9f8b45158742e", repoName: "repo1",
router: "5c050d3b6d2db231ab1f64e324f1b6b9a0b181c2^...985f0301dba5e7b34be866819cd15ad3d8f508ee",
compareInfo: &CompareInfo{ compareInfo: &CompareInfo{
CompareRouter: &CompareRouter{ CompareRouter: &CompareRouter{
BaseOriRef: "8eb19a5ae19abae15c0666d4ab98906139a7f439", BaseOriRef: "5c050d3b6d2db231ab1f64e324f1b6b9a0b181c2",
HeadOriRef: "283c030497b455ecfa759d4649f9f8b45158742e", BaseFullRef: git.RefName("5c050d3b6d2db231ab1f64e324f1b6b9a0b181c2"),
HeadOwnerName: repo1.Owner.Name,
HeadRepoName: repo1.Name,
HeadOriRef: "985f0301dba5e7b34be866819cd15ad3d8f508ee",
HeadFullRef: git.RefName("985f0301dba5e7b34be866819cd15ad3d8f508ee"),
DotTimes: 3, DotTimes: 3,
CaretTimes: 1,
}, },
BaseRepo: repo1,
HeadUser: repo1.Owner,
HeadRepo: repo1,
HeadGitRepo: gitRepo1,
IsBaseCommit: true,
IsHeadCommit: true,
}, },
}, },
} }
for _, kase := range kases { for _, kase := range kases {
t.Run(kase.router, func(t *testing.T) { t.Run(kase.router, func(t *testing.T) {
var baseRepo *repo_model.Repository
var baseGitRepo *git.Repository
if kase.repoName == "repo1" {
baseRepo = repo1
baseGitRepo = gitRepo1
} else if kase.repoName == "repo10" {
baseRepo = repo10
baseGitRepo = gitRepo10
}
r, err := ParseComparePathParams(context.Background(), kase.router, baseRepo, baseGitRepo) r, err := ParseComparePathParams(context.Background(), kase.router, baseRepo, baseGitRepo)
assert.NoError(t, err) assert.NoError(t, err)
if kase.hasClose {
assert.NotNil(t, r.close)
r.close = nil // close is a function, so we can't compare it
}
assert.EqualValues(t, kase.compareInfo, r) assert.EqualValues(t, kase.compareInfo, r)
}) })
} }