repo.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package form
  5. import (
  6. "net/url"
  7. "strings"
  8. "github.com/Unknwon/com"
  9. "github.com/go-macaron/binding"
  10. "gopkg.in/macaron.v1"
  11. "github.com/gogs/gogs/models"
  12. )
  13. // _______________________________________ _________.______________________ _______________.___.
  14. // \______ \_ _____/\______ \_____ \ / _____/| \__ ___/\_____ \\______ \__ | |
  15. // | _/| __)_ | ___// | \ \_____ \ | | | | / | \| _// | |
  16. // | | \| \ | | / | \/ \| | | | / | \ | \\____ |
  17. // |____|_ /_______ / |____| \_______ /_______ /|___| |____| \_______ /____|_ // ______|
  18. // \/ \/ \/ \/ \/ \/ \/
  19. type CreateRepo struct {
  20. UserID int64 `binding:"Required"`
  21. RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
  22. Private bool
  23. Description string `binding:"MaxSize(255)"`
  24. AutoInit bool
  25. Gitignores string
  26. License string
  27. Readme string
  28. }
  29. func (f *CreateRepo) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  30. return validate(errs, ctx.Data, f, ctx.Locale)
  31. }
  32. type MigrateRepo struct {
  33. CloneAddr string `json:"clone_addr" binding:"Required"`
  34. AuthUsername string `json:"auth_username"`
  35. AuthPassword string `json:"auth_password"`
  36. Uid int64 `json:"uid" binding:"Required"`
  37. RepoName string `json:"repo_name" binding:"Required;AlphaDashDot;MaxSize(100)"`
  38. Mirror bool `json:"mirror"`
  39. Private bool `json:"private"`
  40. Description string `json:"description" binding:"MaxSize(255)"`
  41. }
  42. func (f *MigrateRepo) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  43. return validate(errs, ctx.Data, f, ctx.Locale)
  44. }
  45. // ParseRemoteAddr checks if given remote address is valid,
  46. // and returns composed URL with needed username and password.
  47. // It also checks if given user has permission when remote address
  48. // is actually a local path.
  49. func (f MigrateRepo) ParseRemoteAddr(user *models.User) (string, error) {
  50. remoteAddr := strings.TrimSpace(f.CloneAddr)
  51. // Remote address can be HTTP/HTTPS/Git URL or local path.
  52. if strings.HasPrefix(remoteAddr, "http://") ||
  53. strings.HasPrefix(remoteAddr, "https://") ||
  54. strings.HasPrefix(remoteAddr, "git://") {
  55. u, err := url.Parse(remoteAddr)
  56. if err != nil {
  57. return "", models.ErrInvalidCloneAddr{IsURLError: true}
  58. }
  59. if len(f.AuthUsername)+len(f.AuthPassword) > 0 {
  60. u.User = url.UserPassword(f.AuthUsername, f.AuthPassword)
  61. }
  62. remoteAddr = u.String()
  63. } else if !user.CanImportLocal() {
  64. return "", models.ErrInvalidCloneAddr{IsPermissionDenied: true}
  65. } else if !com.IsDir(remoteAddr) {
  66. return "", models.ErrInvalidCloneAddr{IsInvalidPath: true}
  67. }
  68. return remoteAddr, nil
  69. }
  70. type RepoSetting struct {
  71. RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
  72. Description string `binding:"MaxSize(255)"`
  73. Website string `binding:"Url;MaxSize(100)"`
  74. Branch string
  75. Interval int
  76. MirrorAddress string
  77. Private bool
  78. EnablePrune bool
  79. // Advanced settings
  80. EnableWiki bool
  81. AllowPublicWiki bool
  82. EnableExternalWiki bool
  83. ExternalWikiURL string
  84. EnableIssues bool
  85. AllowPublicIssues bool
  86. EnableExternalTracker bool
  87. ExternalTrackerURL string
  88. TrackerURLFormat string
  89. TrackerIssueStyle string
  90. EnablePulls bool
  91. PullsIgnoreWhitespace bool
  92. PullsAllowRebase bool
  93. }
  94. func (f *RepoSetting) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  95. return validate(errs, ctx.Data, f, ctx.Locale)
  96. }
  97. // __________ .__
  98. // \______ \____________ ____ ____ | |__
  99. // | | _/\_ __ \__ \ / \_/ ___\| | \
  100. // | | \ | | \// __ \| | \ \___| Y \
  101. // |______ / |__| (____ /___| /\___ >___| /
  102. // \/ \/ \/ \/ \/
  103. type ProtectBranch struct {
  104. Protected bool
  105. RequirePullRequest bool
  106. EnableWhitelist bool
  107. WhitelistUsers string
  108. WhitelistTeams string
  109. }
  110. func (f *ProtectBranch) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  111. return validate(errs, ctx.Data, f, ctx.Locale)
  112. }
  113. // __ __ ___. .__ .__ __
  114. // / \ / \ ____\_ |__ | |__ | |__ ____ | | __
  115. // \ \/\/ // __ \| __ \| | \| | \ / _ \| |/ /
  116. // \ /\ ___/| \_\ \ Y \ Y ( <_> ) <
  117. // \__/\ / \___ >___ /___| /___| /\____/|__|_ \
  118. // \/ \/ \/ \/ \/ \/
  119. type Webhook struct {
  120. Events string
  121. Create bool
  122. Delete bool
  123. Fork bool
  124. Push bool
  125. Issues bool
  126. IssueComment bool
  127. PullRequest bool
  128. Release bool
  129. Active bool
  130. }
  131. func (f Webhook) PushOnly() bool {
  132. return f.Events == "push_only"
  133. }
  134. func (f Webhook) SendEverything() bool {
  135. return f.Events == "send_everything"
  136. }
  137. func (f Webhook) ChooseEvents() bool {
  138. return f.Events == "choose_events"
  139. }
  140. type NewWebhook struct {
  141. PayloadURL string `binding:"Required;Url"`
  142. ContentType int `binding:"Required"`
  143. Secret string
  144. Webhook
  145. }
  146. func (f *NewWebhook) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  147. return validate(errs, ctx.Data, f, ctx.Locale)
  148. }
  149. type NewSlackHook struct {
  150. PayloadURL string `binding:"Required;Url"`
  151. Channel string `binding:"Required"`
  152. Username string
  153. IconURL string
  154. Color string
  155. Webhook
  156. }
  157. func (f *NewSlackHook) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  158. return validate(errs, ctx.Data, f, ctx.Locale)
  159. }
  160. type NewDiscordHook struct {
  161. PayloadURL string `binding:"Required;Url"`
  162. Username string
  163. IconURL string
  164. Color string
  165. Webhook
  166. }
  167. func (f *NewDiscordHook) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  168. return validate(errs, ctx.Data, f, ctx.Locale)
  169. }
  170. type NewDingtalkHook struct {
  171. PayloadURL string `binding:"Required;Url"`
  172. Webhook
  173. }
  174. func (f *NewDingtalkHook) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  175. return validate(errs, ctx.Data, f, ctx.Locale)
  176. }
  177. // .___
  178. // | | ______ ________ __ ____
  179. // | |/ ___// ___/ | \_/ __ \
  180. // | |\___ \ \___ \| | /\ ___/
  181. // |___/____ >____ >____/ \___ >
  182. // \/ \/ \/
  183. type NewIssue struct {
  184. Title string `binding:"Required;MaxSize(255)"`
  185. LabelIDs string `form:"label_ids"`
  186. MilestoneID int64
  187. AssigneeID int64
  188. Content string
  189. Files []string
  190. }
  191. func (f *NewIssue) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  192. return validate(errs, ctx.Data, f, ctx.Locale)
  193. }
  194. type CreateComment struct {
  195. Content string
  196. Status string `binding:"OmitEmpty;In(reopen,close)"`
  197. Files []string
  198. }
  199. func (f *CreateComment) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  200. return validate(errs, ctx.Data, f, ctx.Locale)
  201. }
  202. // _____ .__.__ __
  203. // / \ |__| | ____ _______/ |_ ____ ____ ____
  204. // / \ / \| | | _/ __ \ / ___/\ __\/ _ \ / \_/ __ \
  205. // / Y \ | |_\ ___/ \___ \ | | ( <_> ) | \ ___/
  206. // \____|__ /__|____/\___ >____ > |__| \____/|___| /\___ >
  207. // \/ \/ \/ \/ \/
  208. type CreateMilestone struct {
  209. Title string `binding:"Required;MaxSize(50)"`
  210. Content string
  211. Deadline string
  212. }
  213. func (f *CreateMilestone) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  214. return validate(errs, ctx.Data, f, ctx.Locale)
  215. }
  216. // .____ ___. .__
  217. // | | _____ \_ |__ ____ | |
  218. // | | \__ \ | __ \_/ __ \| |
  219. // | |___ / __ \| \_\ \ ___/| |__
  220. // |_______ (____ /___ /\___ >____/
  221. // \/ \/ \/ \/
  222. type CreateLabel struct {
  223. ID int64
  224. Title string `binding:"Required;MaxSize(50)" locale:"repo.issues.label_title"`
  225. Color string `binding:"Required;Size(7)" locale:"repo.issues.label_color"`
  226. }
  227. func (f *CreateLabel) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  228. return validate(errs, ctx.Data, f, ctx.Locale)
  229. }
  230. type InitializeLabels struct {
  231. TemplateName string `binding:"Required"`
  232. }
  233. func (f *InitializeLabels) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  234. return validate(errs, ctx.Data, f, ctx.Locale)
  235. }
  236. // __________ .__
  237. // \______ \ ____ | | ____ _____ ______ ____
  238. // | _// __ \| | _/ __ \\__ \ / ___// __ \
  239. // | | \ ___/| |_\ ___/ / __ \_\___ \\ ___/
  240. // |____|_ /\___ >____/\___ >____ /____ >\___ >
  241. // \/ \/ \/ \/ \/ \/
  242. type NewRelease struct {
  243. TagName string `binding:"Required"`
  244. Target string `form:"tag_target" binding:"Required"`
  245. Title string `binding:"Required"`
  246. Content string
  247. Draft string
  248. Prerelease bool
  249. Files []string
  250. }
  251. func (f *NewRelease) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  252. return validate(errs, ctx.Data, f, ctx.Locale)
  253. }
  254. type EditRelease struct {
  255. Title string `binding:"Required"`
  256. Content string
  257. Draft string
  258. Prerelease bool
  259. Files []string
  260. }
  261. func (f *EditRelease) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  262. return validate(errs, ctx.Data, f, ctx.Locale)
  263. }
  264. // __ __.__ __ .__
  265. // / \ / \__| | _|__|
  266. // \ \/\/ / | |/ / |
  267. // \ /| | <| |
  268. // \__/\ / |__|__|_ \__|
  269. // \/ \/
  270. type NewWiki struct {
  271. OldTitle string
  272. Title string `binding:"Required"`
  273. Content string `binding:"Required"`
  274. Message string
  275. }
  276. // FIXME: use code generation to generate this method.
  277. func (f *NewWiki) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  278. return validate(errs, ctx.Data, f, ctx.Locale)
  279. }
  280. // ___________ .___.__ __
  281. // \_ _____/ __| _/|__|/ |_
  282. // | __)_ / __ | | \ __\
  283. // | \/ /_/ | | || |
  284. // /_______ /\____ | |__||__|
  285. // \/ \/
  286. type EditRepoFile struct {
  287. TreePath string `binding:"Required;MaxSize(500)"`
  288. Content string `binding:"Required"`
  289. CommitSummary string `binding:"MaxSize(100)`
  290. CommitMessage string
  291. CommitChoice string `binding:"Required;MaxSize(50)"`
  292. NewBranchName string `binding:"AlphaDashDotSlash;MaxSize(100)"`
  293. LastCommit string
  294. }
  295. func (f *EditRepoFile) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  296. return validate(errs, ctx.Data, f, ctx.Locale)
  297. }
  298. func (f *EditRepoFile) IsNewBrnach() bool {
  299. return f.CommitChoice == "commit-to-new-branch"
  300. }
  301. type EditPreviewDiff struct {
  302. Content string
  303. }
  304. func (f *EditPreviewDiff) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  305. return validate(errs, ctx.Data, f, ctx.Locale)
  306. }
  307. // ____ ___ .__ .___
  308. // | | \______ | | _________ __| _/
  309. // | | /\____ \| | / _ \__ \ / __ |
  310. // | | / | |_> > |_( <_> ) __ \_/ /_/ |
  311. // |______/ | __/|____/\____(____ /\____ |
  312. // |__| \/ \/
  313. //
  314. type UploadRepoFile struct {
  315. TreePath string `binding:MaxSize(500)"`
  316. CommitSummary string `binding:"MaxSize(100)`
  317. CommitMessage string
  318. CommitChoice string `binding:"Required;MaxSize(50)"`
  319. NewBranchName string `binding:"AlphaDashDot;MaxSize(100)"`
  320. Files []string
  321. }
  322. func (f *UploadRepoFile) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  323. return validate(errs, ctx.Data, f, ctx.Locale)
  324. }
  325. func (f *UploadRepoFile) IsNewBrnach() bool {
  326. return f.CommitChoice == "commit-to-new-branch"
  327. }
  328. type RemoveUploadFile struct {
  329. File string `binding:"Required;MaxSize(50)"`
  330. }
  331. func (f *RemoveUploadFile) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  332. return validate(errs, ctx.Data, f, ctx.Locale)
  333. }
  334. // ________ .__ __
  335. // \______ \ ____ | | _____/ |_ ____
  336. // | | \_/ __ \| | _/ __ \ __\/ __ \
  337. // | ` \ ___/| |_\ ___/| | \ ___/
  338. // /_______ /\___ >____/\___ >__| \___ >
  339. // \/ \/ \/ \/
  340. type DeleteRepoFile struct {
  341. CommitSummary string `binding:"MaxSize(100)`
  342. CommitMessage string
  343. CommitChoice string `binding:"Required;MaxSize(50)"`
  344. NewBranchName string `binding:"AlphaDashDot;MaxSize(100)"`
  345. }
  346. func (f *DeleteRepoFile) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
  347. return validate(errs, ctx.Data, f, ctx.Locale)
  348. }
  349. func (f *DeleteRepoFile) IsNewBrnach() bool {
  350. return f.CommitChoice == "commit-to-new-branch"
  351. }