Skip to content

Commit 76aa33d

Browse files
lunnywxiaoguang
andauthored
Move init repository related functions to modules (#19159)
* Move init repository related functions to modules * Fix lint * Use ctx but db.DefaultContext Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
1 parent b06b9a0 commit 76aa33d

File tree

15 files changed

+259
-269
lines changed

15 files changed

+259
-269
lines changed

models/error.go

-16
Original file line numberDiff line numberDiff line change
@@ -703,22 +703,6 @@ func (err ErrIssueIsClosed) Error() string {
703703
return fmt.Sprintf("issue is closed [id: %d, repo_id: %d, index: %d]", err.ID, err.RepoID, err.Index)
704704
}
705705

706-
// ErrIssueLabelTemplateLoad represents a "ErrIssueLabelTemplateLoad" kind of error.
707-
type ErrIssueLabelTemplateLoad struct {
708-
TemplateFile string
709-
OriginalError error
710-
}
711-
712-
// IsErrIssueLabelTemplateLoad checks if an error is a ErrIssueLabelTemplateLoad.
713-
func IsErrIssueLabelTemplateLoad(err error) bool {
714-
_, ok := err.(ErrIssueLabelTemplateLoad)
715-
return ok
716-
}
717-
718-
func (err ErrIssueLabelTemplateLoad) Error() string {
719-
return fmt.Sprintf("Failed to load label template file '%s': %v", err.TemplateFile, err.OriginalError)
720-
}
721-
722706
// ErrNewIssueInsert is used when the INSERT statement in newIssue fails
723707
type ErrNewIssueInsert struct {
724708
OriginalError error

models/issue_label.go

+3-109
Original file line numberDiff line numberDiff line change
@@ -50,50 +50,6 @@ func init() {
5050
db.RegisterModel(new(IssueLabel))
5151
}
5252

53-
// GetLabelTemplateFile loads the label template file by given name,
54-
// then parses and returns a list of name-color pairs and optionally description.
55-
func GetLabelTemplateFile(name string) ([][3]string, error) {
56-
data, err := GetRepoInitFile("label", name)
57-
if err != nil {
58-
return nil, ErrIssueLabelTemplateLoad{name, fmt.Errorf("GetRepoInitFile: %v", err)}
59-
}
60-
61-
lines := strings.Split(string(data), "\n")
62-
list := make([][3]string, 0, len(lines))
63-
for i := 0; i < len(lines); i++ {
64-
line := strings.TrimSpace(lines[i])
65-
if len(line) == 0 {
66-
continue
67-
}
68-
69-
parts := strings.SplitN(line, ";", 2)
70-
71-
fields := strings.SplitN(parts[0], " ", 2)
72-
if len(fields) != 2 {
73-
return nil, ErrIssueLabelTemplateLoad{name, fmt.Errorf("line is malformed: %s", line)}
74-
}
75-
76-
color := strings.Trim(fields[0], " ")
77-
if len(color) == 6 {
78-
color = "#" + color
79-
}
80-
if !LabelColorPattern.MatchString(color) {
81-
return nil, ErrIssueLabelTemplateLoad{name, fmt.Errorf("bad HTML color code in line: %s", line)}
82-
}
83-
84-
var description string
85-
86-
if len(parts) > 1 {
87-
description = strings.TrimSpace(parts[1])
88-
}
89-
90-
fields[1] = strings.TrimSpace(fields[1])
91-
list = append(list, [3]string{fields[1], color, description})
92-
}
93-
94-
return list, nil
95-
}
96-
9753
// CalOpenIssues sets the number of open issues of a label based on the already stored number of closed issues.
9854
func (label *Label) CalOpenIssues() {
9955
label.NumOpenIssues = label.NumIssues - label.NumClosedIssues
@@ -191,70 +147,8 @@ func (label *Label) ForegroundColor() template.CSS {
191147
return template.CSS("#000")
192148
}
193149

194-
// .____ ___. .__
195-
// | | _____ \_ |__ ____ | |
196-
// | | \__ \ | __ \_/ __ \| |
197-
// | |___ / __ \| \_\ \ ___/| |__
198-
// >_______ (____ /___ /\___ >____/
199-
200-
func loadLabels(labelTemplate string) ([]string, error) {
201-
list, err := GetLabelTemplateFile(labelTemplate)
202-
if err != nil {
203-
return nil, err
204-
}
205-
206-
labels := make([]string, len(list))
207-
for i := 0; i < len(list); i++ {
208-
labels[i] = list[i][0]
209-
}
210-
return labels, nil
211-
}
212-
213-
// LoadLabelsFormatted loads the labels' list of a template file as a string separated by comma
214-
func LoadLabelsFormatted(labelTemplate string) (string, error) {
215-
labels, err := loadLabels(labelTemplate)
216-
return strings.Join(labels, ", "), err
217-
}
218-
219-
func initializeLabels(e db.Engine, id int64, labelTemplate string, isOrg bool) error {
220-
list, err := GetLabelTemplateFile(labelTemplate)
221-
if err != nil {
222-
return err
223-
}
224-
225-
labels := make([]*Label, len(list))
226-
for i := 0; i < len(list); i++ {
227-
labels[i] = &Label{
228-
Name: list[i][0],
229-
Description: list[i][2],
230-
Color: list[i][1],
231-
}
232-
if isOrg {
233-
labels[i].OrgID = id
234-
} else {
235-
labels[i].RepoID = id
236-
}
237-
}
238-
for _, label := range labels {
239-
if err = newLabel(e, label); err != nil {
240-
return err
241-
}
242-
}
243-
return nil
244-
}
245-
246-
// InitializeLabels adds a label set to a repository using a template
247-
func InitializeLabels(ctx context.Context, repoID int64, labelTemplate string, isOrg bool) error {
248-
return initializeLabels(db.GetEngine(ctx), repoID, labelTemplate, isOrg)
249-
}
250-
251-
func newLabel(e db.Engine, label *Label) error {
252-
_, err := e.Insert(label)
253-
return err
254-
}
255-
256150
// NewLabel creates a new label
257-
func NewLabel(label *Label) error {
151+
func NewLabel(ctx context.Context, label *Label) error {
258152
if !LabelColorPattern.MatchString(label.Color) {
259153
return fmt.Errorf("bad color code: %s", label.Color)
260154
}
@@ -275,7 +169,7 @@ func NewLabel(label *Label) error {
275169
label.Color = fmt.Sprintf("#%c%c%c%c%c%c", r, r, g, g, b, b)
276170
}
277171

278-
return newLabel(db.GetEngine(db.DefaultContext), label)
172+
return db.Insert(ctx, label)
279173
}
280174

281175
// NewLabels creates new labels
@@ -290,7 +184,7 @@ func NewLabels(labels ...*Label) error {
290184
if !LabelColorPattern.MatchString(label.Color) {
291185
return fmt.Errorf("bad color code: %s", label.Color)
292186
}
293-
if err := newLabel(db.GetEngine(ctx), label); err != nil {
187+
if err := db.Insert(ctx, label); err != nil {
294188
return err
295189
}
296190
}

models/issue_label_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ func TestNewLabels(t *testing.T) {
4242
{RepoID: 4, Name: "labelName4", Color: "ABCDEF"},
4343
{RepoID: 5, Name: "labelName5", Color: "DEF"},
4444
}
45-
assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: ""}))
46-
assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "#45G"}))
47-
assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "#12345G"}))
48-
assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "45G"}))
49-
assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "12345G"}))
45+
assert.Error(t, NewLabel(db.DefaultContext, &Label{RepoID: 3, Name: "invalid Color", Color: ""}))
46+
assert.Error(t, NewLabel(db.DefaultContext, &Label{RepoID: 3, Name: "invalid Color", Color: "#45G"}))
47+
assert.Error(t, NewLabel(db.DefaultContext, &Label{RepoID: 3, Name: "invalid Color", Color: "#12345G"}))
48+
assert.Error(t, NewLabel(db.DefaultContext, &Label{RepoID: 3, Name: "invalid Color", Color: "45G"}))
49+
assert.Error(t, NewLabel(db.DefaultContext, &Label{RepoID: 3, Name: "invalid Color", Color: "12345G"}))
5050
for _, label := range labels {
5151
unittest.AssertNotExistsBean(t, label)
5252
}

