aboutsummaryrefslogtreecommitdiff
path: root/internal/form/repo.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/form/repo.go')
-rw-r--r--internal/form/repo.go419
1 files changed, 419 insertions, 0 deletions
diff --git a/internal/form/repo.go b/internal/form/repo.go
new file mode 100644
index 00000000..d61bdbf1
--- /dev/null
+++ b/internal/form/repo.go
@@ -0,0 +1,419 @@
+// Copyright 2014 The Gogs Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package form
+
+import (
+ "net/url"
+ "strings"
+
+ "github.com/go-macaron/binding"
+ "github.com/unknwon/com"
+ "gopkg.in/macaron.v1"
+
+ "gogs.io/gogs/internal/db"
+)
+
+// _______________________________________ _________.______________________ _______________.___.
+// \______ \_ _____/\______ \_____ \ / _____/| \__ ___/\_____ \\______ \__ | |
+// | _/| __)_ | ___// | \ \_____ \ | | | | / | \| _// | |
+// | | \| \ | | / | \/ \| | | | / | \ | \\____ |
+// |____|_ /_______ / |____| \_______ /_______ /|___| |____| \_______ /____|_ // ______|
+// \/ \/ \/ \/ \/ \/ \/
+
+type CreateRepo struct {
+ UserID int64 `binding:"Required"`
+ RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
+ Private bool
+ Description string `binding:"MaxSize(512)"`
+ AutoInit bool
+ Gitignores string
+ License string
+ Readme string
+}
+
+func (f *CreateRepo) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+type MigrateRepo struct {
+ CloneAddr string `json:"clone_addr" binding:"Required"`
+ AuthUsername string `json:"auth_username"`
+ AuthPassword string `json:"auth_password"`
+ Uid int64 `json:"uid" binding:"Required"`
+ RepoName string `json:"repo_name" binding:"Required;AlphaDashDot;MaxSize(100)"`
+ Mirror bool `json:"mirror"`
+ Private bool `json:"private"`
+ Description string `json:"description" binding:"MaxSize(512)"`
+}
+
+func (f *MigrateRepo) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+// ParseRemoteAddr checks if given remote address is valid,
+// and returns composed URL with needed username and password.
+// It also checks if given user has permission when remote address
+// is actually a local path.
+func (f MigrateRepo) ParseRemoteAddr(user *db.User) (string, error) {
+ remoteAddr := strings.TrimSpace(f.CloneAddr)
+
+ // Remote address can be HTTP/HTTPS/Git URL or local path.
+ if strings.HasPrefix(remoteAddr, "http://") ||
+ strings.HasPrefix(remoteAddr, "https://") ||
+ strings.HasPrefix(remoteAddr, "git://") {
+ u, err := url.Parse(remoteAddr)
+ if err != nil {
+ return "", db.ErrInvalidCloneAddr{IsURLError: true}
+ }
+ if len(f.AuthUsername)+len(f.AuthPassword) > 0 {
+ u.User = url.UserPassword(f.AuthUsername, f.AuthPassword)
+ }
+ remoteAddr = u.String()
+ } else if !user.CanImportLocal() {
+ return "", db.ErrInvalidCloneAddr{IsPermissionDenied: true}
+ } else if !com.IsDir(remoteAddr) {
+ return "", db.ErrInvalidCloneAddr{IsInvalidPath: true}
+ }
+
+ return remoteAddr, nil
+}
+
+type RepoSetting struct {
+ RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
+ Description string `binding:"MaxSize(512)"`
+ Website string `binding:"Url;MaxSize(100)"`
+ Branch string
+ Interval int
+ MirrorAddress string
+ Private bool
+ EnablePrune bool
+
+ // Advanced settings
+ EnableWiki bool
+ AllowPublicWiki bool
+ EnableExternalWiki bool
+ ExternalWikiURL string
+ EnableIssues bool
+ AllowPublicIssues bool
+ EnableExternalTracker bool
+ ExternalTrackerURL string
+ TrackerURLFormat string
+ TrackerIssueStyle string
+ EnablePulls bool
+ PullsIgnoreWhitespace bool
+ PullsAllowRebase bool
+}
+
+func (f *RepoSetting) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+// __________ .__
+// \______ \____________ ____ ____ | |__
+// | | _/\_ __ \__ \ / \_/ ___\| | \
+// | | \ | | \// __ \| | \ \___| Y \
+// |______ / |__| (____ /___| /\___ >___| /
+// \/ \/ \/ \/ \/
+
+type ProtectBranch struct {
+ Protected bool
+ RequirePullRequest bool
+ EnableWhitelist bool
+ WhitelistUsers string
+ WhitelistTeams string
+}
+
+func (f *ProtectBranch) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+// __ __ ___. .__ .__ __
+// / \ / \ ____\_ |__ | |__ | |__ ____ | | __
+// \ \/\/ // __ \| __ \| | \| | \ / _ \| |/ /
+// \ /\ ___/| \_\ \ Y \ Y ( <_> ) <
+// \__/\ / \___ >___ /___| /___| /\____/|__|_ \
+// \/ \/ \/ \/ \/ \/
+
+type Webhook struct {
+ Events string
+ Create bool
+ Delete bool
+ Fork bool
+ Push bool
+ Issues bool
+ IssueComment bool
+ PullRequest bool
+ Release bool
+ Active bool
+}
+
+func (f Webhook) PushOnly() bool {
+ return f.Events == "push_only"
+}
+
+func (f Webhook) SendEverything() bool {
+ return f.Events == "send_everything"
+}
+
+func (f Webhook) ChooseEvents() bool {
+ return f.Events == "choose_events"
+}
+
+type NewWebhook struct {
+ PayloadURL string `binding:"Required;Url"`
+ ContentType int `binding:"Required"`
+ Secret string
+ Webhook
+}
+
+func (f *NewWebhook) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+type NewSlackHook struct {
+ PayloadURL string `binding:"Required;Url"`
+ Channel string `binding:"Required"`
+ Username string
+ IconURL string
+ Color string
+ Webhook
+}
+
+func (f *NewSlackHook) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+type NewDiscordHook struct {
+ PayloadURL string `binding:"Required;Url"`
+ Username string
+ IconURL string
+ Color string
+ Webhook
+}
+
+func (f *NewDiscordHook) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+type NewDingtalkHook struct {
+ PayloadURL string `binding:"Required;Url"`
+ Webhook
+}
+
+func (f *NewDingtalkHook) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+// .___
+// | | ______ ________ __ ____
+// | |/ ___// ___/ | \_/ __ \
+// | |\___ \ \___ \| | /\ ___/
+// |___/____ >____ >____/ \___ >
+// \/ \/ \/
+
+type NewIssue struct {
+ Title string `binding:"Required;MaxSize(255)"`
+ LabelIDs string `form:"label_ids"`
+ MilestoneID int64
+ AssigneeID int64
+ Content string
+ Files []string
+}
+
+func (f *NewIssue) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+type CreateComment struct {
+ Content string
+ Status string `binding:"OmitEmpty;In(reopen,close)"`
+ Files []string
+}
+
+func (f *CreateComment) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+// _____ .__.__ __
+// / \ |__| | ____ _______/ |_ ____ ____ ____
+// / \ / \| | | _/ __ \ / ___/\ __\/ _ \ / \_/ __ \
+// / Y \ | |_\ ___/ \___ \ | | ( <_> ) | \ ___/
+// \____|__ /__|____/\___ >____ > |__| \____/|___| /\___ >
+// \/ \/ \/ \/ \/
+
+type CreateMilestone struct {
+ Title string `binding:"Required;MaxSize(50)"`
+ Content string
+ Deadline string
+}
+
+func (f *CreateMilestone) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+// .____ ___. .__
+// | | _____ \_ |__ ____ | |
+// | | \__ \ | __ \_/ __ \| |
+// | |___ / __ \| \_\ \ ___/| |__
+// |_______ (____ /___ /\___ >____/
+// \/ \/ \/ \/
+
+type CreateLabel struct {
+ ID int64
+ Title string `binding:"Required;MaxSize(50)" locale:"repo.issues.label_title"`
+ Color string `binding:"Required;Size(7)" locale:"repo.issues.label_color"`
+}
+
+func (f *CreateLabel) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+type InitializeLabels struct {
+ TemplateName string `binding:"Required"`
+}
+
+func (f *InitializeLabels) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+// __________ .__
+// \______ \ ____ | | ____ _____ ______ ____
+// | _// __ \| | _/ __ \\__ \ / ___// __ \
+// | | \ ___/| |_\ ___/ / __ \_\___ \\ ___/
+// |____|_ /\___ >____/\___ >____ /____ >\___ >
+// \/ \/ \/ \/ \/ \/
+
+type NewRelease struct {
+ TagName string `binding:"Required"`
+ Target string `form:"tag_target" binding:"Required"`
+ Title string `binding:"Required"`
+ Content string
+ Draft string
+ Prerelease bool
+ Files []string
+}
+
+func (f *NewRelease) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+type EditRelease struct {
+ Title string `binding:"Required"`
+ Content string
+ Draft string
+ Prerelease bool
+ Files []string
+}
+
+func (f *EditRelease) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+// __ __.__ __ .__
+// / \ / \__| | _|__|
+// \ \/\/ / | |/ / |
+// \ /| | <| |
+// \__/\ / |__|__|_ \__|
+// \/ \/
+
+type NewWiki struct {
+ OldTitle string
+ Title string `binding:"Required"`
+ Content string `binding:"Required"`
+ Message string
+}
+
+// FIXME: use code generation to generate this method.
+func (f *NewWiki) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+// ___________ .___.__ __
+// \_ _____/ __| _/|__|/ |_
+// | __)_ / __ | | \ __\
+// | \/ /_/ | | || |
+// /_______ /\____ | |__||__|
+// \/ \/
+
+type EditRepoFile struct {
+ TreePath string `binding:"Required;MaxSize(500)"`
+ Content string `binding:"Required"`
+ CommitSummary string `binding:"MaxSize(100)`
+ CommitMessage string
+ CommitChoice string `binding:"Required;MaxSize(50)"`
+ NewBranchName string `binding:"AlphaDashDotSlash;MaxSize(100)"`
+ LastCommit string
+}
+
+func (f *EditRepoFile) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+func (f *EditRepoFile) IsNewBrnach() bool {
+ return f.CommitChoice == "commit-to-new-branch"
+}
+
+type EditPreviewDiff struct {
+ Content string
+}
+
+func (f *EditPreviewDiff) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+// ____ ___ .__ .___
+// | | \______ | | _________ __| _/
+// | | /\____ \| | / _ \__ \ / __ |
+// | | / | |_> > |_( <_> ) __ \_/ /_/ |
+// |______/ | __/|____/\____(____ /\____ |
+// |__| \/ \/
+//
+
+type UploadRepoFile struct {
+ TreePath string `binding:MaxSize(500)"`
+ CommitSummary string `binding:"MaxSize(100)`
+ CommitMessage string
+ CommitChoice string `binding:"Required;MaxSize(50)"`
+ NewBranchName string `binding:"AlphaDashDot;MaxSize(100)"`
+ Files []string
+}
+
+func (f *UploadRepoFile) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+func (f *UploadRepoFile) IsNewBrnach() bool {
+ return f.CommitChoice == "commit-to-new-branch"
+}
+
+type RemoveUploadFile struct {
+ File string `binding:"Required;MaxSize(50)"`
+}
+
+func (f *RemoveUploadFile) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+// ________ .__ __
+// \______ \ ____ | | _____/ |_ ____
+// | | \_/ __ \| | _/ __ \ __\/ __ \
+// | ` \ ___/| |_\ ___/| | \ ___/
+// /_______ /\___ >____/\___ >__| \___ >
+// \/ \/ \/ \/
+
+type DeleteRepoFile struct {
+ CommitSummary string `binding:"MaxSize(100)`
+ CommitMessage string
+ CommitChoice string `binding:"Required;MaxSize(50)"`
+ NewBranchName string `binding:"AlphaDashDot;MaxSize(100)"`
+}
+
+func (f *DeleteRepoFile) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
+ return validate(errs, ctx.Data, f, ctx.Locale)
+}
+
+func (f *DeleteRepoFile) IsNewBrnach() bool {
+ return f.CommitChoice == "commit-to-new-branch"
+}