Skip to content

Commit 62bcb2b

Browse files
jolheiserlunny
authored andcommitted
Add avatar and issue labels to template repositories (#9149)
* Add avatar and issue labels Signed-off-by: jolheiser <john.olheiser@gmail.com> * Fix redundant if-err Signed-off-by: jolheiser <john.olheiser@gmail.com>
1 parent 95c3dc8 commit 62bcb2b

File tree

8 files changed

+94
-21
lines changed

8 files changed

+94
-21
lines changed

models/issue_label.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -279,10 +279,9 @@ func GetLabelsInRepoByIDs(repoID int64, labelIDs []int64) ([]*Label, error) {
279279
Find(&labels)
280280
}
281281

282-
// GetLabelsByRepoID returns all labels that belong to given repository by ID.
283-
func GetLabelsByRepoID(repoID int64, sortType string) ([]*Label, error) {
282+
func getLabelsByRepoID(e Engine, repoID int64, sortType string) ([]*Label, error) {
284283
labels := make([]*Label, 0, 10)
285-
sess := x.Where("repo_id = ?", repoID)
284+
sess := e.Where("repo_id = ?", repoID)
286285

287286
switch sortType {
288287
case "reversealphabetically":
@@ -298,6 +297,11 @@ func GetLabelsByRepoID(repoID int64, sortType string) ([]*Label, error) {
298297
return labels, sess.Find(&labels)
299298
}
300299

300+
// GetLabelsByRepoID returns all labels that belong to given repository by ID.
301+
func GetLabelsByRepoID(repoID int64, sortType string) ([]*Label, error) {
302+
return getLabelsByRepoID(x, repoID, sortType)
303+
}
304+
301305
func getLabelsByIssueID(e Engine, issueID int64) ([]*Label, error) {
302306
var labels []*Label
303307
return labels, e.Where("issue_label.issue_id = ?", issueID).

models/repo.go

+6-18
Original file line numberDiff line numberDiff line change
@@ -1257,22 +1257,6 @@ type CreateRepoOptions struct {
12571257
Status RepositoryStatus
12581258
}
12591259

1260-
// GenerateRepoOptions contains the template units to generate
1261-
type GenerateRepoOptions struct {
1262-
Name string
1263-
Description string
1264-
Private bool
1265-
GitContent bool
1266-
Topics bool
1267-
GitHooks bool
1268-
Webhooks bool
1269-
}
1270-
1271-
// IsValid checks whether at least one option is chosen for generation
1272-
func (gro GenerateRepoOptions) IsValid() bool {
1273-
return gro.GitContent || gro.Topics || gro.GitHooks || gro.Webhooks // or other items as they are added
1274-
}
1275-
12761260
func getRepoInitFile(tp, name string) ([]byte, error) {
12771261
cleanedName := strings.TrimLeft(path.Clean("/"+name), "/")
12781262
relPath := path.Join("options", tp, cleanedName)
@@ -2957,8 +2941,12 @@ func (repo *Repository) GetTreePathLock(treePath string) (*LFSLock, error) {
29572941
return nil, nil
29582942
}
29592943

2944+
func updateRepositoryCols(e Engine, repo *Repository, cols ...string) error {
2945+
_, err := e.ID(repo.ID).Cols(cols...).Update(repo)
2946+
return err
2947+
}
2948+
29602949
// UpdateRepositoryCols updates repository's columns
29612950
func UpdateRepositoryCols(repo *Repository, cols ...string) error {
2962-
_, err := x.ID(repo.ID).Cols(cols...).Update(repo)
2963-
return err
2951+
return updateRepositoryCols(x, repo, cols...)
29642952
}

models/repo_generate.go

+50
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99
"os"
1010
"path/filepath"
11+
"strconv"
1112
"strings"
1213
"time"
1314

@@ -17,6 +18,24 @@ import (
1718
"github.com/unknwon/com"
1819
)
1920

21+
// GenerateRepoOptions contains the template units to generate
22+
type GenerateRepoOptions struct {
23+
Name string
24+
Description string
25+
Private bool
26+
GitContent bool
27+
Topics bool
28+
GitHooks bool
29+
Webhooks bool
30+
Avatar bool
31+
IssueLabels bool
32+
}
33+
34+
// IsValid checks whether at least one option is chosen for generation
35+
func (gro GenerateRepoOptions) IsValid() bool {
36+
return gro.GitContent || gro.Topics || gro.GitHooks || gro.Webhooks || gro.Avatar || gro.IssueLabels // or other items as they are added
37+
}
38+
2039
// generateRepository initializes repository from template
2140
func generateRepository(e Engine, repo, templateRepo *Repository) (err error) {
2241
tmpDir := filepath.Join(os.TempDir(), "gitea-"+repo.Name+"-"+com.ToStr(time.Now().Nanosecond()))
@@ -160,3 +179,34 @@ func GenerateWebhooks(ctx DBContext, templateRepo, generateRepo *Repository) err
160179
}
161180
return nil
162181
}
182+
183+
// GenerateAvatar generates the avatar from a template repository
184+
func GenerateAvatar(ctx DBContext, templateRepo, generateRepo *Repository) error {
185+
generateRepo.Avatar = strings.Replace(templateRepo.Avatar, strconv.FormatInt(templateRepo.ID, 10), strconv.FormatInt(generateRepo.ID, 10), 1)
186+
if err := com.Copy(templateRepo.CustomAvatarPath(), generateRepo.CustomAvatarPath()); err != nil {
187+
return err
188+
}
189+
190+
return updateRepositoryCols(ctx.e, generateRepo, "avatar")
191+
}
192+
193+
// GenerateIssueLabels generates issue labels from a template repository
194+
func GenerateIssueLabels(ctx DBContext, templateRepo, generateRepo *Repository) error {
195+
templateLabels, err := getLabelsByRepoID(ctx.e, templateRepo.ID, "")
196+
if err != nil {
197+
return err
198+
}
199+
200+
for _, templateLabel := range templateLabels {
201+
generateLabel := &Label{
202+
RepoID: generateRepo.ID,
203+
Name: templateLabel.Name,
204+
Description: templateLabel.Description,
205+
Color: templateLabel.Color,
206+
}
207+
if err := newLabel(ctx.e, generateLabel); err != nil {
208+
return err
209+
}
210+
}
211+
return nil
212+
}

modules/auth/repo_form.go

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ type CreateRepoForm struct {
4242
Topics bool
4343
GitHooks bool
4444
Webhooks bool
45+
Avatar bool
46+
Labels bool
4547
}
4648

4749
// Validate validates the fields

options/locale/locale_en-US.ini

+2
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,8 @@ template.git_hooks = Git Hooks
641641
template.git_hooks_tooltip = You are currently unable to modify or remove git hooks once added. Select this only if you trust the template repository.
642642
template.webhooks = Webhooks
643643
template.topics = Topics
644+
template.avatar = Avatar
645+
template.issue_labels = Issue Labels
644646
template.one_item = Must select at least one template item
645647
template.invalid = Must select a template repository
646648

routers/repo/repo.go

+2
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ func CreatePost(ctx *context.Context, form auth.CreateRepoForm) {
190190
Topics: form.Topics,
191191
GitHooks: form.GitHooks,
192192
Webhooks: form.Webhooks,
193+
Avatar: form.Avatar,
194+
IssueLabels: form.Labels,
193195
}
194196

195197
if !opts.IsValid() {

services/repository/generate.go

+14
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,20 @@ func GenerateRepository(doer, owner *models.User, templateRepo *models.Repositor
4747
}
4848
}
4949

50+
// Avatar
51+
if opts.Avatar && len(templateRepo.Avatar) > 0 {
52+
if err = models.GenerateAvatar(ctx, templateRepo, generateRepo); err != nil {
53+
return err
54+
}
55+
}
56+
57+
// Issue Labels
58+
if opts.IssueLabels {
59+
if err = models.GenerateIssueLabels(ctx, templateRepo, generateRepo); err != nil {
60+
return err
61+
}
62+
}
63+
5064
return nil
5165
}); err != nil {
5266
if generateRepo != nil {

templates/repo/create.tmpl

+11
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,17 @@
8888
<label>{{.i18n.Tr "repo.template.topics"}}</label>
8989
</div>
9090
</div>
91+
<div class="inline field">
92+
<label></label>
93+
<div class="ui checkbox">
94+
<input class="hidden" name="avatar" type="checkbox" tabindex="0" {{if .avatar}}checked{{end}}>
95+
<label>{{.i18n.Tr "repo.template.avatar"}}</label>
96+
</div>
97+
<div class="ui checkbox">
98+
<input class="hidden" name="labels" type="checkbox" tabindex="0" {{if .labels}}checked{{end}}>
99+
<label>{{.i18n.Tr "repo.template.issue_labels"}}</label>
100+
</div>
101+
</div>
91102
</div>
92103

93104
<div id="non_template">

0 commit comments

Comments
 (0)