Skip to content

Commit 6c9c38a

Browse files
committed
Propagate context and ensure git commands run in request context
This PR continues the work in go-gitea#17125 by progressively ensuring that git commands run within the request context. Signed-off-by: Andrew Thornton <art27@cantab.net>
1 parent 4f81c7d commit 6c9c38a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+209
-196
lines changed

Diff for: cmd/admin.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,7 @@ func runRepoSyncReleases(_ *cli.Context) error {
565565
log.Trace("Processing next %d repos of %d", len(repos), count)
566566
for _, repo := range repos {
567567
log.Trace("Synchronizing repo %s with path %s", repo.FullName(), repo.RepoPath())
568-
gitRepo, err := git.OpenRepository(repo.RepoPath())
568+
gitRepo, err := git.OpenRepositoryCtx(ctx, repo.RepoPath())
569569
if err != nil {
570570
log.Warn("OpenRepository: %v", err)
571571
continue

Diff for: integrations/api_repo_get_contents_list_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func testAPIGetContentsList(t *testing.T, u *url.URL) {
7272

7373
// Make a new branch in repo1
7474
newBranch := "test_branch"
75-
err := repo_service.CreateNewBranch(user2, repo1, repo1.DefaultBranch, newBranch)
75+
err := repo_service.CreateNewBranch(git.DefaultContext, user2, repo1, repo1.DefaultBranch, newBranch)
7676
assert.NoError(t, err)
7777
// Get the commit ID of the default branch
7878
gitRepo, err := git.OpenRepository(repo1.RepoPath())

Diff for: integrations/api_repo_get_contents_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func testAPIGetContents(t *testing.T, u *url.URL) {
7373

7474
// Make a new branch in repo1
7575
newBranch := "test_branch"
76-
err := repo_service.CreateNewBranch(user2, repo1, repo1.DefaultBranch, newBranch)
76+
err := repo_service.CreateNewBranch(git.DefaultContext, user2, repo1, repo1.DefaultBranch, newBranch)
7777
assert.NoError(t, err)
7878
// Get the commit ID of the default branch
7979
gitRepo, err := git.OpenRepository(repo1.RepoPath())

Diff for: integrations/git_helper_for_declarative_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func doGitCloneFail(u *url.URL) func(*testing.T) {
128128
tmpDir, err := os.MkdirTemp("", "doGitCloneFail")
129129
assert.NoError(t, err)
130130
defer util.RemoveAll(tmpDir)
131-
assert.Error(t, git.Clone(u.String(), tmpDir, git.CloneRepoOptions{}))
131+
assert.Error(t, git.Clone(git.DefaultContext, u.String(), tmpDir, git.CloneRepoOptions{}))
132132
exist, err := util.IsExist(filepath.Join(tmpDir, "README.md"))
133133
assert.NoError(t, err)
134134
assert.False(t, exist)
@@ -138,7 +138,7 @@ func doGitCloneFail(u *url.URL) func(*testing.T) {
138138
func doGitInitTestRepository(dstPath string) func(*testing.T) {
139139
return func(t *testing.T) {
140140
// Init repository in dstPath
141-
assert.NoError(t, git.InitRepository(dstPath, false))
141+
assert.NoError(t, git.InitRepository(git.DefaultContext, dstPath, false))
142142
assert.NoError(t, os.WriteFile(filepath.Join(dstPath, "README.md"), []byte(fmt.Sprintf("# Testing Repository\n\nOriginally created in: %s", dstPath)), 0644))
143143
assert.NoError(t, git.AddChanges(dstPath, true))
144144
signature := git.Signature{

Diff for: integrations/pull_merge_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,11 @@ func TestCantMergeConflict(t *testing.T) {
240240
gitRepo, err := git.OpenRepository(models.RepoPath(user1.Name, repo1.Name))
241241
assert.NoError(t, err)
242242

243-
err = pull.Merge(pr, user1, gitRepo, models.MergeStyleMerge, "CONFLICT")
243+
err = pull.Merge(git.DefaultContext, pr, user1, gitRepo, models.MergeStyleMerge, "CONFLICT")
244244
assert.Error(t, err, "Merge should return an error due to conflict")
245245
assert.True(t, models.IsErrMergeConflicts(err), "Merge error is not a conflict error")
246246

247-
err = pull.Merge(pr, user1, gitRepo, models.MergeStyleRebase, "CONFLICT")
247+
err = pull.Merge(git.DefaultContext, pr, user1, gitRepo, models.MergeStyleRebase, "CONFLICT")
248248
assert.Error(t, err, "Merge should return an error due to conflict")
249249
assert.True(t, models.IsErrRebaseConflicts(err), "Merge error is not a conflict error")
250250
gitRepo.Close()
@@ -328,7 +328,7 @@ func TestCantMergeUnrelated(t *testing.T) {
328328
BaseBranch: "base",
329329
}).(*models.PullRequest)
330330

331-
err = pull.Merge(pr, user1, gitRepo, models.MergeStyleMerge, "UNRELATED")
331+
err = pull.Merge(git.DefaultContext, pr, user1, gitRepo, models.MergeStyleMerge, "UNRELATED")
332332
assert.Error(t, err, "Merge should return an error due to unrelated")
333333
assert.True(t, models.IsErrMergeUnrelatedHistories(err), "Merge error is not a unrelated histories error")
334334
gitRepo.Close()

Diff for: integrations/pull_update_test.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"code.gitea.io/gitea/models"
1414
"code.gitea.io/gitea/models/unittest"
1515
user_model "code.gitea.io/gitea/models/user"
16+
"code.gitea.io/gitea/modules/git"
1617
pull_service "code.gitea.io/gitea/services/pull"
1718
repo_service "code.gitea.io/gitea/services/repository"
1819
files_service "code.gitea.io/gitea/services/repository/files"
@@ -28,7 +29,7 @@ func TestAPIPullUpdate(t *testing.T) {
2829
pr := createOutdatedPR(t, user, org26)
2930

3031
//Test GetDiverging
31-
diffCount, err := pull_service.GetDiverging(pr)
32+
diffCount, err := pull_service.GetDiverging(git.DefaultContext, pr)
3233
assert.NoError(t, err)
3334
assert.EqualValues(t, 1, diffCount.Behind)
3435
assert.EqualValues(t, 1, diffCount.Ahead)
@@ -41,7 +42,7 @@ func TestAPIPullUpdate(t *testing.T) {
4142
session.MakeRequest(t, req, http.StatusOK)
4243

4344
//Test GetDiverging after update
44-
diffCount, err = pull_service.GetDiverging(pr)
45+
diffCount, err = pull_service.GetDiverging(git.DefaultContext, pr)
4546
assert.NoError(t, err)
4647
assert.EqualValues(t, 0, diffCount.Behind)
4748
assert.EqualValues(t, 2, diffCount.Ahead)
@@ -56,7 +57,7 @@ func TestAPIPullUpdateByRebase(t *testing.T) {
5657
pr := createOutdatedPR(t, user, org26)
5758

5859
//Test GetDiverging
59-
diffCount, err := pull_service.GetDiverging(pr)
60+
diffCount, err := pull_service.GetDiverging(git.DefaultContext, pr)
6061
assert.NoError(t, err)
6162
assert.EqualValues(t, 1, diffCount.Behind)
6263
assert.EqualValues(t, 1, diffCount.Ahead)
@@ -69,7 +70,7 @@ func TestAPIPullUpdateByRebase(t *testing.T) {
6970
session.MakeRequest(t, req, http.StatusOK)
7071

7172
//Test GetDiverging after update
72-
diffCount, err = pull_service.GetDiverging(pr)
73+
diffCount, err = pull_service.GetDiverging(git.DefaultContext, pr)
7374
assert.NoError(t, err)
7475
assert.EqualValues(t, 0, diffCount.Behind)
7576
assert.EqualValues(t, 1, diffCount.Ahead)
@@ -160,7 +161,7 @@ func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User) *models.Pul
160161
BaseRepo: baseRepo,
161162
Type: models.PullRequestGitea,
162163
}
163-
err = pull_service.NewPullRequest(baseRepo, pullIssue, nil, nil, pullRequest, nil)
164+
err = pull_service.NewPullRequest(git.DefaultContext, baseRepo, pullIssue, nil, nil, pullRequest, nil)
164165
assert.NoError(t, err)
165166

166167
issue := unittest.AssertExistsAndLoadBean(t, &models.Issue{Title: "Test Pull -to-update-"}).(*models.Issue)

Diff for: models/admin/notice.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ func CreateNotice(ctx context.Context, tp NoticeType, desc string, args ...inter
5656

5757
// CreateRepositoryNotice creates new system notice with type NoticeRepository.
5858
func CreateRepositoryNotice(desc string, args ...interface{}) error {
59+
// Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
5960
return CreateNotice(db.DefaultContext, NoticeRepository, desc, args...)
6061
}
6162

@@ -65,7 +66,8 @@ func RemoveAllWithNotice(ctx context.Context, title, path string) {
6566
if err := util.RemoveAll(path); err != nil {
6667
desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
6768
log.Warn(title+" [%s]: %v", path, err)
68-
if err = CreateNotice(ctx, NoticeRepository, desc); err != nil {
69+
// Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
70+
if err = CreateNotice(db.DefaultContext, NoticeRepository, desc); err != nil {
6971
log.Error("CreateRepositoryNotice: %v", err)
7072
}
7173
}
@@ -77,7 +79,9 @@ func RemoveStorageWithNotice(ctx context.Context, bucket storage.ObjectStorage,
7779
if err := bucket.Delete(path); err != nil {
7880
desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
7981
log.Warn(title+" [%s]: %v", path, err)
80-
if err = CreateNotice(ctx, NoticeRepository, desc); err != nil {
82+
83+
// Note we use the db.DefaultContext here rather than passing in a context as the context may be cancelled
84+
if err = CreateNotice(db.DefaultContext, NoticeRepository, desc); err != nil {
8185
log.Error("CreateRepositoryNotice: %v", err)
8286
}
8387
}

Diff for: modules/git/commit_info_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func cloneRepo(url, dir, name string) (string, error) {
2424
if _, err := os.Stat(repoDir); err == nil {
2525
return repoDir, nil
2626
}
27-
return repoDir, Clone(url, repoDir, CloneRepoOptions{
27+
return repoDir, Clone(DefaultContext, url, repoDir, CloneRepoOptions{
2828
Mirror: false,
2929
Bare: false,
3030
Quiet: true,

Diff for: modules/git/repo.go

+3-8
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,13 @@ func IsRepoURLAccessible(url string) bool {
6363
}
6464

6565
// InitRepository initializes a new Git repository.
66-
func InitRepository(repoPath string, bare bool) error {
66+
func InitRepository(ctx context.Context, repoPath string, bare bool) error {
6767
err := os.MkdirAll(repoPath, os.ModePerm)
6868
if err != nil {
6969
return err
7070
}
7171

72-
cmd := NewCommand("init")
72+
cmd := NewCommandContext(ctx, "init")
7373
if bare {
7474
cmd.AddArguments("--bare")
7575
}
@@ -104,12 +104,7 @@ type CloneRepoOptions struct {
104104
}
105105

106106
// Clone clones original repository to target path.
107-
func Clone(from, to string, opts CloneRepoOptions) error {
108-
return CloneWithContext(DefaultContext, from, to, opts)
109-
}
110-
111-
// CloneWithContext clones original repository to target path.
112-
func CloneWithContext(ctx context.Context, from, to string, opts CloneRepoOptions) error {
107+
func Clone(ctx context.Context, from, to string, opts CloneRepoOptions) error {
113108
cargs := make([]string, len(GlobalCommandArgs))
114109
copy(cargs, GlobalCommandArgs)
115110
return CloneWithArgs(ctx, from, to, cargs, opts)

Diff for: modules/git/repo_branch.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ func (repo *Repository) GetBranch(branch string) (*Branch, error) {
8888

8989
// GetBranchesByPath returns a branch by it's path
9090
// if limit = 0 it will not limit
91-
func GetBranchesByPath(path string, skip, limit int) ([]*Branch, int, error) {
92-
gitRepo, err := OpenRepository(path)
91+
func GetBranchesByPath(ctx context.Context, path string, skip, limit int) ([]*Branch, int, error) {
92+
gitRepo, err := OpenRepositoryCtx(ctx, path)
9393
if err != nil {
9494
return nil, 0, err
9595
}

Diff for: modules/indexer/code/bleve.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package code
66

77
import (
88
"bufio"
9+
"context"
910
"fmt"
1011
"io"
1112
"os"
@@ -271,11 +272,10 @@ func (b *BleveIndexer) Close() {
271272
}
272273

273274
// Index indexes the data
274-
func (b *BleveIndexer) Index(repo *models.Repository, sha string, changes *repoChanges) error {
275+
func (b *BleveIndexer) Index(ctx context.Context, repo *models.Repository, sha string, changes *repoChanges) error {
275276
batch := gitea_bleve.NewFlushingBatch(b.indexer, maxBatchSize)
276277
if len(changes.Updates) > 0 {
277-
278-
batchWriter, batchReader, cancel := git.CatFileBatch(git.DefaultContext, repo.RepoPath())
278+
batchWriter, batchReader, cancel := git.CatFileBatch(ctx, repo.RepoPath())
279279
defer cancel()
280280

281281
for _, update := range changes.Updates {

Diff for: modules/indexer/code/elastic_search.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -244,11 +244,11 @@ func (b *ElasticSearchIndexer) addDelete(filename string, repo *models.Repositor
244244
}
245245

246246
// Index will save the index data
247-
func (b *ElasticSearchIndexer) Index(repo *models.Repository, sha string, changes *repoChanges) error {
247+
func (b *ElasticSearchIndexer) Index(ctx context.Context, repo *models.Repository, sha string, changes *repoChanges) error {
248248
reqs := make([]elastic.BulkableRequest, 0)
249249
if len(changes.Updates) > 0 {
250250

251-
batchWriter, batchReader, cancel := git.CatFileBatch(git.DefaultContext, repo.RepoPath())
251+
batchWriter, batchReader, cancel := git.CatFileBatch(ctx, repo.RepoPath())
252252
defer cancel()
253253

254254
for _, update := range changes.Updates {

Diff for: modules/indexer/code/indexer.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ type SearchResultLanguages struct {
4242

4343
// Indexer defines an interface to index and search code contents
4444
type Indexer interface {
45-
Index(repo *models.Repository, sha string, changes *repoChanges) error
45+
Index(ctx context.Context, repo *models.Repository, sha string, changes *repoChanges) error
4646
Delete(repoID int64) error
4747
Search(repoIDs []int64, language, keyword string, page, pageSize int, isMatch bool) (int64, []*SearchResult, []*SearchResultLanguages, error)
4848
Close()
@@ -82,7 +82,7 @@ var (
8282
indexerQueue queue.UniqueQueue
8383
)
8484

85-
func index(indexer Indexer, repoID int64) error {
85+
func index(ctx context.Context, indexer Indexer, repoID int64) error {
8686
repo, err := models.GetRepositoryByID(repoID)
8787
if models.IsErrRepoNotExist(err) {
8888
return indexer.Delete(repoID)
@@ -102,7 +102,7 @@ func index(indexer Indexer, repoID int64) error {
102102
return nil
103103
}
104104

105-
if err := indexer.Index(repo, sha, changes); err != nil {
105+
if err := indexer.Index(ctx, repo, sha, changes); err != nil {
106106
return err
107107
}
108108

@@ -150,7 +150,7 @@ func Init() {
150150
}
151151
log.Trace("IndexerData Process Repo: %d", indexerData.RepoID)
152152

153-
if err := index(indexer, indexerData.RepoID); err != nil {
153+
if err := index(ctx, indexer, indexerData.RepoID); err != nil {
154154
log.Error("index: %v", err)
155155
continue
156156
}

Diff for: modules/indexer/code/indexer_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"testing"
1010

1111
"code.gitea.io/gitea/models/unittest"
12+
"code.gitea.io/gitea/modules/git"
1213

1314
"github.com/stretchr/testify/assert"
1415
)
@@ -20,7 +21,7 @@ func TestMain(m *testing.M) {
2021
func testIndexer(name string, t *testing.T, indexer Indexer) {
2122
t.Run(name, func(t *testing.T) {
2223
var repoID int64 = 1
23-
err := index(indexer, repoID)
24+
err := index(git.DefaultContext, indexer, repoID)
2425
assert.NoError(t, err)
2526
var (
2627
keywords = []struct {

Diff for: modules/indexer/code/wrapped.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package code
66

77
import (
8+
"context"
89
"fmt"
910
"sync"
1011

@@ -57,12 +58,12 @@ func (w *wrappedIndexer) get() (Indexer, error) {
5758
return w.internal, nil
5859
}
5960

60-
func (w *wrappedIndexer) Index(repo *models.Repository, sha string, changes *repoChanges) error {
61+
func (w *wrappedIndexer) Index(ctx context.Context, repo *models.Repository, sha string, changes *repoChanges) error {
6162
indexer, err := w.get()
6263
if err != nil {
6364
return err
6465
}
65-
return indexer.Index(repo, sha, changes)
66+
return indexer.Index(ctx, repo, sha, changes)
6667
}
6768

6869
func (w *wrappedIndexer) Delete(repoID int64) error {

Diff for: modules/repository/generate.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ func checkGiteaTemplate(tmpDir string) (*models.GiteaTemplate, error) {
9898
return gt, nil
9999
}
100100

101-
func generateRepoCommit(repo, templateRepo, generateRepo *models.Repository, tmpDir string) error {
101+
func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *models.Repository, tmpDir string) error {
102102
commitTimeStr := time.Now().Format(time.RFC3339)
103103
authorSig := repo.Owner.NewGitSig()
104104

@@ -114,7 +114,7 @@ func generateRepoCommit(repo, templateRepo, generateRepo *models.Repository, tmp
114114

115115
// Clone to temporary path and do the init commit.
116116
templateRepoPath := templateRepo.RepoPath()
117-
if err := git.Clone(templateRepoPath, tmpDir, git.CloneRepoOptions{
117+
if err := git.Clone(ctx, templateRepoPath, tmpDir, git.CloneRepoOptions{
118118
Depth: 1,
119119
Branch: templateRepo.DefaultBranch,
120120
}); err != nil {
@@ -171,19 +171,19 @@ func generateRepoCommit(repo, templateRepo, generateRepo *models.Repository, tmp
171171
}
172172
}
173173

174-
if err := git.InitRepository(tmpDir, false); err != nil {
174+
if err := git.InitRepository(ctx, tmpDir, false); err != nil {
175175
return err
176176
}
177177

178178
repoPath := repo.RepoPath()
179-
if stdout, err := git.NewCommand("remote", "add", "origin", repoPath).
179+
if stdout, err := git.NewCommandContext(ctx, "remote", "add", "origin", repoPath).
180180
SetDescription(fmt.Sprintf("generateRepoCommit (git remote add): %s to %s", templateRepoPath, tmpDir)).
181181
RunInDirWithEnv(tmpDir, env); err != nil {
182182
log.Error("Unable to add %v as remote origin to temporary repo to %s: stdout %s\nError: %v", repo, tmpDir, stdout, err)
183183
return fmt.Errorf("git remote add: %v", err)
184184
}
185185

186-
return initRepoCommit(tmpDir, repo, repo.Owner, templateRepo.DefaultBranch)
186+
return initRepoCommit(ctx, tmpDir, repo, repo.Owner, templateRepo.DefaultBranch)
187187
}
188188

189189
func generateGitContent(ctx context.Context, repo, templateRepo, generateRepo *models.Repository) (err error) {
@@ -198,7 +198,7 @@ func generateGitContent(ctx context.Context, repo, templateRepo, generateRepo *m
198198
}
199199
}()
200200

201-
if err = generateRepoCommit(repo, templateRepo, generateRepo, tmpDir); err != nil {
201+
if err = generateRepoCommit(ctx, repo, templateRepo, generateRepo, tmpDir); err != nil {
202202
return fmt.Errorf("generateRepoCommit: %v", err)
203203
}
204204

@@ -208,7 +208,7 @@ func generateGitContent(ctx context.Context, repo, templateRepo, generateRepo *m
208208
}
209209

210210
repo.DefaultBranch = templateRepo.DefaultBranch
211-
gitRepo, err := git.OpenRepository(repo.RepoPath())
211+
gitRepo, err := git.OpenRepositoryCtx(ctx, repo.RepoPath())
212212
if err != nil {
213213
return fmt.Errorf("openRepository: %v", err)
214214
}
@@ -272,7 +272,7 @@ func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templ
272272
}
273273
}
274274

275-
if err = checkInitRepository(owner.Name, generateRepo.Name); err != nil {
275+
if err = checkInitRepository(ctx, owner.Name, generateRepo.Name); err != nil {
276276
return generateRepo, err
277277
}
278278

0 commit comments

Comments
 (0)