models/repo.go

+2-112
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"fmt"
1111
"os"
1212
"path"
13-
"sort"
1413
"strconv"
1514
"strings"
1615
"unicode/utf8"
@@ -28,7 +27,6 @@ import (
2827
"code.gitea.io/gitea/models/webhook"
2928
"code.gitea.io/gitea/modules/lfs"
3029
"code.gitea.io/gitea/modules/log"
31-
"code.gitea.io/gitea/modules/options"
3230
"code.gitea.io/gitea/modules/setting"
3331
"code.gitea.io/gitea/modules/storage"
3432
api "code.gitea.io/gitea/modules/structs"
@@ -37,90 +35,11 @@ import (
3735
"xorm.io/builder"
3836
)
3937

40-
var (
41-
// Gitignores contains the gitiginore files
42-
Gitignores []string
43-
44-
// Licenses contains the license files
45-
Licenses []string
46-
47-
// Readmes contains the readme files
48-
Readmes []string
49-
50-
// LabelTemplates contains the label template files and the list of labels for each file
51-
LabelTemplates map[string]string
52-
53-
// ItemsPerPage maximum items per page in forks, watchers and stars of a repo
54-
ItemsPerPage = 40
55-
)
56-
57-
// loadRepoConfig loads the repository config
58-
func loadRepoConfig() {
59-
// Load .gitignore and license files and readme templates.
60-
types := []string{"gitignore", "license", "readme", "label"}
61-
typeFiles := make([][]string, 4)
62-
for i, t := range types {
63-
files, err := options.Dir(t)
64-
if err != nil {
65-
log.Fatal("Failed to get %s files: %v", t, err)
66-
}
67-
customPath := path.Join(setting.CustomPath, "options", t)
68-
isDir, err := util.IsDir(customPath)
69-
if err != nil {
70-
log.Fatal("Failed to get custom %s files: %v", t, err)
71-
}
72-
if isDir {
73-
customFiles, err := util.StatDir(customPath)
74-
if err != nil {
75-
log.Fatal("Failed to get custom %s files: %v", t, err)
76-
}
77-
78-
for _, f := range customFiles {
79-
if !util.IsStringInSlice(f, files, true) {
80-
files = append(files, f)
81-
}
82-
}
83-
}
84-
typeFiles[i] = files
85-
}
86-
87-
Gitignores = typeFiles[0]
88-
Licenses = typeFiles[1]
89-
Readmes = typeFiles[2]
90-
LabelTemplatesFiles := typeFiles[3]
91-
sort.Strings(Gitignores)
92-
sort.Strings(Licenses)
93-
sort.Strings(Readmes)
94-
sort.Strings(LabelTemplatesFiles)
95-
96-
// Load label templates
97-
LabelTemplates = make(map[string]string)
98-
for _, templateFile := range LabelTemplatesFiles {
99-
labels, err := LoadLabelsFormatted(templateFile)
100-
if err != nil {
101-
log.Error("Failed to load labels: %v", err)
102-
}
103-
LabelTemplates[templateFile] = labels
104-
}
105-
106-
// Filter out invalid names and promote preferred licenses.
107-
sortedLicenses := make([]string, 0, len(Licenses))
108-
for _, name := range setting.Repository.PreferredLicenses {
109-
if util.IsStringInSlice(name, Licenses, true) {
110-
sortedLicenses = append(sortedLicenses, name)
111-
}
112-
}
113-
for _, name := range Licenses {
114-
if !util.IsStringInSlice(name, setting.Repository.PreferredLicenses, true) {
115-
sortedLicenses = append(sortedLicenses, name)
116-
}
117-
}
118-
Licenses = sortedLicenses
119-
}
38+
// ItemsPerPage maximum items per page in forks, watchers and stars of a repo
39+
var ItemsPerPage = 40
12040

12141
// NewRepoContext creates a new repository context
12242
func NewRepoContext() {
123-
loadRepoConfig()
12443
unit.LoadUnitConfig()
12544

12645
admin_model.RemoveAllWithNotice(db.DefaultContext, "Clean up temporary repository uploads", setting.Repository.Upload.TempPath)
@@ -441,35 +360,6 @@ type CreateRepoOptions struct {
441360
MirrorInterval string
442361
}
443362

444-
// GetRepoInitFile returns repository init files
445-
func GetRepoInitFile(tp, name string) ([]byte, error) {
446-
cleanedName := strings.TrimLeft(path.Clean("/"+name), "/")
447-
relPath := path.Join("options", tp, cleanedName)
448-
449-
// Use custom file when available.
450-
customPath := path.Join(setting.CustomPath, relPath)
451-
isFile, err := util.IsFile(customPath)
452-
if err != nil {
453-
log.Error("Unable to check if %s is a file. Error: %v", customPath, err)
454-
}
455-
if isFile {
456-
return os.ReadFile(customPath)
457-
}
458-
459-
switch tp {
460-
case "readme":
461-
return options.Readme(cleanedName)
462-
case "gitignore":
463-
return options.Gitignore(cleanedName)
464-
case "license":
465-
return options.License(cleanedName)
466-
case "label":
467-
return options.Labels(cleanedName)
468-
default:
469-
return []byte{}, fmt.Errorf("Invalid init file type")
470-
}
471-
}
472-
473363
// CreateRepository creates a repository for the user/organization.
474364
func CreateRepository(ctx context.Context, doer, u *user_model.User, repo *repo_model.Repository, overwriteOrAdopt bool) (err error) {
475365
if err = repo_model.IsUsableRepoName(repo.Name); err != nil {

models/repo_generate.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func GenerateIssueLabels(ctx context.Context, templateRepo, generateRepo *repo_m
110110
Description: templateLabel.Description,
111111
Color: templateLabel.Color,
112112
}
113-
if err := newLabel(db.GetEngine(ctx), generateLabel); err != nil {
113+
if err := db.Insert(ctx, generateLabel); err != nil {
114114
return err
115115
}
116116
}

modules/repository/create.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func CreateRepository(doer, u *user_model.User, opts models.CreateRepoOptions) (
3333

3434
// Check if label template exist
3535
if len(opts.IssueLabels) > 0 {
36-
if _, err := models.GetLabelTemplateFile(opts.IssueLabels); err != nil {
36+
if _, err := GetLabelTemplateFile(opts.IssueLabels); err != nil {
3737
return nil, err
3838
}
3939
}
@@ -100,7 +100,7 @@ func CreateRepository(doer, u *user_model.User, opts models.CreateRepoOptions) (
100100

101101
// Initialize Issue Labels if selected
102102
if len(opts.IssueLabels) > 0 {
103-
if err = models.InitializeLabels(ctx, repo.ID, opts.IssueLabels, false); err != nil {
103+
if err = InitializeLabels(ctx, repo.ID, opts.IssueLabels, false); err != nil {
104104
rollbackRepo = repo
105105
rollbackRepo.OwnerID = u.ID
106106
return fmt.Errorf("InitializeLabels: %v", err)

0 commit comments

Comments
 (0)