From 62bcb2b7f1ce1a64f828d94f045d06bd8605455a Mon Sep 17 00:00:00 2001 From: John Olheiser <42128690+jolheiser@users.noreply.github.com> Date: Sun, 24 Nov 2019 23:17:51 -0600 Subject: [PATCH] Add avatar and issue labels to template repositories (#9149) * Add avatar and issue labels Signed-off-by: jolheiser * Fix redundant if-err Signed-off-by: jolheiser --- models/issue_label.go | 10 +++++-- models/repo.go | 26 +++++------------ models/repo_generate.go | 50 +++++++++++++++++++++++++++++++++ modules/auth/repo_form.go | 2 ++ options/locale/locale_en-US.ini | 2 ++ routers/repo/repo.go | 2 ++ services/repository/generate.go | 14 +++++++++ templates/repo/create.tmpl | 11 ++++++++ 8 files changed, 95 insertions(+), 22 deletions(-) diff --git a/models/issue_label.go b/models/issue_label.go index 77281e9bd4a6..ef1f37d77538 100644 --- a/models/issue_label.go +++ b/models/issue_label.go @@ -279,10 +279,9 @@ func GetLabelsInRepoByIDs(repoID int64, labelIDs []int64) ([]*Label, error) { Find(&labels) } -// GetLabelsByRepoID returns all labels that belong to given repository by ID. -func GetLabelsByRepoID(repoID int64, sortType string) ([]*Label, error) { +func getLabelsByRepoID(e Engine, repoID int64, sortType string) ([]*Label, error) { labels := make([]*Label, 0, 10) - sess := x.Where("repo_id = ?", repoID) + sess := e.Where("repo_id = ?", repoID) switch sortType { case "reversealphabetically": @@ -298,6 +297,11 @@ func GetLabelsByRepoID(repoID int64, sortType string) ([]*Label, error) { return labels, sess.Find(&labels) } +// GetLabelsByRepoID returns all labels that belong to given repository by ID. +func GetLabelsByRepoID(repoID int64, sortType string) ([]*Label, error) { + return getLabelsByRepoID(x, repoID, sortType) +} + func getLabelsByIssueID(e Engine, issueID int64) ([]*Label, error) { var labels []*Label return labels, e.Where("issue_label.issue_id = ?", issueID). diff --git a/models/repo.go b/models/repo.go index cbafe5d5a529..6c293da6f84b 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1257,22 +1257,6 @@ type CreateRepoOptions struct { Status RepositoryStatus } -// GenerateRepoOptions contains the template units to generate -type GenerateRepoOptions struct { - Name string - Description string - Private bool - GitContent bool - Topics bool - GitHooks bool - Webhooks bool -} - -// IsValid checks whether at least one option is chosen for generation -func (gro GenerateRepoOptions) IsValid() bool { - return gro.GitContent || gro.Topics || gro.GitHooks || gro.Webhooks // or other items as they are added -} - func getRepoInitFile(tp, name string) ([]byte, error) { cleanedName := strings.TrimLeft(path.Clean("/"+name), "/") relPath := path.Join("options", tp, cleanedName) @@ -2957,8 +2941,12 @@ func (repo *Repository) GetTreePathLock(treePath string) (*LFSLock, error) { return nil, nil } -// UpdateRepositoryCols updates repository's columns -func UpdateRepositoryCols(repo *Repository, cols ...string) error { - _, err := x.ID(repo.ID).Cols(cols...).Update(repo) +func updateRepositoryCols(e Engine, repo *Repository, cols ...string) error { + _, err := e.ID(repo.ID).Cols(cols...).Update(repo) return err } + +// UpdateRepositoryCols updates repository's columns +func UpdateRepositoryCols(repo *Repository, cols ...string) error { + return updateRepositoryCols(x, repo, cols...) +} diff --git a/models/repo_generate.go b/models/repo_generate.go index 6406180038d2..234bdc27f2ed 100644 --- a/models/repo_generate.go +++ b/models/repo_generate.go @@ -8,6 +8,7 @@ import ( "fmt" "os" "path/filepath" + "strconv" "strings" "time" @@ -17,6 +18,24 @@ import ( "github.com/unknwon/com" ) +// GenerateRepoOptions contains the template units to generate +type GenerateRepoOptions struct { + Name string + Description string + Private bool + GitContent bool + Topics bool + GitHooks bool + Webhooks bool + Avatar bool + IssueLabels bool +} + +// IsValid checks whether at least one option is chosen for generation +func (gro GenerateRepoOptions) IsValid() bool { + return gro.GitContent || gro.Topics || gro.GitHooks || gro.Webhooks || gro.Avatar || gro.IssueLabels // or other items as they are added +} + // generateRepository initializes repository from template func generateRepository(e Engine, repo, templateRepo *Repository) (err error) { 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 } return nil } + +// GenerateAvatar generates the avatar from a template repository +func GenerateAvatar(ctx DBContext, templateRepo, generateRepo *Repository) error { + generateRepo.Avatar = strings.Replace(templateRepo.Avatar, strconv.FormatInt(templateRepo.ID, 10), strconv.FormatInt(generateRepo.ID, 10), 1) + if err := com.Copy(templateRepo.CustomAvatarPath(), generateRepo.CustomAvatarPath()); err != nil { + return err + } + + return updateRepositoryCols(ctx.e, generateRepo, "avatar") +} + +// GenerateIssueLabels generates issue labels from a template repository +func GenerateIssueLabels(ctx DBContext, templateRepo, generateRepo *Repository) error { + templateLabels, err := getLabelsByRepoID(ctx.e, templateRepo.ID, "") + if err != nil { + return err + } + + for _, templateLabel := range templateLabels { + generateLabel := &Label{ + RepoID: generateRepo.ID, + Name: templateLabel.Name, + Description: templateLabel.Description, + Color: templateLabel.Color, + } + if err := newLabel(ctx.e, generateLabel); err != nil { + return err + } + } + return nil +} diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go index dd4f83478b82..1c873f2ea366 100644 --- a/modules/auth/repo_form.go +++ b/modules/auth/repo_form.go @@ -42,6 +42,8 @@ type CreateRepoForm struct { Topics bool GitHooks bool Webhooks bool + Avatar bool + Labels bool } // Validate validates the fields diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 3a209f62149d..be4522014f37 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -641,6 +641,8 @@ template.git_hooks = Git Hooks 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. template.webhooks = Webhooks template.topics = Topics +template.avatar = Avatar +template.issue_labels = Issue Labels template.one_item = Must select at least one template item template.invalid = Must select a template repository diff --git a/routers/repo/repo.go b/routers/repo/repo.go index 2c9721640605..969f96bfba35 100644 --- a/routers/repo/repo.go +++ b/routers/repo/repo.go @@ -190,6 +190,8 @@ func CreatePost(ctx *context.Context, form auth.CreateRepoForm) { Topics: form.Topics, GitHooks: form.GitHooks, Webhooks: form.Webhooks, + Avatar: form.Avatar, + IssueLabels: form.Labels, } if !opts.IsValid() { diff --git a/services/repository/generate.go b/services/repository/generate.go index bd7fd0ce1179..f7e8ebd8c4db 100644 --- a/services/repository/generate.go +++ b/services/repository/generate.go @@ -47,6 +47,20 @@ func GenerateRepository(doer, owner *models.User, templateRepo *models.Repositor } } + // Avatar + if opts.Avatar && len(templateRepo.Avatar) > 0 { + if err = models.GenerateAvatar(ctx, templateRepo, generateRepo); err != nil { + return err + } + } + + // Issue Labels + if opts.IssueLabels { + if err = models.GenerateIssueLabels(ctx, templateRepo, generateRepo); err != nil { + return err + } + } + return nil }); err != nil { if generateRepo != nil { diff --git a/templates/repo/create.tmpl b/templates/repo/create.tmpl index 69f2abb687f0..c71c3ab5a6af 100644 --- a/templates/repo/create.tmpl +++ b/templates/repo/create.tmpl @@ -88,6 +88,17 @@ +
+ +
+ + +
+
+ + +
+