Skip to content

Commit 0118b6a

Browse files
jolheiserguillep2k
authored andcommitted
Add option to initialize repository with labels (#6061)
* Add optional label sets on repo creation * Fix CRLF * Instead of hardcoding default, make it the helper * Move label set init out of repo init Add a new error for the router Combine router label init with repo creation label init Signed-off-by: jolheiser <[email protected]> * Add issue labels to Swagger for repo creation Signed-off-by: jolheiser <[email protected]> * Update models/issue_label.go Co-Authored-By: Lauris BH <[email protected]> * Update models/issue_label.go Co-Authored-By: guillep2k <[email protected]>
1 parent d4e11eb commit 0118b6a

File tree

11 files changed

+87
-16
lines changed

11 files changed

+87
-16
lines changed

models/error.go

+16
Original file line numberDiff line numberDiff line change
@@ -1058,6 +1058,22 @@ func (err ErrIssueNotExist) Error() string {
10581058
return fmt.Sprintf("issue does not exist [id: %d, repo_id: %d, index: %d]", err.ID, err.RepoID, err.Index)
10591059
}
10601060

1061+
// ErrIssueLabelTemplateLoad represents a "ErrIssueLabelTemplateLoad" kind of error.
1062+
type ErrIssueLabelTemplateLoad struct {
1063+
TemplateFile string
1064+
OriginalError error
1065+
}
1066+
1067+
// IsErrIssueLabelTemplateLoad checks if an error is a ErrIssueLabelTemplateLoad.
1068+
func IsErrIssueLabelTemplateLoad(err error) bool {
1069+
_, ok := err.(ErrIssueLabelTemplateLoad)
1070+
return ok
1071+
}
1072+
1073+
func (err ErrIssueLabelTemplateLoad) Error() string {
1074+
return fmt.Sprintf("Failed to load label template file '%s': %v", err.TemplateFile, err.OriginalError)
1075+
}
1076+
10611077
// __________ .__ .__ __________ __
10621078
// \______ \__ __| | | |\______ \ ____ ________ __ ____ _______/ |_
10631079
// | ___/ | \ | | | | _// __ \/ ____/ | \_/ __ \ / ___/\ __\

models/issue_label.go

+28
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,34 @@ func (label *Label) ForegroundColor() template.CSS {
127127
return template.CSS("#000")
128128
}
129129

130+
func initalizeLabels(e Engine, repoID int64, labelTemplate string) error {
131+
list, err := GetLabelTemplateFile(labelTemplate)
132+
if err != nil {
133+
return ErrIssueLabelTemplateLoad{labelTemplate, err}
134+
}
135+
136+
labels := make([]*Label, len(list))
137+
for i := 0; i < len(list); i++ {
138+
labels[i] = &Label{
139+
RepoID: repoID,
140+
Name: list[i][0],
141+
Description: list[i][2],
142+
Color: list[i][1],
143+
}
144+
}
145+
for _, label := range labels {
146+
if err = newLabel(e, label); err != nil {
147+
return err
148+
}
149+
}
150+
return nil
151+
}
152+
153+
// InitalizeLabels adds a label set to a repository using a template
154+
func InitalizeLabels(repoID int64, labelTemplate string) error {
155+
return initalizeLabels(x, repoID, labelTemplate)
156+
}
157+
130158
func newLabel(e Engine, label *Label) error {
131159
_, err := e.Insert(label)
132160
return err

models/repo.go

+8
Original file line numberDiff line numberDiff line change
@@ -1098,6 +1098,7 @@ type CreateRepoOptions struct {
10981098
Description string
10991099
OriginalURL string
11001100
Gitignores string
1101+
IssueLabels string
11011102
License string
11021103
Readme string
11031104
IsPrivate bool
@@ -1394,6 +1395,13 @@ func CreateRepository(doer, u *User, opts CreateRepoOptions) (_ *Repository, err
13941395
return nil, fmt.Errorf("initRepository: %v", err)
13951396
}
13961397

1398+
// Initialize Issue Labels if selected
1399+
if len(opts.IssueLabels) > 0 {
1400+
if err = initalizeLabels(sess, repo.ID, opts.IssueLabels); err != nil {
1401+
return nil, fmt.Errorf("initalizeLabels: %v", err)
1402+
}
1403+
}
1404+
13971405
_, stderr, err := process.GetManager().ExecDir(-1,
13981406
repoPath, fmt.Sprintf("CreateRepository(git update-server-info): %s", repoPath),
13991407
git.GitExecutable, "update-server-info")

modules/auth/repo_form.go

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ type CreateRepoForm struct {
3333
Description string `binding:"MaxSize(255)"`
3434
AutoInit bool
3535
Gitignores string
36+
IssueLabels string
3637
License string
3738
Readme string
3839
}

modules/structs/repo.go

+2
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ type CreateRepoOption struct {
6767
Description string `json:"description" binding:"MaxSize(255)"`
6868
// Whether the repository is private
6969
Private bool `json:"private"`
70+
// Issue Label set to use
71+
IssueLabels string `json:"issue_labels"`
7072
// Whether the repository should be auto-intialized?
7173
AutoInit bool `json:"auto_init"`
7274
// Gitignores to use

options/locale/locale_en-US.ini

+2
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,8 @@ fork_visibility_helper = The visibility of a forked repository cannot be changed
578578
repo_desc = Description
579579
repo_lang = Language
580580
repo_gitignore_helper = Select .gitignore templates.
581+
issue_labels = Issue Labels
582+
issue_labels_helper = Select an issue label set.
581583
license = License
582584
license_helper = Select a license file.
583585
readme = README

routers/api/v1/repo/repo.go

+1
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ func CreateUserRepo(ctx *context.APIContext, owner *models.User, opt api.CreateR
206206
repo, err := models.CreateRepository(ctx.User, owner, models.CreateRepoOptions{
207207
Name: opt.Name,
208208
Description: opt.Description,
209+
IssueLabels: opt.IssueLabels,
209210
Gitignores: opt.Gitignores,
210211
License: opt.License,
211212
Readme: opt.Readme,

routers/repo/issue_label.go

+7-16
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,15 @@ func InitializeLabels(ctx *context.Context, form auth.InitializeLabelsForm) {
3333
ctx.Redirect(ctx.Repo.RepoLink + "/labels")
3434
return
3535
}
36-
list, err := models.GetLabelTemplateFile(form.TemplateName)
37-
if err != nil {
38-
ctx.Flash.Error(ctx.Tr("repo.issues.label_templates.fail_to_load_file", form.TemplateName, err))
39-
ctx.Redirect(ctx.Repo.RepoLink + "/labels")
40-
return
41-
}
4236

43-
labels := make([]*models.Label, len(list))
44-
for i := 0; i < len(list); i++ {
45-
labels[i] = &models.Label{
46-
RepoID: ctx.Repo.Repository.ID,
47-
Name: list[i][0],
48-
Description: list[i][2],
49-
Color: list[i][1],
37+
if err := models.InitalizeLabels(ctx.Repo.Repository.ID, form.TemplateName); err != nil {
38+
if models.IsErrIssueLabelTemplateLoad(err) {
39+
originalErr := err.(models.ErrIssueLabelTemplateLoad).OriginalError
40+
ctx.Flash.Error(ctx.Tr("repo.issues.label_templates.fail_to_load_file", form.TemplateName, originalErr))
41+
ctx.Redirect(ctx.Repo.RepoLink + "/labels")
42+
return
5043
}
51-
}
52-
if err := models.NewLabels(labels...); err != nil {
53-
ctx.ServerError("NewLabels", err)
44+
ctx.ServerError("InitalizeLabels", err)
5445
return
5546
}
5647
ctx.Redirect(ctx.Repo.RepoLink + "/labels")

routers/repo/repo.go

+3
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ func Create(ctx *context.Context) {
115115

116116
// Give default value for template to render.
117117
ctx.Data["Gitignores"] = models.Gitignores
118+
ctx.Data["LabelTemplates"] = models.LabelTemplates
118119
ctx.Data["Licenses"] = models.Licenses
119120
ctx.Data["Readmes"] = models.Readmes
120121
ctx.Data["readme"] = "Default"
@@ -155,6 +156,7 @@ func CreatePost(ctx *context.Context, form auth.CreateRepoForm) {
155156
ctx.Data["Title"] = ctx.Tr("new_repo")
156157

157158
ctx.Data["Gitignores"] = models.Gitignores
159+
ctx.Data["LabelTemplates"] = models.LabelTemplates
158160
ctx.Data["Licenses"] = models.Licenses
159161
ctx.Data["Readmes"] = models.Readmes
160162

@@ -173,6 +175,7 @@ func CreatePost(ctx *context.Context, form auth.CreateRepoForm) {
173175
Name: form.RepoName,
174176
Description: form.Description,
175177
Gitignores: form.Gitignores,
178+
IssueLabels: form.IssueLabels,
176179
License: form.License,
177180
Readme: form.Readme,
178181
IsPrivate: form.Private || setting.Repository.ForcePrivate,

templates/repo/create.tmpl

+14
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,20 @@
5656
<textarea id="description" name="description">{{.description}}</textarea>
5757
</div>
5858

59+
<div class="inline field">
60+
<label>{{.i18n.Tr "repo.issue_labels"}}</label>
61+
<div class="ui search normal selection dropdown">
62+
<input type="hidden" name="issue_labels" value="{{.issueLabels}}">
63+
<div class="default text">{{.i18n.Tr "repo.issue_labels_helper"}}</div>
64+
<div class="menu">
65+
<div class="item" data-value="">{{.i18n.Tr "repo.issue_labels_helper"}}</div>
66+
{{range .LabelTemplates}}
67+
<div class="item" data-value="{{.}}">{{.}}</div>
68+
{{end}}
69+
</div>
70+
</div>
71+
</div>
72+
5973
<div class="ui divider"></div>
6074

6175
<div class="inline field">

templates/swagger/v1_json.tmpl

+5
Original file line numberDiff line numberDiff line change
@@ -7843,6 +7843,11 @@
78437843
"type": "string",
78447844
"x-go-name": "Gitignores"
78457845
},
7846+
"issue_labels": {
7847+
"description": "Issue Label set to use",
7848+
"type": "string",
7849+
"x-go-name": "IssueLabels"
7850+
},
78467851
"license": {
78477852
"description": "License to use",
78487853
"type": "string",

0 commit comments

Comments
 (0)