Skip to content

Commit ba25ea6

Browse files
committed
some improvements
1 parent ca0ecf1 commit ba25ea6

File tree

9 files changed

+86
-104
lines changed

9 files changed

+86
-104
lines changed

models/migrations/v1_12/v136.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,30 @@ package v1_12
66
import (
77
"fmt"
88
"math"
9-
"path/filepath"
109
"strings"
1110
"time"
1211

13-
"code.gitea.io/gitea/modules/git"
12+
"code.gitea.io/gitea/modules/gitrepo"
1413
"code.gitea.io/gitea/modules/graceful"
1514
"code.gitea.io/gitea/modules/log"
1615
"code.gitea.io/gitea/modules/setting"
1716

1817
"xorm.io/xorm"
1918
)
2019

21-
func AddCommitDivergenceToPulls(x *xorm.Engine) error {
22-
type Repository struct {
23-
ID int64 `xorm:"pk autoincr"`
24-
OwnerID int64 `xorm:"UNIQUE(s) index"`
25-
OwnerName string
26-
LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
27-
Name string `xorm:"INDEX NOT NULL"`
28-
}
20+
type Repository struct {
21+
ID int64 `xorm:"pk autoincr"`
22+
OwnerID int64 `xorm:"UNIQUE(s) index"`
23+
OwnerName string
24+
LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
25+
Name string `xorm:"INDEX NOT NULL"`
26+
}
2927

28+
func (r *Repository) RelativePath() string {
29+
return fmt.Sprintf("%s/%s.git", strings.ToLower(r.OwnerName), strings.ToLower(r.Name))
30+
}
31+
32+
func AddCommitDivergenceToPulls(x *xorm.Engine) error {
3033
type PullRequest struct {
3134
ID int64 `xorm:"pk autoincr"`
3235
IssueID int64 `xorm:"INDEX"`
@@ -85,12 +88,10 @@ func AddCommitDivergenceToPulls(x *xorm.Engine) error {
8588
log.Error("Missing base repo with id %d for PR ID %d", pr.BaseRepoID, pr.ID)
8689
continue
8790
}
88-
userPath := filepath.Join(setting.RepoRootPath, strings.ToLower(baseRepo.OwnerName))
89-
repoPath := filepath.Join(userPath, strings.ToLower(baseRepo.Name)+".git")
9091

9192
gitRefName := fmt.Sprintf("refs/pull/%d/head", pr.Index)
9293

93-
divergence, err := git.GetDivergingCommits(graceful.GetManager().HammerContext(), repoPath, pr.BaseBranch, gitRefName)
94+
divergence, err := gitrepo.GetDivergingCommits(graceful.GetManager().HammerContext(), baseRepo, pr.BaseBranch, gitRefName)
9495
if err != nil {
9596
log.Warn("Could not recalculate Divergence for pull: %d", pr.ID)
9697
pr.CommitsAhead = 0

modules/git/repo.go

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -242,36 +242,6 @@ func GetLatestCommitTime(ctx context.Context, repoPath string) (time.Time, error
242242
return time.Parse("Mon Jan _2 15:04:05 2006 -0700", commitTime)
243243
}
244244

245-
// DivergeObject represents commit count diverging commits
246-
type DivergeObject struct {
247-
Ahead int
248-
Behind int
249-
}
250-
251-
// GetDivergingCommits returns the number of commits a targetBranch is ahead or behind a baseBranch
252-
func GetDivergingCommits(ctx context.Context, repoPath, baseBranch, targetBranch string) (do DivergeObject, err error) {
253-
cmd := NewCommand("rev-list", "--count", "--left-right").
254-
AddDynamicArguments(baseBranch + "..." + targetBranch).AddArguments("--")
255-
stdout, _, err := cmd.RunStdString(ctx, &RunOpts{Dir: repoPath})
256-
if err != nil {
257-
return do, err
258-
}
259-
left, right, found := strings.Cut(strings.Trim(stdout, "\n"), "\t")
260-
if !found {
261-
return do, fmt.Errorf("git rev-list output is missing a tab: %q", stdout)
262-
}
263-
264-
do.Behind, err = strconv.Atoi(left)
265-
if err != nil {
266-
return do, err
267-
}
268-
do.Ahead, err = strconv.Atoi(right)
269-
if err != nil {
270-
return do, err
271-
}
272-
return do, nil
273-
}
274-
275245
// CreateBundle create bundle content to the target path
276246
func (repo *Repository) CreateBundle(ctx context.Context, commit string, out io.Writer) error {
277247
tmp, cleanup, err := setting.AppDataTempDir("git-repo-content").MkdirTempRandom("gitea-bundle")

modules/git/repo_test.go

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,3 @@ func TestRepoIsEmpty(t *testing.T) {
2929
assert.NoError(t, err)
3030
assert.True(t, isEmpty)
3131
}
32-
33-
func TestRepoGetDivergingCommits(t *testing.T) {
34-
bareRepo1Path := filepath.Join(testReposDir, "repo1_bare")
35-
do, err := GetDivergingCommits(t.Context(), bareRepo1Path, "master", "branch2")
36-
assert.NoError(t, err)
37-
assert.Equal(t, DivergeObject{
38-
Ahead: 1,
39-
Behind: 5,
40-
}, do)
41-
42-
do, err = GetDivergingCommits(t.Context(), bareRepo1Path, "master", "master")
43-
assert.NoError(t, err)
44-
assert.Equal(t, DivergeObject{
45-
Ahead: 0,
46-
Behind: 0,
47-
}, do)
48-
49-
do, err = GetDivergingCommits(t.Context(), bareRepo1Path, "master", "test")
50-
assert.NoError(t, err)
51-
assert.Equal(t, DivergeObject{
52-
Ahead: 0,
53-
Behind: 2,
54-
}, do)
55-
}

modules/gitrepo/diverging.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package gitrepo
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"strconv"
10+
"strings"
11+
12+
"code.gitea.io/gitea/modules/git"
13+
)
14+
15+
// DivergeObject represents commit count diverging commits
16+
type DivergeObject struct {
17+
Ahead int
18+
Behind int
19+
}
20+
21+
// GetDivergingCommits returns the number of commits a targetBranch is ahead or behind a baseBranch
22+
func GetDivergingCommits(ctx context.Context, repo Repository, baseBranch, targetBranch string) (*DivergeObject, error) {
23+
cmd := git.NewCommand("rev-list", "--count", "--left-right").
24+
AddDynamicArguments(baseBranch + "..." + targetBranch).AddArguments("--")
25+
stdout, _, err1 := cmd.RunStdString(ctx, &git.RunOpts{Dir: repoPath(repo)})
26+
if err1 != nil {
27+
return nil, err1
28+
}
29+
left, right, found := strings.Cut(strings.Trim(stdout, "\n"), "\t")
30+
if !found {
31+
return nil, fmt.Errorf("git rev-list output is missing a tab: %q", stdout)
32+
}
33+
34+
var do DivergeObject
35+
var err error
36+
do.Behind, err = strconv.Atoi(left)
37+
if err != nil {
38+
return nil, err
39+
}
40+
do.Ahead, err = strconv.Atoi(right)
41+
if err != nil {
42+
return nil, err
43+
}
44+
return &do, nil
45+
}

services/pull/pull.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ func NewPullRequest(ctx context.Context, opts *NewPullRequestOptions) error {
140140
}
141141

142142
// update commits ahead and behind
143-
divergence, err := git.GetDivergingCommits(ctx, pr.BaseRepo.RepoPath(), pr.BaseBranch, pr.GetGitHeadRefName())
143+
divergence, err := GetDiverging(ctx, pr)
144144
if err != nil {
145145
return err
146146
}
@@ -308,7 +308,7 @@ func ChangeTargetBranch(ctx context.Context, pr *issues_model.PullRequest, doer
308308
}
309309

310310
// update commits ahead and behind
311-
divergence, err := git.GetDivergingCommits(ctx, pr.BaseRepo.RepoPath(), pr.BaseBranch, pr.GetGitHeadRefName())
311+
divergence, err := GetDiverging(ctx, pr)
312312
if err != nil {
313313
return err
314314
}
@@ -446,9 +446,9 @@ func AddTestPullRequestTask(opts TestPullRequestOptions) {
446446
log.Error("MarkReviewsAsNotStale: %v", err)
447447
}
448448

449-
divergence, err := git.GetDivergingCommits(ctx, pr.BaseRepo.RepoPath(), pr.BaseBranch, pr.GetGitHeadRefName())
449+
divergence, err := GetDiverging(ctx, pr)
450450
if err != nil {
451-
log.Error("GetDivergingCommits: %v", err)
451+
log.Error("GetDiverging: %v", err)
452452
} else {
453453
err = pr.UpdateCommitDivergence(ctx, divergence.Ahead, divergence.Behind)
454454
if err != nil {
@@ -484,7 +484,8 @@ func AddTestPullRequestTask(opts TestPullRequestOptions) {
484484
return
485485
}
486486
for _, pr := range prs {
487-
divergence, err := git.GetDivergingCommits(ctx, baseRepo.RepoPath(), pr.BaseBranch, pr.GetGitHeadRefName())
487+
pr.BaseRepo = baseRepo
488+
divergence, err := GetDiverging(ctx, pr)
488489
if err != nil {
489490
if git_model.IsErrBranchNotExist(err) && !gitrepo.IsBranchExist(ctx, pr.HeadRepo, pr.HeadBranch) {
490491
log.Warn("Cannot test PR %s/%d: head_branch %s no longer exists", pr.BaseRepo.Name, pr.IssueID, pr.HeadBranch)

services/pull/update.go

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
repo_model "code.gitea.io/gitea/models/repo"
1515
"code.gitea.io/gitea/models/unit"
1616
user_model "code.gitea.io/gitea/models/user"
17-
"code.gitea.io/gitea/modules/git"
17+
"code.gitea.io/gitea/modules/gitrepo"
1818
"code.gitea.io/gitea/modules/globallock"
1919
"code.gitea.io/gitea/modules/log"
2020
"code.gitea.io/gitea/modules/repository"
@@ -39,7 +39,7 @@ func Update(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.
3939
return fmt.Errorf("unable to load BaseRepo for PR[%d] during update-by-merge: %w", pr.ID, err)
4040
}
4141

42-
diffCount, err := git.GetDivergingCommits(ctx, pr.BaseRepo.RepoPath(), pr.BaseBranch, pr.GetGitHeadRefName())
42+
diffCount, err := GetDiverging(ctx, pr)
4343
if err != nil {
4444
return err
4545
} else if diffCount.Behind == 0 {
@@ -178,17 +178,9 @@ func IsUserAllowedToUpdate(ctx context.Context, pull *issues_model.PullRequest,
178178
}
179179

180180
// GetDiverging determines how many commits a PR is ahead or behind the PR base branch
181-
func GetDiverging(ctx context.Context, pr *issues_model.PullRequest) (*git.DivergeObject, error) {
182-
log.Trace("GetDiverging[%-v]: compare commits", pr)
183-
prCtx, cancel, err := createTemporaryRepoForPR(ctx, pr)
184-
if err != nil {
185-
if !git_model.IsErrBranchNotExist(err) {
186-
log.Error("CreateTemporaryRepoForPR %-v: %v", pr, err)
187-
}
181+
func GetDiverging(ctx context.Context, pr *issues_model.PullRequest) (*gitrepo.DivergeObject, error) {
182+
if err := pr.LoadBaseRepo(ctx); err != nil {
188183
return nil, err
189184
}
190-
defer cancel()
191-
192-
diff, err := git.GetDivergingCommits(ctx, prCtx.tmpBasePath, baseBranch, trackingBranch)
193-
return &diff, err
185+
return gitrepo.GetDivergingCommits(ctx, pr.BaseRepo, pr.BaseBranch, pr.GetGitHeadRefName())
194186
}

services/repository/branch.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -123,23 +123,23 @@ func getDivergenceCacheKey(repoID int64, branchName string) string {
123123
}
124124

125125
// getDivergenceFromCache gets the divergence from cache
126-
func getDivergenceFromCache(repoID int64, branchName string) (*git.DivergeObject, bool) {
126+
func getDivergenceFromCache(repoID int64, branchName string) (*gitrepo.DivergeObject, bool) {
127127
data, ok := cache.GetCache().Get(getDivergenceCacheKey(repoID, branchName))
128-
res := git.DivergeObject{
128+
res := &gitrepo.DivergeObject{
129129
Ahead: -1,
130130
Behind: -1,
131131
}
132132
if !ok || data == "" {
133-
return &res, false
133+
return res, false
134134
}
135135
if err := json.Unmarshal(util.UnsafeStringToBytes(data), &res); err != nil {
136136
log.Error("json.UnMarshal failed: %v", err)
137-
return &res, false
137+
return res, false
138138
}
139-
return &res, true
139+
return res, true
140140
}
141141

142-
func putDivergenceFromCache(repoID int64, branchName string, divergence *git.DivergeObject) error {
142+
func putDivergenceFromCache(repoID int64, branchName string, divergence *gitrepo.DivergeObject) error {
143143
bs, err := json.Marshal(divergence)
144144
if err != nil {
145145
return err
@@ -178,7 +178,7 @@ func loadOneBranch(ctx context.Context, repo *repo_model.Repository, dbBranch *g
178178
p := protectedBranches.GetFirstMatched(branchName)
179179
isProtected := p != nil
180180

181-
var divergence *git.DivergeObject
181+
var divergence *gitrepo.DivergeObject
182182

183183
// it's not default branch
184184
if repo.DefaultBranch != dbBranch.Name && !dbBranch.IsDeleted {
@@ -199,7 +199,7 @@ func loadOneBranch(ctx context.Context, repo *repo_model.Repository, dbBranch *g
199199

200200
if divergence == nil {
201201
// tolerate the error that we cannot get divergence
202-
divergence = &git.DivergeObject{Ahead: -1, Behind: -1}
202+
divergence = &gitrepo.DivergeObject{Ahead: -1, Behind: -1}
203203
}
204204

205205
pr, err := issues_model.GetLatestPullRequestByHeadInfo(ctx, repo.ID, branchName)
@@ -720,7 +720,7 @@ func GetBranchDivergingInfo(ctx reqctx.RequestContext, baseRepo *repo_model.Repo
720720
// if the fork repo has new commits, this call will fail because they are not in the base repo
721721
// exit status 128 - fatal: Invalid symmetric difference expression aaaaaaaaaaaa...bbbbbbbbbbbb
722722
// so at the moment, we first check the update time, then check whether the fork branch has base's head
723-
diff, err := git.GetDivergingCommits(ctx, baseRepo.RepoPath(), baseGitBranch.CommitID, headGitBranch.CommitID)
723+
diff, err := gitrepo.GetDivergingCommits(ctx, baseRepo, baseGitBranch.CommitID, headGitBranch.CommitID)
724724
if err != nil {
725725
info.BaseHasNewCommits = baseGitBranch.UpdatedUnix > headGitBranch.UpdatedUnix
726726
if headRepo.IsFork && info.BaseHasNewCommits {

services/repository/files/commit.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,14 @@ import (
88

99
repo_model "code.gitea.io/gitea/models/repo"
1010
"code.gitea.io/gitea/modules/git"
11+
"code.gitea.io/gitea/modules/gitrepo"
1112
"code.gitea.io/gitea/modules/structs"
1213
asymkey_service "code.gitea.io/gitea/services/asymkey"
1314
)
1415

1516
// CountDivergingCommits determines how many commits a branch is ahead or behind the repository's base branch
16-
func CountDivergingCommits(ctx context.Context, repo *repo_model.Repository, branch string) (*git.DivergeObject, error) {
17-
divergence, err := git.GetDivergingCommits(ctx, repo.RepoPath(), repo.DefaultBranch, branch)
18-
if err != nil {
19-
return nil, err
20-
}
21-
return &divergence, nil
17+
func CountDivergingCommits(ctx context.Context, repo *repo_model.Repository, branch string) (*gitrepo.DivergeObject, error) {
18+
return gitrepo.GetDivergingCommits(ctx, repo, repo.DefaultBranch, branch)
2219
}
2320

2421
// GetPayloadCommitVerification returns the verification information of a commit

tests/integration/change_default_branch_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
repo_model "code.gitea.io/gitea/models/repo"
1313
"code.gitea.io/gitea/models/unittest"
1414
user_model "code.gitea.io/gitea/models/user"
15-
"code.gitea.io/gitea/modules/git"
15+
"code.gitea.io/gitea/modules/gitrepo"
1616
"code.gitea.io/gitea/tests"
1717

1818
"github.com/stretchr/testify/assert"
@@ -43,7 +43,7 @@ func TestChangeDefaultBranch(t *testing.T) {
4343
session.MakeRequest(t, req, http.StatusNotFound)
4444
}
4545

46-
func checkDivergence(t *testing.T, session *TestSession, branchesURL, expectedDefaultBranch string, expectedBranchToDivergence map[string]git.DivergeObject) {
46+
func checkDivergence(t *testing.T, session *TestSession, branchesURL, expectedDefaultBranch string, expectedBranchToDivergence map[string]*gitrepo.DivergeObject) {
4747
req := NewRequest(t, "GET", branchesURL)
4848
resp := session.MakeRequest(t, req, http.StatusOK)
4949

@@ -92,7 +92,7 @@ func TestChangeDefaultBranchDivergence(t *testing.T) {
9292
settingsBranchesURL := fmt.Sprintf("/%s/%s/settings/branches", owner.Name, repo.Name)
9393

9494
// check branch divergence before switching default branch
95-
expectedBranchToDivergenceBefore := map[string]git.DivergeObject{
95+
expectedBranchToDivergenceBefore := map[string]*gitrepo.DivergeObject{
9696
"not-signed": {
9797
Ahead: 0,
9898
Behind: 0,
@@ -119,7 +119,7 @@ func TestChangeDefaultBranchDivergence(t *testing.T) {
119119
session.MakeRequest(t, req, http.StatusSeeOther)
120120

121121
// check branch divergence after switching default branch
122-
expectedBranchToDivergenceAfter := map[string]git.DivergeObject{
122+
expectedBranchToDivergenceAfter := map[string]*gitrepo.DivergeObject{
123123
"master": {
124124
Ahead: 1,
125125
Behind: 0,

0 commit comments

Comments
 (0)