History

Simplify how git repositories are opened (#28937)

## Purpose This is a refactor toward building an abstraction over managing git repositories. Afterwards, it does not matter anymore if they are stored on the local disk or somewhere remote. ## What this PR changes We used `git.OpenRepository` everywhere previously. Now, we should split them into two distinct functions: Firstly, there are temporary repositories which do not change: ```go git.OpenRepository(ctx, diskPath) ``` Gitea managed repositories having a record in the database in the `repository` table are moved into the new package `gitrepo`: ```go gitrepo.OpenRepository(ctx, repo_model.Repo) ``` Why is `repo_model.Repository` the second parameter instead of file path? Because then we can easily adapt our repository storage strategy. The repositories can be stored locally, however, they could just as well be stored on a remote server. ## Further changes in other PRs - A Git Command wrapper on package `gitrepo` could be created. i.e. `NewCommand(ctx, repo_model.Repository, commands...)`. `git.RunOpts{Dir: repo.RepoPath()}`, the directory should be empty before invoking this method and it can be filled in the function only. #28940 - Remove the `RepoPath()`/`WikiPath()` functions to reduce the possibility of mistakes. ---------

Lunny Xiao committed 2 years ago

Commit 5f82ead1 parent 60e4a9884 files · +426 −273Browse files

Showing the changes to services/pull (9 of 84 files). Show all

Unified · Split

9 files
  1. services/pull/check.go +2 −1
  2. services/pull/comment.go +2 −3
  3. services/pull/commit_status.go +2 −1
  4. services/pull/merge_rebase.go +2 −1
  5. services/pull/merge_squash.go +2 −1
  6. services/pull/patch.go +2 −1
  7. services/pull/pull.go +9 −8
  8. services/pull/pull_test.go +3 −2
  9. services/pull/review.go +2 −1
services/pull/check.go+2−1
@@ -20,6 +20,7 @@ import ( · 19 unmodified lines
2020 "code.gitea.io/gitea/models/unit"
2121 user_model "code.gitea.io/gitea/models/user"
2222 "code.gitea.io/gitea/modules/git"
23+ "code.gitea.io/gitea/modules/gitrepo"
2324 "code.gitea.io/gitea/modules/graceful"
2425 "code.gitea.io/gitea/modules/log"
2526 "code.gitea.io/gitea/modules/process"
@@ -215,7 +216,7 @@ func getMergeCommit(ctx context.Context, pr *issues_model.PullRequest) (*git.Com · 189 unmodified lines
215216 return nil, fmt.Errorf("GetFullCommitID(%s) in %s: %w", prHeadRef, pr.BaseRepo.FullName(), err)
216217 }
217218
218− gitRepo, err := git.OpenRepository(ctx, pr.BaseRepo.RepoPath())
219+ gitRepo, err := gitrepo.OpenRepository(ctx, pr.BaseRepo)
219220 if err != nil {
220221 return nil, fmt.Errorf("%-v OpenRepository: %w", pr.BaseRepo, err)
221222 }
services/pull/comment.go+2−3
@@ -9,7 +9,7 @@ import ( · 8 unmodified lines
99 issues_model "code.gitea.io/gitea/models/issues"
1010 repo_model "code.gitea.io/gitea/models/repo"
1111 user_model "code.gitea.io/gitea/models/user"
12− "code.gitea.io/gitea/modules/git"
12+ "code.gitea.io/gitea/modules/gitrepo"
1313 "code.gitea.io/gitea/modules/json"
1414 )
1515
@@ -17,8 +17,7 @@ import ( · 1 unmodified line
1717 // isForcePush will be true if oldCommit isn't on the branch
1818 // Commit on baseBranch will skip
1919 func getCommitIDsFromRepo(ctx context.Context, repo *repo_model.Repository, oldCommitID, newCommitID, baseBranch string) (commitIDs []string, isForcePush bool, err error) {
20− repoPath := repo.RepoPath()
21− gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, repoPath)
20+ gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, repo)
2221 if err != nil {
2322 return nil, false, err
2423 }
services/pull/commit_status.go+2−1
@@ -11,6 +11,7 @@ import ( · 10 unmodified lines
1111 git_model "code.gitea.io/gitea/models/git"
1212 issues_model "code.gitea.io/gitea/models/issues"
1313 "code.gitea.io/gitea/modules/git"
14+ "code.gitea.io/gitea/modules/gitrepo"
1415 "code.gitea.io/gitea/modules/log"
1516 "code.gitea.io/gitea/modules/structs"
1617
@@ -116,7 +117,7 @@ func GetPullRequestCommitStatusState(ctx context.Context, pr *issues_model.PullR · 99 unmodified lines
116117 }
117118
118119 // check if all required status checks are successful
119− headGitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.HeadRepo.RepoPath())
120+ headGitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.HeadRepo)
120121 if err != nil {
121122 return "", errors.Wrap(err, "OpenRepository")
122123 }
services/pull/merge_rebase.go+2−1
@@ -9,6 +9,7 @@ import ( · 8 unmodified lines
99
1010 repo_model "code.gitea.io/gitea/models/repo"
1111 "code.gitea.io/gitea/modules/git"
12+ "code.gitea.io/gitea/modules/gitrepo"
1213 "code.gitea.io/gitea/modules/log"
1314 )
1415
@@ -57,7 +58,7 @@ func doMergeRebaseFastForward(ctx *mergeContext) error { · 42 unmodified lines
5758 }
5859
5960 // Original repo to read template from.
60− baseGitRepo, err := git.OpenRepository(ctx, ctx.pr.BaseRepo.RepoPath())
61+ baseGitRepo, err := gitrepo.OpenRepository(ctx, ctx.pr.BaseRepo)
6162 if err != nil {
6263 log.Error("Unable to get Git repo for rebase: %v", err)
6364 return err
services/pull/merge_squash.go+2−1
@@ -10,6 +10,7 @@ import ( · 9 unmodified lines
1010 user_model "code.gitea.io/gitea/models/user"
1111 "code.gitea.io/gitea/modules/container"
1212 "code.gitea.io/gitea/modules/git"
13+ "code.gitea.io/gitea/modules/gitrepo"
1314 "code.gitea.io/gitea/modules/log"
1415 "code.gitea.io/gitea/modules/setting"
1516 )
@@ -24,7 +25,7 @@ func getAuthorSignatureSquash(ctx *mergeContext) (*git.Signature, error) { · 8 unmodified lines
2425 // Try to get an signature from the same user in one of the commits, as the
2526 // poster email might be private or commits might have a different signature
2627 // than the primary email address of the poster.
27− gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, ctx.tmpBasePath)
28+ gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpenPath(ctx, ctx.tmpBasePath)
2829 if err != nil {
2930 log.Error("%-v Unable to open base repository: %v", ctx.pr, err)
3031 return nil, err
services/pull/patch.go+2−1
@@ -19,6 +19,7 @@ import ( · 18 unmodified lines
1919 "code.gitea.io/gitea/models/unit"
2020 "code.gitea.io/gitea/modules/container"
2121 "code.gitea.io/gitea/modules/git"
22+ "code.gitea.io/gitea/modules/gitrepo"
2223 "code.gitea.io/gitea/modules/graceful"
2324 "code.gitea.io/gitea/modules/log"
2425 "code.gitea.io/gitea/modules/process"
@@ -35,7 +36,7 @@ func DownloadDiffOrPatch(ctx context.Context, pr *issues_model.PullRequest, w io · 10 unmodified lines
3536 return err
3637 }
3738
38− gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo.RepoPath())
39+ gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.BaseRepo)
3940 if err != nil {
4041 return fmt.Errorf("OpenRepository: %w", err)
4142 }
services/pull/pull.go+9−8
@@ -23,6 +23,7 @@ import ( · 22 unmodified lines
2323 "code.gitea.io/gitea/modules/container"
2424 gitea_context "code.gitea.io/gitea/modules/context"
2525 "code.gitea.io/gitea/modules/git"
26+ "code.gitea.io/gitea/modules/gitrepo"
2627 "code.gitea.io/gitea/modules/graceful"
2728 "code.gitea.io/gitea/modules/json"
2829 "code.gitea.io/gitea/modules/log"
@@ -62,7 +63,7 @@ func NewPullRequest(ctx context.Context, repo *repo_model.Repository, issue *iss · 33 unmodified lines
6263 assigneeCommentMap := make(map[int64]*issues_model.Comment)
6364
6465 // add first push codes comment
65− baseGitRepo, err := git.OpenRepository(ctx, pr.BaseRepo.RepoPath())
66+ baseGitRepo, err := gitrepo.OpenRepository(ctx, pr.BaseRepo)
6667 if err != nil {
6768 return err
6869 }
@@ -269,9 +270,9 @@ func checkForInvalidation(ctx context.Context, requests issues_model.PullRequest · 200 unmodified lines
269270 if err != nil {
270271 return fmt.Errorf("GetRepositoryByIDCtx: %w", err)
271272 }
272− gitRepo, err := git.OpenRepository(ctx, repo.RepoPath())
273+ gitRepo, err := gitrepo.OpenRepository(ctx, repo)
273274 if err != nil {
274− return fmt.Errorf("git.OpenRepository: %w", err)
275+ return fmt.Errorf("gitrepo.OpenRepository: %w", err)
275276 }
276277 go func() {
277278 // FIXME: graceful: We need to tell the manager we're doing something...
@@ -614,7 +615,7 @@ func CloseBranchPulls(ctx context.Context, doer *user_model.User, repoID int64, · 336 unmodified lines
614615
615616 // CloseRepoBranchesPulls close all pull requests which head branches are in the given repository, but only whose base repo is not in the given repository
616617 func CloseRepoBranchesPulls(ctx context.Context, doer *user_model.User, repo *repo_model.Repository) error {
617− branches, _, err := git.GetBranchesByPath(ctx, repo.RepoPath(), 0, 0)
618+ branches, _, err := gitrepo.GetBranchesByPath(ctx, repo, 0, 0)
618619 if err != nil {
619620 return err
620621 }
@@ -671,7 +672,7 @@ func GetSquashMergeCommitMessages(ctx context.Context, pr *issues_model.PullRequ · 50 unmodified lines
671672 }
672673 }
673674
674− gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.HeadRepo.RepoPath())
675+ gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.HeadRepo)
675676 if err != nil {
676677 log.Error("Unable to open head repository: Error: %v", err)
677678 return ""
@@ -845,7 +846,7 @@ func GetIssuesAllCommitStatus(ctx context.Context, issues issues_model.IssueList · 167 unmodified lines
845846 }
846847 gitRepo, ok := gitRepos[issue.RepoID]
847848 if !ok {
848− gitRepo, err = git.OpenRepository(ctx, issue.Repo.RepoPath())
849+ gitRepo, err = gitrepo.OpenRepository(ctx, issue.Repo)
849850 if err != nil {
850851 log.Error("Cannot open git repository %-v for issue #%d[%d]. Error: %v", issue.Repo, issue.Index, issue.ID, err)
851852 continue
@@ -882,7 +883,7 @@ func IsHeadEqualWithBranch(ctx context.Context, pr *issues_model.PullRequest, br · 30 unmodified lines
882883 if err = pr.LoadBaseRepo(ctx); err != nil {
883884 return false, err
884885 }
885− baseGitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo.RepoPath())
886+ baseGitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.BaseRepo)
886887 if err != nil {
887888 return false, err
888889 }
@@ -902,7 +903,7 @@ func IsHeadEqualWithBranch(ctx context.Context, pr *issues_model.PullRequest, br · 13 unmodified lines
902903 } else {
903904 var closer io.Closer
904905
905− headGitRepo, closer, err = git.RepositoryFromContextOrOpen(ctx, pr.HeadRepo.RepoPath())
906+ headGitRepo, closer, err = gitrepo.RepositoryFromContextOrOpen(ctx, pr.HeadRepo)
906907 if err != nil {
907908 return false, err
908909 }
services/pull/pull_test.go+3−2
@@ -13,6 +13,7 @@ import ( · 12 unmodified lines
1313 "code.gitea.io/gitea/models/unit"
1414 "code.gitea.io/gitea/models/unittest"
1515 "code.gitea.io/gitea/modules/git"
16+ "code.gitea.io/gitea/modules/gitrepo"
1617
1718 "github.com/stretchr/testify/assert"
1819 )
@@ -41,7 +42,7 @@ func TestPullRequest_GetDefaultMergeMessage_InternalTracker(t *testing.T) { · 22 unmodified lines
4142 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2})
4243
4344 assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
44− gitRepo, err := git.OpenRepository(git.DefaultContext, pr.BaseRepo.RepoPath())
45+ gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, pr.BaseRepo)
4546 assert.NoError(t, err)
4647 defer gitRepo.Close()
4748
@@ -71,7 +72,7 @@ func TestPullRequest_GetDefaultMergeMessage_ExternalTracker(t *testing.T) { · 23 unmodified lines
7172 pr := unittest.AssertExistsAndLoadBean(t, &issues_model.PullRequest{ID: 2, BaseRepo: baseRepo})
7273
7374 assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
74− gitRepo, err := git.OpenRepository(git.DefaultContext, pr.BaseRepo.RepoPath())
75+ gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, pr.BaseRepo)
7576 assert.NoError(t, err)
7677 defer gitRepo.Close()
7778
services/pull/review.go+2−1
@@ -16,6 +16,7 @@ import ( · 15 unmodified lines
1616 repo_model "code.gitea.io/gitea/models/repo"
1717 user_model "code.gitea.io/gitea/models/user"
1818 "code.gitea.io/gitea/modules/git"
19+ "code.gitea.io/gitea/modules/gitrepo"
1920 "code.gitea.io/gitea/modules/log"
2021 "code.gitea.io/gitea/modules/setting"
2122 "code.gitea.io/gitea/modules/util"
@@ -170,7 +171,7 @@ func createCodeComment(ctx context.Context, doer *user_model.User, repo *repo_mo · 148 unmodified lines
170171 if err := pr.LoadBaseRepo(ctx); err != nil {
171172 return nil, fmt.Errorf("LoadBaseRepo: %w", err)
172173 }
173− gitRepo, closer, err := git.RepositoryFromContextOrOpen(ctx, pr.BaseRepo.RepoPath())
174+ gitRepo, closer, err := gitrepo.RepositoryFromContextOrOpen(ctx, pr.BaseRepo)
174175 if err != nil {
175176 return nil, fmt.Errorf("RepositoryFromContextOrOpen: %w", err)
176177 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t