Skip to content

Commit b5188cd

Browse files
authored
Move generate from module to service (#29465)
1 parent d0fe6ea commit b5188cd

File tree

8 files changed

+97
-82
lines changed

8 files changed

+97
-82
lines changed

modules/repository/init.go

-68
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,18 @@ package repository
66
import (
77
"context"
88
"fmt"
9-
"os"
109
"path/filepath"
1110
"sort"
1211
"strings"
13-
"time"
1412

1513
issues_model "code.gitea.io/gitea/models/issues"
1614
repo_model "code.gitea.io/gitea/models/repo"
17-
user_model "code.gitea.io/gitea/models/user"
1815
"code.gitea.io/gitea/modules/git"
1916
"code.gitea.io/gitea/modules/label"
2017
"code.gitea.io/gitea/modules/log"
2118
"code.gitea.io/gitea/modules/options"
2219
"code.gitea.io/gitea/modules/setting"
2320
"code.gitea.io/gitea/modules/util"
24-
asymkey_service "code.gitea.io/gitea/services/asymkey"
2521
)
2622

2723
type OptionFile struct {
@@ -124,70 +120,6 @@ func LoadRepoConfig() error {
124120
return nil
125121
}
126122

127-
// InitRepoCommit temporarily changes with work directory.
128-
func InitRepoCommit(ctx context.Context, tmpPath string, repo *repo_model.Repository, u *user_model.User, defaultBranch string) (err error) {
129-
commitTimeStr := time.Now().Format(time.RFC3339)
130-
131-
sig := u.NewGitSig()
132-
// Because this may call hooks we should pass in the environment
133-
env := append(os.Environ(),
134-
"GIT_AUTHOR_NAME="+sig.Name,
135-
"GIT_AUTHOR_EMAIL="+sig.Email,
136-
"GIT_AUTHOR_DATE="+commitTimeStr,
137-
"GIT_COMMITTER_DATE="+commitTimeStr,
138-
)
139-
committerName := sig.Name
140-
committerEmail := sig.Email
141-
142-
if stdout, _, err := git.NewCommand(ctx, "add", "--all").
143-
SetDescription(fmt.Sprintf("initRepoCommit (git add): %s", tmpPath)).
144-
RunStdString(&git.RunOpts{Dir: tmpPath}); err != nil {
145-
log.Error("git add --all failed: Stdout: %s\nError: %v", stdout, err)
146-
return fmt.Errorf("git add --all: %w", err)
147-
}
148-
149-
cmd := git.NewCommand(ctx, "commit", "--message=Initial commit").
150-
AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email)
151-
152-
sign, keyID, signer, _ := asymkey_service.SignInitialCommit(ctx, tmpPath, u)
153-
if sign {
154-
cmd.AddOptionFormat("-S%s", keyID)
155-
156-
if repo.GetTrustModel() == repo_model.CommitterTrustModel || repo.GetTrustModel() == repo_model.CollaboratorCommitterTrustModel {
157-
// need to set the committer to the KeyID owner
158-
committerName = signer.Name
159-
committerEmail = signer.Email
160-
}
161-
} else {
162-
cmd.AddArguments("--no-gpg-sign")
163-
}
164-
165-
env = append(env,
166-
"GIT_COMMITTER_NAME="+committerName,
167-
"GIT_COMMITTER_EMAIL="+committerEmail,
168-
)
169-
170-
if stdout, _, err := cmd.
171-
SetDescription(fmt.Sprintf("initRepoCommit (git commit): %s", tmpPath)).
172-
RunStdString(&git.RunOpts{Dir: tmpPath, Env: env}); err != nil {
173-
log.Error("Failed to commit: %v: Stdout: %s\nError: %v", cmd.String(), stdout, err)
174-
return fmt.Errorf("git commit: %w", err)
175-
}
176-
177-
if len(defaultBranch) == 0 {
178-
defaultBranch = setting.Repository.DefaultBranch
179-
}
180-
181-
if stdout, _, err := git.NewCommand(ctx, "push", "origin").AddDynamicArguments("HEAD:" + defaultBranch).
182-
SetDescription(fmt.Sprintf("initRepoCommit (git push): %s", tmpPath)).
183-
RunStdString(&git.RunOpts{Dir: tmpPath, Env: InternalPushingEnvironment(u, repo)}); err != nil {
184-
log.Error("Failed to push back to HEAD: Stdout: %s\nError: %v", stdout, err)
185-
return fmt.Errorf("git push: %w", err)
186-
}
187-
188-
return nil
189-
}
190-
191123
func CheckInitRepository(ctx context.Context, owner, name, objectFormatName string) (err error) {
192124
// Somehow the directory could exist.
193125
repoPath := repo_model.RepoPath(owner, name)

routers/api/v1/repo/repo.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ func Generate(ctx *context.APIContext) {
358358
return
359359
}
360360

361-
opts := repo_module.GenerateRepoOptions{
361+
opts := repo_service.GenerateRepoOptions{
362362
Name: form.Name,
363363
DefaultBranch: form.DefaultBranch,
364364
Description: form.Description,

routers/web/repo/repo.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ func CreatePost(ctx *context.Context) {
244244
var repo *repo_model.Repository
245245
var err error
246246
if form.RepoTemplate > 0 {
247-
opts := repo_module.GenerateRepoOptions{
247+
opts := repo_service.GenerateRepoOptions{
248248
Name: form.RepoName,
249249
Description: form.Description,
250250
Private: form.Private,

services/repository/create.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ func initRepository(ctx context.Context, repoPath string, u *user_model.User, re
157157
}
158158

159159
// Apply changes and commit.
160-
if err = repo_module.InitRepoCommit(ctx, tmpDir, repo, u, opts.DefaultBranch); err != nil {
160+
if err = initRepoCommit(ctx, tmpDir, repo, u, opts.DefaultBranch); err != nil {
161161
return fmt.Errorf("initRepoCommit: %w", err)
162162
}
163163
}

modules/repository/generate.go renamed to services/repository/generate.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"code.gitea.io/gitea/modules/git"
2222
"code.gitea.io/gitea/modules/gitrepo"
2323
"code.gitea.io/gitea/modules/log"
24+
repo_module "code.gitea.io/gitea/modules/repository"
2425
"code.gitea.io/gitea/modules/util"
2526

2627
"github.com/gobwas/glob"
@@ -242,7 +243,7 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r
242243
defaultBranch = templateRepo.DefaultBranch
243244
}
244245

245-
return InitRepoCommit(ctx, tmpDir, repo, repo.Owner, defaultBranch)
246+
return initRepoCommit(ctx, tmpDir, repo, repo.Owner, defaultBranch)
246247
}
247248

248249
func generateGitContent(ctx context.Context, repo, templateRepo, generateRepo *repo_model.Repository) (err error) {
@@ -292,7 +293,7 @@ func GenerateGitContent(ctx context.Context, templateRepo, generateRepo *repo_mo
292293
return err
293294
}
294295

295-
if err := UpdateRepoSize(ctx, generateRepo); err != nil {
296+
if err := repo_module.UpdateRepoSize(ctx, generateRepo); err != nil {
296297
return fmt.Errorf("failed to update size for repository: %w", err)
297298
}
298299

@@ -323,8 +324,8 @@ func (gro GenerateRepoOptions) IsValid() bool {
323324
gro.IssueLabels || gro.ProtectedBranch // or other items as they are added
324325
}
325326

326-
// GenerateRepository generates a repository from a template
327-
func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templateRepo *repo_model.Repository, opts GenerateRepoOptions) (_ *repo_model.Repository, err error) {
327+
// generateRepository generates a repository from a template
328+
func generateRepository(ctx context.Context, doer, owner *user_model.User, templateRepo *repo_model.Repository, opts GenerateRepoOptions) (_ *repo_model.Repository, err error) {
328329
generateRepo := &repo_model.Repository{
329330
OwnerID: owner.ID,
330331
Owner: owner,
@@ -341,7 +342,7 @@ func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templ
341342
ObjectFormatName: templateRepo.ObjectFormatName,
342343
}
343344

344-
if err = CreateRepositoryByExample(ctx, doer, owner, generateRepo, false, false); err != nil {
345+
if err = repo_module.CreateRepositoryByExample(ctx, doer, owner, generateRepo, false, false); err != nil {
345346
return nil, err
346347
}
347348

@@ -358,11 +359,11 @@ func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templ
358359
}
359360
}
360361

361-
if err = CheckInitRepository(ctx, owner.Name, generateRepo.Name, generateRepo.ObjectFormatName); err != nil {
362+
if err = repo_module.CheckInitRepository(ctx, owner.Name, generateRepo.Name, generateRepo.ObjectFormatName); err != nil {
362363
return generateRepo, err
363364
}
364365

365-
if err = CheckDaemonExportOK(ctx, generateRepo); err != nil {
366+
if err = repo_module.CheckDaemonExportOK(ctx, generateRepo); err != nil {
366367
return generateRepo, fmt.Errorf("checkDaemonExportOK: %w", err)
367368
}
368369

services/repository/init.go

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package repository
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"os"
10+
"time"
11+
12+
repo_model "code.gitea.io/gitea/models/repo"
13+
user_model "code.gitea.io/gitea/models/user"
14+
"code.gitea.io/gitea/modules/git"
15+
"code.gitea.io/gitea/modules/log"
16+
repo_module "code.gitea.io/gitea/modules/repository"
17+
"code.gitea.io/gitea/modules/setting"
18+
asymkey_service "code.gitea.io/gitea/services/asymkey"
19+
)
20+
21+
// initRepoCommit temporarily changes with work directory.
22+
func initRepoCommit(ctx context.Context, tmpPath string, repo *repo_model.Repository, u *user_model.User, defaultBranch string) (err error) {
23+
commitTimeStr := time.Now().Format(time.RFC3339)
24+
25+
sig := u.NewGitSig()
26+
// Because this may call hooks we should pass in the environment
27+
env := append(os.Environ(),
28+
"GIT_AUTHOR_NAME="+sig.Name,
29+
"GIT_AUTHOR_EMAIL="+sig.Email,
30+
"GIT_AUTHOR_DATE="+commitTimeStr,
31+
"GIT_COMMITTER_DATE="+commitTimeStr,
32+
)
33+
committerName := sig.Name
34+
committerEmail := sig.Email
35+
36+
if stdout, _, err := git.NewCommand(ctx, "add", "--all").
37+
SetDescription(fmt.Sprintf("initRepoCommit (git add): %s", tmpPath)).
38+
RunStdString(&git.RunOpts{Dir: tmpPath}); err != nil {
39+
log.Error("git add --all failed: Stdout: %s\nError: %v", stdout, err)
40+
return fmt.Errorf("git add --all: %w", err)
41+
}
42+
43+
cmd := git.NewCommand(ctx, "commit", "--message=Initial commit").
44+
AddOptionFormat("--author='%s <%s>'", sig.Name, sig.Email)
45+
46+
sign, keyID, signer, _ := asymkey_service.SignInitialCommit(ctx, tmpPath, u)
47+
if sign {
48+
cmd.AddOptionFormat("-S%s", keyID)
49+
50+
if repo.GetTrustModel() == repo_model.CommitterTrustModel || repo.GetTrustModel() == repo_model.CollaboratorCommitterTrustModel {
51+
// need to set the committer to the KeyID owner
52+
committerName = signer.Name
53+
committerEmail = signer.Email
54+
}
55+
} else {
56+
cmd.AddArguments("--no-gpg-sign")
57+
}
58+
59+
env = append(env,
60+
"GIT_COMMITTER_NAME="+committerName,
61+
"GIT_COMMITTER_EMAIL="+committerEmail,
62+
)
63+
64+
if stdout, _, err := cmd.
65+
SetDescription(fmt.Sprintf("initRepoCommit (git commit): %s", tmpPath)).
66+
RunStdString(&git.RunOpts{Dir: tmpPath, Env: env}); err != nil {
67+
log.Error("Failed to commit: %v: Stdout: %s\nError: %v", cmd.String(), stdout, err)
68+
return fmt.Errorf("git commit: %w", err)
69+
}
70+
71+
if len(defaultBranch) == 0 {
72+
defaultBranch = setting.Repository.DefaultBranch
73+
}
74+
75+
if stdout, _, err := git.NewCommand(ctx, "push", "origin").AddDynamicArguments("HEAD:" + defaultBranch).
76+
SetDescription(fmt.Sprintf("initRepoCommit (git push): %s", tmpPath)).
77+
RunStdString(&git.RunOpts{Dir: tmpPath, Env: repo_module.InternalPushingEnvironment(u, repo)}); err != nil {
78+
log.Error("Failed to push back to HEAD: Stdout: %s\nError: %v", stdout, err)
79+
return fmt.Errorf("git push: %w", err)
80+
}
81+
82+
return nil
83+
}

services/repository/template.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
issues_model "code.gitea.io/gitea/models/issues"
1212
repo_model "code.gitea.io/gitea/models/repo"
1313
user_model "code.gitea.io/gitea/models/user"
14-
repo_module "code.gitea.io/gitea/modules/repository"
1514
notify_service "code.gitea.io/gitea/services/notify"
1615
)
1716

@@ -63,7 +62,7 @@ func GenerateProtectedBranch(ctx context.Context, templateRepo, generateRepo *re
6362
}
6463

6564
// GenerateRepository generates a repository from a template
66-
func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templateRepo *repo_model.Repository, opts repo_module.GenerateRepoOptions) (_ *repo_model.Repository, err error) {
65+
func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templateRepo *repo_model.Repository, opts GenerateRepoOptions) (_ *repo_model.Repository, err error) {
6766
if !doer.IsAdmin && !owner.CanCreateRepo() {
6867
return nil, repo_model.ErrReachLimitOfRepo{
6968
Limit: owner.MaxRepoCreation,
@@ -72,14 +71,14 @@ func GenerateRepository(ctx context.Context, doer, owner *user_model.User, templ
7271

7372
var generateRepo *repo_model.Repository
7473
if err = db.WithTx(ctx, func(ctx context.Context) error {
75-
generateRepo, err = repo_module.GenerateRepository(ctx, doer, owner, templateRepo, opts)
74+
generateRepo, err = generateRepository(ctx, doer, owner, templateRepo, opts)
7675
if err != nil {
7776
return err
7877
}
7978

8079
// Git Content
8180
if opts.GitContent && !templateRepo.IsEmpty {
82-
if err = repo_module.GenerateGitContent(ctx, templateRepo, generateRepo); err != nil {
81+
if err = GenerateGitContent(ctx, templateRepo, generateRepo); err != nil {
8382
return err
8483
}
8584
}

0 commit comments

Comments
 (0)