2014-07-26 08:24:27 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
2017-05-29 10:17:15 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2014-07-26 08:24:27 +04:00
2021-01-26 18:36:53 +03:00
package forms
2014-07-26 08:24:27 +04:00
import (
2021-01-26 18:36:53 +03:00
"net/http"
2015-11-04 02:40:52 +03:00
"net/url"
"strings"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/models"
2022-06-13 12:37:59 +03:00
issues_model "code.gitea.io/gitea/models/issues"
2022-03-29 17:16:31 +03:00
project_model "code.gitea.io/gitea/models/project"
2019-02-18 23:55:04 +03:00
"code.gitea.io/gitea/modules/setting"
2020-09-23 23:25:46 +03:00
"code.gitea.io/gitea/modules/structs"
2021-01-30 11:55:53 +03:00
"code.gitea.io/gitea/modules/web/middleware"
2024-02-27 10:12:22 +03:00
"code.gitea.io/gitea/services/context"
2022-08-11 18:48:23 +03:00
"code.gitea.io/gitea/services/webhook"
2018-09-10 17:31:08 +03:00
2021-01-26 18:36:53 +03:00
"gitea.com/go-chi/binding"
2014-07-26 08:24:27 +04:00
)
2016-11-27 09:03:59 +03:00
// CreateRepoForm form for creating repository
2015-08-28 13:33:09 +03:00
type CreateRepoForm struct {
2020-03-26 22:14:51 +03:00
UID int64 ` binding:"Required" `
RepoName string ` binding:"Required;AlphaDashDot;MaxSize(100)" `
Private bool
2022-09-16 10:19:16 +03:00
Description string ` binding:"MaxSize(2048)" `
2020-03-26 22:14:51 +03:00
DefaultBranch string ` binding:"GitRefName;MaxSize(100)" `
AutoInit bool
Gitignores string
IssueLabels string
License string
Readme string
2020-09-25 08:18:37 +03:00
Template bool
2019-11-11 18:15:29 +03:00
2023-07-21 07:32:47 +03:00
RepoTemplate int64
GitContent bool
Topics bool
GitHooks bool
Webhooks bool
Avatar bool
Labels bool
ProtectedBranch bool
2023-09-29 04:48:39 +03:00
ForkSingleBranch string
2023-12-17 14:56:08 +03:00
ObjectFormatName string
2014-07-26 08:24:27 +04:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * CreateRepoForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2014-07-26 08:24:27 +04:00
}
2016-11-27 09:03:59 +03:00
// MigrateRepoForm form for migrating repository
2020-09-11 01:29:19 +03:00
// this is used to interact with web ui
2014-07-26 08:24:27 +04:00
type MigrateRepoForm struct {
2017-11-13 10:02:25 +03:00
// required: true
2020-09-23 23:25:46 +03:00
CloneAddr string ` json:"clone_addr" binding:"Required" `
Service structs . GitServiceType ` json:"service" `
AuthUsername string ` json:"auth_username" `
AuthPassword string ` json:"auth_password" `
AuthToken string ` json:"auth_token" `
2017-11-13 10:02:25 +03:00
// required: true
UID int64 ` json:"uid" binding:"Required" `
// required: true
2021-01-03 02:47:47 +03:00
RepoName string ` json:"repo_name" binding:"Required;AlphaDashDot;MaxSize(100)" `
Mirror bool ` json:"mirror" `
2021-04-09 01:25:57 +03:00
LFS bool ` json:"lfs" `
LFSEndpoint string ` json:"lfs_endpoint" `
2021-01-03 02:47:47 +03:00
Private bool ` json:"private" `
2022-09-16 10:19:16 +03:00
Description string ` json:"description" binding:"MaxSize(2048)" `
2021-01-03 02:47:47 +03:00
Wiki bool ` json:"wiki" `
Milestones bool ` json:"milestones" `
Labels bool ` json:"labels" `
Issues bool ` json:"issues" `
PullRequests bool ` json:"pull_requests" `
Releases bool ` json:"releases" `
MirrorInterval string ` json:"mirror_interval" `
2014-07-26 08:24:27 +04:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * MigrateRepoForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2014-07-26 08:24:27 +04:00
}
2015-11-04 02:40:52 +03:00
// ParseRemoteAddr checks if given remote address is valid,
2016-11-21 22:08:21 +03:00
// and returns composed URL with needed username and password.
2021-03-16 00:52:11 +03:00
func ParseRemoteAddr ( remoteAddr , authUsername , authPassword string ) ( string , error ) {
2020-09-11 01:29:19 +03:00
remoteAddr = strings . TrimSpace ( remoteAddr )
2015-11-04 02:40:52 +03:00
// 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 {
2022-06-12 08:43:27 +03:00
return "" , & models . ErrInvalidCloneAddr { IsURLError : true , Host : remoteAddr }
2015-11-04 02:40:52 +03:00
}
2020-09-11 01:29:19 +03:00
if len ( authUsername ) + len ( authPassword ) > 0 {
u . User = url . UserPassword ( authUsername , authPassword )
2015-11-04 02:40:52 +03:00
}
remoteAddr = u . String ( )
}
return remoteAddr , nil
}
2016-11-27 09:03:59 +03:00
// RepoSettingForm form for changing repository settings
2014-07-26 08:24:27 +04:00
type RepoSettingForm struct {
2022-07-08 22:45:12 +03:00
RepoName string ` binding:"Required;AlphaDashDot;MaxSize(100)" `
2022-09-16 10:19:16 +03:00
Description string ` binding:"MaxSize(2048)" `
Website string ` binding:"ValidUrl;MaxSize(1024)" `
2022-07-08 22:45:12 +03:00
Interval string
MirrorAddress string
MirrorUsername string
MirrorPassword string
LFS bool ` form:"mirror_lfs" `
LFSEndpoint string ` form:"mirror_lfs_endpoint" `
PushMirrorID string
PushMirrorAddress string
PushMirrorUsername string
PushMirrorPassword string
PushMirrorSyncOnCommit bool
PushMirrorInterval string
Private bool
Template bool
EnablePrune bool
2015-12-05 05:30:33 +03:00
// Advanced settings
2022-12-12 08:29:27 +03:00
EnableCode bool
2021-03-16 04:00:52 +03:00
EnableWiki bool
EnableExternalWiki bool
2024-03-06 09:26:32 +03:00
DefaultWikiBranch string
2024-04-17 18:58:37 +03:00
DefaultWikiEveryoneAccess string
2021-03-16 04:00:52 +03:00
ExternalWikiURL string
EnableIssues bool
EnableExternalTracker bool
ExternalTrackerURL string
TrackerURLFormat string
TrackerIssueStyle string
2022-06-10 08:39:53 +03:00
ExternalTrackerRegexpPattern string
2021-03-16 04:00:52 +03:00
EnableCloseIssuesViaCommitInAnyBranch bool
EnableProjects bool
2024-03-04 05:56:52 +03:00
ProjectsMode string
2023-02-01 04:31:19 +03:00
EnableReleases bool
2022-05-08 18:51:50 +03:00
EnablePackages bool
2021-03-16 04:00:52 +03:00
EnablePulls bool
Implement actions (#21937)
Close #13539.
Co-authored by: @lunny @appleboy @fuxiaohei and others.
Related projects:
- https://gitea.com/gitea/actions-proto-def
- https://gitea.com/gitea/actions-proto-go
- https://gitea.com/gitea/act
- https://gitea.com/gitea/act_runner
### Summary
The target of this PR is to bring a basic implementation of "Actions",
an internal CI/CD system of Gitea. That means even though it has been
merged, the state of the feature is **EXPERIMENTAL**, and please note
that:
- It is disabled by default;
- It shouldn't be used in a production environment currently;
- It shouldn't be used in a public Gitea instance currently;
- Breaking changes may be made before it's stable.
**Please comment on #13539 if you have any different product design
ideas**, all decisions reached there will be adopted here. But in this
PR, we don't talk about **naming, feature-creep or alternatives**.
### ⚠️ Breaking
`gitea-actions` will become a reserved user name. If a user with the
name already exists in the database, it is recommended to rename it.
### Some important reviews
- What is `DEFAULT_ACTIONS_URL` in `app.ini` for?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1055954954
- Why the api for runners is not under the normal `/api/v1` prefix?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1061173592
- Why DBFS?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1061301178
- Why ignore events triggered by `gitea-actions` bot?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1063254103
- Why there's no permission control for actions?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1090229868
### What it looks like
<details>
#### Manage runners
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205870657-c72f590e-2e08-4cd4-be7f-2e0abb299bbf.png">
#### List runs
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205872794-50fde990-2b45-48c1-a178-908e4ec5b627.png">
#### View logs
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205872501-9b7b9000-9542-4991-8f55-18ccdada77c3.png">
</details>
### How to try it
<details>
#### 1. Start Gitea
Clone this branch and [install from
source](https://docs.gitea.io/en-us/install-from-source).
Add additional configurations in `app.ini` to enable Actions:
```ini
[actions]
ENABLED = true
```
Start it.
If all is well, you'll see the management page of runners:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205877365-8e30a780-9b10-4154-b3e8-ee6c3cb35a59.png">
#### 2. Start runner
Clone the [act_runner](https://gitea.com/gitea/act_runner), and follow
the
[README](https://gitea.com/gitea/act_runner/src/branch/main/README.md)
to start it.
If all is well, you'll see a new runner has been added:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205878000-216f5937-e696-470d-b66c-8473987d91c3.png">
#### 3. Enable actions for a repo
Create a new repo or open an existing one, check the `Actions` checkbox
in settings and submit.
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205879705-53e09208-73c0-4b3e-a123-2dcf9aba4b9c.png">
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205879383-23f3d08f-1a85-41dd-a8b3-54e2ee6453e8.png">
If all is well, you'll see a new tab "Actions":
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205881648-a8072d8c-5803-4d76-b8a8-9b2fb49516c1.png">
#### 4. Upload workflow files
Upload some workflow files to `.gitea/workflows/xxx.yaml`, you can
follow the [quickstart](https://docs.github.com/en/actions/quickstart)
of GitHub Actions. Yes, Gitea Actions is compatible with GitHub Actions
in most cases, you can use the same demo:
```yaml
name: GitHub Actions Demo
run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
on: [push]
jobs:
Explore-GitHub-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
- run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
- name: Check out repository code
uses: actions/checkout@v3
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ github.workspace }}
- run: echo "🍏 This job's status is ${{ job.status }}."
```
If all is well, you'll see a new run in `Actions` tab:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205884473-79a874bc-171b-4aaf-acd5-0241a45c3b53.png">
#### 5. Check the logs of jobs
Click a run and you'll see the logs:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205884800-994b0374-67f7-48ff-be9a-4c53f3141547.png">
#### 6. Go on
You can try more examples in [the
documents](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions)
of GitHub Actions, then you might find a lot of bugs.
Come on, PRs are welcome.
</details>
See also: [Feature Preview: Gitea
Actions](https://blog.gitea.io/2022/12/feature-preview-gitea-actions/)
---------
Co-authored-by: a1012112796 <1012112796@qq.com>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: delvh <dev.lh@web.de>
Co-authored-by: ChristopherHX <christopher.homberger@web.de>
Co-authored-by: John Olheiser <john.olheiser@gmail.com>
2023-01-31 04:45:19 +03:00
EnableActions bool
2021-03-16 04:00:52 +03:00
PullsIgnoreWhitespace bool
PullsAllowMerge bool
PullsAllowRebase bool
PullsAllowRebaseMerge bool
PullsAllowSquash bool
2024-02-13 01:37:23 +03:00
PullsAllowFastForwardOnly bool
2021-03-16 04:00:52 +03:00
PullsAllowManualMerge bool
2021-03-27 17:55:40 +03:00
PullsDefaultMergeStyle string
2021-03-16 04:00:52 +03:00
EnableAutodetectManualMerge bool
2022-03-04 11:30:49 +03:00
PullsAllowRebaseUpdate bool
2021-07-13 02:26:25 +03:00
DefaultDeleteBranchAfterMerge bool
2023-02-13 09:09:52 +03:00
DefaultAllowMaintainerEdit bool
2021-03-16 04:00:52 +03:00
EnableTimetracker bool
AllowOnlyContributorsToTrackTime bool
EnableIssueDependencies bool
IsArchived bool
2018-03-27 17:13:20 +03:00
2020-09-19 19:44:55 +03:00
// Signing Settings
TrustModel string
2018-03-27 17:13:20 +03:00
// Admin settings
2021-12-16 18:55:12 +03:00
EnableHealthCheck bool
RequestReindexType string
2014-07-26 08:24:27 +04:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * RepoSettingForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2014-07-26 08:24:27 +04:00
}
2017-09-14 11:16:22 +03:00
// __________ .__
// \______ \____________ ____ ____ | |__
// | | _/\_ __ \__ \ / \_/ ___\| | \
// | | \ | | \// __ \| | \ \___| Y \
// |______ / |__| (____ /___| /\___ >___| /
// \/ \/ \/ \/ \/
// ProtectBranchForm form for changing protected branch settings
type ProtectBranchForm struct {
2023-01-16 11:00:22 +03:00
RuleName string ` binding:"Required" `
2023-02-20 14:30:41 +03:00
RuleID int64
2020-11-28 22:30:46 +03:00
EnablePush string
WhitelistUsers string
WhitelistTeams string
WhitelistDeployKeys bool
EnableMergeWhitelist bool
MergeWhitelistUsers string
MergeWhitelistTeams string
EnableStatusCheck bool
2023-05-17 11:11:13 +03:00
StatusCheckContexts string
2020-11-28 22:30:46 +03:00
RequiredApprovals int64
EnableApprovalsWhitelist bool
ApprovalsWhitelistUsers string
ApprovalsWhitelistTeams string
BlockOnRejectedReviews bool
BlockOnOfficialReviewRequests bool
BlockOnOutdatedBranch bool
DismissStaleApprovals bool
2024-01-15 10:20:01 +03:00
IgnoreStaleApprovals bool
2020-11-28 22:30:46 +03:00
RequireSignedCommits bool
ProtectedFilePatterns string
2021-09-11 17:21:17 +03:00
UnprotectedFilePatterns string
2017-09-14 11:16:22 +03:00
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * ProtectBranchForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2017-09-14 11:16:22 +03:00
}
2022-09-04 22:54:23 +03:00
// __ __ ___. .__ __
// / \ / \ ____\_ |__ | |__ ____ ____ | | __
// \ \/\/ // __ \| __ \| | \ / _ \ / _ \| |/ /
// \ /\ ___/| \_\ \ Y ( <_> | <_> ) <
// \__/\ / \___ >___ /___| /\____/ \____/|__|_ \
// \/ \/ \/ \/ \/
2014-07-26 08:24:27 +04:00
2016-11-27 09:03:59 +03:00
// WebhookForm form for changing web hook
2015-08-26 19:30:06 +03:00
type WebhookForm struct {
2023-05-25 05:06:27 +03:00
Events string
Create bool
Delete bool
Fork bool
Issues bool
IssueAssign bool
IssueLabel bool
IssueMilestone bool
IssueComment bool
Release bool
Push bool
PullRequest bool
PullRequestAssign bool
PullRequestLabel bool
PullRequestMilestone bool
PullRequestComment bool
PullRequestReview bool
PullRequestSync bool
PullRequestReviewRequest bool
Wiki bool
Repository bool
Package bool
Active bool
BranchFilter string ` binding:"GlobPattern" `
AuthorizationHeader string
2015-08-28 18:36:13 +03:00
}
2016-11-27 09:03:59 +03:00
// PushOnly if the hook will be triggered when push
2015-08-28 18:36:13 +03:00
func ( f WebhookForm ) PushOnly ( ) bool {
return f . Events == "push_only"
}
2016-11-27 09:03:59 +03:00
// SendEverything if the hook will be triggered any event
2015-08-28 18:36:13 +03:00
func ( f WebhookForm ) SendEverything ( ) bool {
return f . Events == "send_everything"
}
2016-11-27 09:03:59 +03:00
// ChooseEvents if the hook will be triggered choose events
2015-08-28 18:36:13 +03:00
func ( f WebhookForm ) ChooseEvents ( ) bool {
return f . Events == "choose_events"
2015-08-26 19:30:06 +03:00
}
2016-11-27 09:03:59 +03:00
// NewWebhookForm form for creating web hook
2014-07-26 08:24:27 +04:00
type NewWebhookForm struct {
2017-04-19 06:02:20 +03:00
PayloadURL string ` binding:"Required;ValidUrl" `
2019-05-05 21:09:02 +03:00
HTTPMethod string ` binding:"Required;In(POST,GET)" `
2015-08-26 19:30:06 +03:00
ContentType int ` binding:"Required" `
Secret string
WebhookForm
2014-07-26 08:24:27 +04:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * NewWebhookForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2014-07-26 08:24:27 +04:00
}
2017-05-29 10:17:15 +03:00
// NewGogshookForm form for creating gogs hook
type NewGogshookForm struct {
PayloadURL string ` binding:"Required;ValidUrl" `
ContentType int ` binding:"Required" `
Secret string
WebhookForm
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * NewGogshookForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2017-05-29 10:17:15 +03:00
}
2016-11-27 09:03:59 +03:00
// NewSlackHookForm form for creating slack hook
2014-08-24 16:59:47 +04:00
type NewSlackHookForm struct {
2017-04-19 06:02:20 +03:00
PayloadURL string ` binding:"Required;ValidUrl" `
2015-08-26 19:30:06 +03:00
Channel string ` binding:"Required" `
2015-08-29 06:49:59 +03:00
Username string
IconURL string
Color string
2015-08-26 19:30:06 +03:00
WebhookForm
2014-08-24 16:59:47 +04:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * NewSlackHookForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2022-08-11 18:48:23 +03:00
if ! webhook . IsValidSlackChannel ( strings . TrimSpace ( f . Channel ) ) {
errs = append ( errs , binding . Error {
FieldNames : [ ] string { "Channel" } ,
Classification : "" ,
2024-02-15 00:48:45 +03:00
Message : ctx . Locale . TrString ( "repo.settings.add_webhook.invalid_channel_name" ) ,
2022-08-11 18:48:23 +03:00
} )
}
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2014-08-24 16:59:47 +04:00
}
2017-08-28 08:06:45 +03:00
// NewDiscordHookForm form for creating discord hook
type NewDiscordHookForm struct {
PayloadURL string ` binding:"Required;ValidUrl" `
Username string
IconURL string
WebhookForm
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * NewDiscordHookForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2017-11-21 07:26:43 +03:00
}
// NewDingtalkHookForm form for creating dingtalk hook
type NewDingtalkHookForm struct {
PayloadURL string ` binding:"Required;ValidUrl" `
WebhookForm
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * NewDingtalkHookForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2019-04-19 05:45:02 +03:00
}
// NewTelegramHookForm form for creating telegram hook
type NewTelegramHookForm struct {
BotToken string ` binding:"Required" `
ChatID string ` binding:"Required" `
2023-08-13 17:00:06 +03:00
ThreadID string
2019-04-19 05:45:02 +03:00
WebhookForm
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * NewTelegramHookForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2019-04-19 17:18:06 +03:00
}
2020-03-28 16:09:55 +03:00
// NewMatrixHookForm form for creating Matrix hook
type NewMatrixHookForm struct {
HomeserverURL string ` binding:"Required;ValidUrl" `
RoomID string ` binding:"Required" `
MessageType int
WebhookForm
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * NewMatrixHookForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2020-03-28 16:09:55 +03:00
}
2019-04-19 17:18:06 +03:00
// NewMSTeamsHookForm form for creating MS Teams hook
type NewMSTeamsHookForm struct {
PayloadURL string ` binding:"Required;ValidUrl" `
WebhookForm
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * NewMSTeamsHookForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2017-08-28 08:06:45 +03:00
}
2020-02-12 11:48:28 +03:00
// NewFeishuHookForm form for creating feishu hook
type NewFeishuHookForm struct {
PayloadURL string ` binding:"Required;ValidUrl" `
WebhookForm
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * NewFeishuHookForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2020-02-12 11:48:28 +03:00
}
2021-07-23 07:41:27 +03:00
// NewWechatWorkHookForm form for creating wechatwork hook
type NewWechatWorkHookForm struct {
PayloadURL string ` binding:"Required;ValidUrl" `
WebhookForm
}
// Validate validates the fields
func ( f * NewWechatWorkHookForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-07-23 07:41:27 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
}
2022-01-23 16:46:30 +03:00
// NewPackagistHookForm form for creating packagist hook
type NewPackagistHookForm struct {
Username string ` binding:"Required" `
APIToken string ` binding:"Required" `
PackageURL string ` binding:"Required;ValidUrl" `
WebhookForm
}
// Validate validates the fields
func ( f * NewPackagistHookForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2022-01-23 16:46:30 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
}
2014-07-26 08:24:27 +04:00
// .___
// | | ______ ________ __ ____
// | |/ ___// ___/ | \_/ __ \
// | |\___ \ \___ \| | /\ ___/
// |___/____ >____ >____/ \___ >
// \/ \/ \/
2016-11-27 09:03:59 +03:00
// CreateIssueForm form for creating issue
2014-07-26 08:24:27 +04:00
type CreateIssueForm struct {
2022-04-28 18:45:33 +03:00
Title string ` binding:"Required;MaxSize(255)" `
LabelIDs string ` form:"label_ids" `
AssigneeIDs string ` form:"assignee_ids" `
Ref string ` form:"ref" `
MilestoneID int64
ProjectID int64
AssigneeID int64
Content string
Files [ ] string
AllowMaintainerEdit bool
2014-07-26 08:24:27 +04:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * CreateIssueForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2014-07-26 08:24:27 +04:00
}
2016-11-27 09:03:59 +03:00
// CreateCommentForm form for creating comment
2015-08-13 11:07:11 +03:00
type CreateCommentForm struct {
2016-08-11 15:48:08 +03:00
Content string
Status string ` binding:"OmitEmpty;In(reopen,close)" `
Files [ ] string
2015-08-13 11:07:11 +03:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * CreateCommentForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2017-12-04 02:14:26 +03:00
}
// ReactionForm form for adding and removing reaction
type ReactionForm struct {
2019-12-02 01:57:24 +03:00
Content string ` binding:"Required" `
2017-12-04 02:14:26 +03:00
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * ReactionForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2015-08-13 11:07:11 +03:00
}
2019-02-18 23:55:04 +03:00
// IssueLockForm form for locking an issue
type IssueLockForm struct {
Reason string ` binding:"Required" `
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( i * IssueLockForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , i , ctx . Locale )
2019-02-18 23:55:04 +03:00
}
// HasValidReason checks to make sure that the reason submitted in
// the form matches any of the values in the config
func ( i IssueLockForm ) HasValidReason ( ) bool {
if strings . TrimSpace ( i . Reason ) == "" {
return true
}
for _ , v := range setting . Repository . Issue . LockReasons {
if v == i . Reason {
return true
}
}
return false
}
2020-08-17 06:07:38 +03:00
// CreateProjectForm form for creating a project
type CreateProjectForm struct {
2024-05-27 11:59:54 +03:00
Title string ` binding:"Required;MaxSize(100)" `
Content string
TemplateType project_model . TemplateType
CardType project_model . CardType
2020-08-17 06:07:38 +03:00
}
2024-05-27 11:59:54 +03:00
// EditProjectColumnForm is a form for editing a project column
type EditProjectColumnForm struct {
2021-02-11 19:32:27 +03:00
Title string ` binding:"Required;MaxSize(100)" `
Sorting int8
2021-09-29 23:53:12 +03:00
Color string ` binding:"MaxSize(7)" `
2020-08-17 06:07:38 +03:00
}
2016-11-27 09:03:59 +03:00
// CreateMilestoneForm form for creating milestone
2014-07-26 08:24:27 +04:00
type CreateMilestoneForm struct {
2015-08-05 10:24:26 +03:00
Title string ` binding:"Required;MaxSize(50)" `
Content string
Deadline string
2014-07-26 08:24:27 +04:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * CreateMilestoneForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2014-07-26 08:24:27 +04:00
}
2016-11-27 09:03:59 +03:00
// CreateLabelForm form for creating label
2014-07-26 08:24:27 +04:00
type CreateLabelForm struct {
2018-03-13 05:03:55 +03:00
ID int64
Title string ` binding:"Required;MaxSize(50)" locale:"repo.issues.label_title" `
Scoped labels (#22585)
Add a new "exclusive" option per label. This makes it so that when the
label is named `scope/name`, no other label with the same `scope/`
prefix can be set on an issue.
The scope is determined by the last occurence of `/`, so for example
`scope/alpha/name` and `scope/beta/name` are considered to be in
different scopes and can coexist.
Exclusive scopes are not enforced by any database rules, however they
are enforced when editing labels at the models level, automatically
removing any existing labels in the same scope when either attaching a
new label or replacing all labels.
In menus use a circle instead of checkbox to indicate they function as
radio buttons per scope. Issue filtering by label ensures that only a
single scoped label is selected at a time. Clicking with alt key can be
used to remove a scoped label, both when editing individual issues and
batch editing.
Label rendering refactor for consistency and code simplification:
* Labels now consistently have the same shape, emojis and tooltips
everywhere. This includes the label list and label assignment menus.
* In label list, show description below label same as label menus.
* Don't use exactly black/white text colors to look a bit nicer.
* Simplify text color computation. There is no point computing luminance
in linear color space, as this is a perceptual problem and sRGB is
closer to perceptually linear.
* Increase height of label assignment menus to show more labels. Showing
only 3-4 labels at a time leads to a lot of scrolling.
* Render all labels with a new RenderLabel template helper function.
Label creation and editing in multiline modal menu:
* Change label creation to open a modal menu like label editing.
* Change menu layout to place name, description and colors on separate
lines.
* Don't color cancel button red in label editing modal menu.
* Align text to the left in model menu for better readability and
consistent with settings layout elsewhere.
Custom exclusive scoped label rendering:
* Display scoped label prefix and suffix with slightly darker and
lighter background color respectively, and a slanted edge between them
similar to the `/` symbol.
* In menus exclusive labels are grouped with a divider line.
---------
Co-authored-by: Yarden Shoham <hrsi88@gmail.com>
Co-authored-by: Lauris BH <lauris@nix.lv>
2023-02-18 22:17:39 +03:00
Exclusive bool ` form:"exclusive" `
2023-08-14 12:56:14 +03:00
IsArchived bool ` form:"is_archived" `
2018-03-13 05:03:55 +03:00
Description string ` binding:"MaxSize(200)" locale:"repo.issues.label_description" `
2022-02-08 00:21:02 +03:00
Color string ` binding:"Required;MaxSize(7)" locale:"repo.issues.label_color" `
2014-07-26 08:24:27 +04:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * CreateLabelForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2014-07-26 08:24:27 +04:00
}
2016-11-27 09:03:59 +03:00
// InitializeLabelsForm form for initializing labels
2016-08-30 05:02:49 +03:00
type InitializeLabelsForm struct {
TemplateName string ` binding:"Required" `
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * InitializeLabelsForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2016-08-30 05:02:49 +03:00
}
2018-01-05 21:56:50 +03:00
// MergePullRequestForm form for merging Pull Request
2019-02-08 11:08:38 +03:00
// swagger:model MergePullRequestOption
2018-01-05 21:56:50 +03:00
type MergePullRequestForm struct {
2019-02-08 11:08:38 +03:00
// required: true
2024-02-13 01:37:23 +03:00
// enum: merge,rebase,rebase-merge,squash,fast-forward-only,manually-merged
Do string ` binding:"Required;In(merge,rebase,rebase-merge,squash,fast-forward-only,manually-merged)" `
2021-07-13 02:26:25 +03:00
MergeTitleField string
MergeMessageField string
MergeCommitID string // only used for manually-merged
2021-12-20 03:32:54 +03:00
HeadCommitID string ` json:"head_commit_id,omitempty" `
2023-02-21 17:42:07 +03:00
ForceMerge bool ` json:"force_merge,omitempty" `
2022-05-07 20:05:52 +03:00
MergeWhenChecksSucceed bool ` json:"merge_when_checks_succeed,omitempty" `
2021-07-13 02:26:25 +03:00
DeleteBranchAfterMerge bool ` json:"delete_branch_after_merge,omitempty" `
2018-01-05 21:56:50 +03:00
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * MergePullRequestForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2018-01-05 21:56:50 +03:00
}
2018-08-06 07:43:22 +03:00
// CodeCommentForm form for adding code comments for PRs
type CodeCommentForm struct {
2021-01-09 00:49:55 +03:00
Origin string ` binding:"Required;In(timeline,diff)" `
2020-01-09 04:47:45 +03:00
Content string ` binding:"Required" `
Side string ` binding:"Required;In(previous,proposed)" `
Line int64
TreePath string ` form:"path" binding:"Required" `
2023-03-04 10:13:37 +03:00
SingleReview bool ` form:"single_review" `
2020-01-09 04:47:45 +03:00
Reply int64 ` form:"reply" `
LatestCommitID string
2024-02-25 09:00:55 +03:00
Files [ ] string
2018-08-06 07:43:22 +03:00
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * CodeCommentForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2018-08-06 07:43:22 +03:00
}
// SubmitReviewForm for submitting a finished code review
type SubmitReviewForm struct {
2020-01-09 04:47:45 +03:00
Content string
2022-05-20 05:26:04 +03:00
Type string
2020-01-09 04:47:45 +03:00
CommitID string
2021-06-15 04:12:33 +03:00
Files [ ] string
2018-08-06 07:43:22 +03:00
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * SubmitReviewForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2018-08-06 07:43:22 +03:00
}
2022-05-20 05:26:04 +03:00
// ReviewType will return the corresponding ReviewType for type
2022-06-13 12:37:59 +03:00
func ( f SubmitReviewForm ) ReviewType ( ) issues_model . ReviewType {
2018-08-06 07:43:22 +03:00
switch f . Type {
case "approve" :
2022-06-13 12:37:59 +03:00
return issues_model . ReviewTypeApprove
2018-08-06 07:43:22 +03:00
case "comment" :
2022-06-13 12:37:59 +03:00
return issues_model . ReviewTypeComment
2018-08-06 07:43:22 +03:00
case "reject" :
2022-06-13 12:37:59 +03:00
return issues_model . ReviewTypeReject
2022-05-20 05:26:04 +03:00
case "" :
2022-06-13 12:37:59 +03:00
return issues_model . ReviewTypeComment // default to comment when doing quick-submit (Ctrl+Enter) on the review form
2018-08-06 07:43:22 +03:00
default :
2022-06-13 12:37:59 +03:00
return issues_model . ReviewTypeUnknown
2018-08-06 07:43:22 +03:00
}
}
2018-08-07 20:15:41 +03:00
// HasEmptyContent checks if the content of the review form is empty.
func ( f SubmitReviewForm ) HasEmptyContent ( ) bool {
reviewType := f . ReviewType ( )
2022-06-13 12:37:59 +03:00
return ( reviewType == issues_model . ReviewTypeComment || reviewType == issues_model . ReviewTypeReject ) &&
2018-08-07 20:15:41 +03:00
len ( strings . TrimSpace ( f . Content ) ) == 0
}
2021-02-11 20:32:25 +03:00
// DismissReviewForm for dismissing stale review by repo admin
type DismissReviewForm struct {
ReviewID int64 ` binding:"Required" `
Message string
}
2022-04-28 18:45:33 +03:00
// UpdateAllowEditsForm form for changing if PR allows edits from maintainers
type UpdateAllowEditsForm struct {
AllowMaintainerEdit bool
}
2014-07-26 08:24:27 +04:00
// __________ .__
// \______ \ ____ | | ____ _____ ______ ____
// | _// __ \| | _/ __ \\__ \ / ___// __ \
// | | \ ___/| |_\ ___/ / __ \_\___ \\ ___/
// |____|_ /\___ >____/\___ >____ /____ >\___ >
// \/ \/ \/ \/ \/ \/
2016-11-27 09:03:59 +03:00
// NewReleaseForm form for creating release
2014-07-26 08:24:27 +04:00
type NewReleaseForm struct {
2019-11-25 02:06:23 +03:00
TagName string ` binding:"Required;GitRefName;MaxSize(255)" `
Target string ` form:"tag_target" binding:"Required;MaxSize(255)" `
2023-04-07 04:44:52 +03:00
Title string ` binding:"MaxSize(255)" `
2015-11-16 07:52:46 +03:00
Content string
Draft string
2021-02-28 22:57:45 +03:00
TagOnly string
2015-11-16 07:52:46 +03:00
Prerelease bool
2021-02-28 22:57:45 +03:00
AddTagMsg bool
2017-01-25 10:23:20 +03:00
Files [ ] string
2014-07-26 08:24:27 +04:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * NewReleaseForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2014-07-26 08:24:27 +04:00
}
2016-11-27 09:03:59 +03:00
// EditReleaseForm form for changing release
2014-07-26 08:24:27 +04:00
type EditReleaseForm struct {
2019-11-25 02:06:23 +03:00
Title string ` form:"title" binding:"Required;MaxSize(255)" `
2016-01-30 16:39:02 +03:00
Content string ` form:"content" `
2014-07-26 08:24:27 +04:00
Draft string ` form:"draft" `
Prerelease bool ` form:"prerelease" `
2017-01-25 10:23:20 +03:00
Files [ ] string
2014-07-26 08:24:27 +04:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * EditReleaseForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2014-07-26 08:24:27 +04:00
}
2015-11-27 01:33:45 +03:00
// __ __.__ __ .__
// / \ / \__| | _|__|
// \ \/\/ / | |/ / |
// \ /| | <| |
// \__/\ / |__|__|_ \__|
// \/ \/
2016-11-27 09:03:59 +03:00
// NewWikiForm form for creating wiki
2015-11-27 01:33:45 +03:00
type NewWikiForm struct {
2017-11-29 23:52:34 +03:00
Title string ` binding:"Required" `
Content string ` binding:"Required" `
Message string
2015-11-27 01:33:45 +03:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2015-11-27 01:33:45 +03:00
// FIXME: use code generation to generate this method.
2021-01-26 18:36:53 +03:00
func ( f * NewWikiForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2015-11-27 01:33:45 +03:00
}
2016-08-11 15:48:08 +03:00
// ___________ .___.__ __
// \_ _____/ __| _/|__|/ |_
// | __)_ / __ | | \ __\
// | \/ /_/ | | || |
// /_______ /\____ | |__||__|
// \/ \/
2016-11-27 09:03:59 +03:00
// EditRepoFileForm form for changing repository file
2016-08-11 15:48:08 +03:00
type EditRepoFileForm struct {
2016-08-25 07:35:03 +03:00
TreePath string ` binding:"Required;MaxSize(500)" `
2019-10-16 22:28:41 +03:00
Content string
2016-11-04 14:28:56 +03:00
CommitSummary string ` binding:"MaxSize(100)" `
2016-08-11 15:48:08 +03:00
CommitMessage string
CommitChoice string ` binding:"Required;MaxSize(50)" `
2017-04-19 06:02:20 +03:00
NewBranchName string ` binding:"GitRefName;MaxSize(100)" `
2016-08-11 15:48:08 +03:00
LastCommit string
2021-01-29 11:57:45 +03:00
Signoff bool
2016-08-11 15:48:08 +03:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * EditRepoFileForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2016-08-11 15:48:08 +03:00
}
2016-11-27 09:03:59 +03:00
// EditPreviewDiffForm form for changing preview diff
2016-08-11 15:48:08 +03:00
type EditPreviewDiffForm struct {
Content string
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * EditPreviewDiffForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2016-08-11 15:48:08 +03:00
}
2022-02-09 23:28:55 +03:00
// _________ .__ __________.__ __
// \_ ___ \| |__ __________________ ___.__. \______ \__| ____ | | __
// / \ \/| | \_/ __ \_ __ \_ __ < | | | ___/ |/ ___\| |/ /
// \ \___| Y \ ___/| | \/| | \/\___ | | | | \ \___| <
// \______ /___| /\___ >__| |__| / ____| |____| |__|\___ >__|_ \
// \/ \/ \/ \/ \/ \/
// CherryPickForm form for changing repository file
type CherryPickForm struct {
CommitSummary string ` binding:"MaxSize(100)" `
CommitMessage string
CommitChoice string ` binding:"Required;MaxSize(50)" `
NewBranchName string ` binding:"GitRefName;MaxSize(100)" `
LastCommit string
Revert bool
Signoff bool
}
// Validate validates the fields
func ( f * CherryPickForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2022-02-09 23:28:55 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
}
2016-08-11 15:48:08 +03:00
// ____ ___ .__ .___
// | | \______ | | _________ __| _/
// | | /\____ \| | / _ \__ \ / __ |
// | | / | |_> > |_( <_> ) __ \_/ /_/ |
// |______/ | __/|____/\____(____ /\____ |
// |__| \/ \/
//
2016-11-27 09:03:59 +03:00
// UploadRepoFileForm form for uploading repository file
2016-08-11 15:48:08 +03:00
type UploadRepoFileForm struct {
2016-11-04 14:28:56 +03:00
TreePath string ` binding:"MaxSize(500)" `
CommitSummary string ` binding:"MaxSize(100)" `
2016-08-11 15:48:08 +03:00
CommitMessage string
CommitChoice string ` binding:"Required;MaxSize(50)" `
2017-04-19 06:02:20 +03:00
NewBranchName string ` binding:"GitRefName;MaxSize(100)" `
2016-08-11 15:48:08 +03:00
Files [ ] string
2021-01-29 11:57:45 +03:00
Signoff bool
2016-08-11 15:48:08 +03:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * UploadRepoFileForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2016-08-11 15:48:08 +03:00
}
2016-11-27 09:03:59 +03:00
// RemoveUploadFileForm form for removing uploaded file
2016-08-11 15:48:08 +03:00
type RemoveUploadFileForm struct {
File string ` binding:"Required;MaxSize(50)" `
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * RemoveUploadFileForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2016-08-11 15:48:08 +03:00
}
// ________ .__ __
// \______ \ ____ | | _____/ |_ ____
// | | \_/ __ \| | _/ __ \ __\/ __ \
// | ` \ ___/| |_\ ___/| | \ ___/
// /_______ /\___ >____/\___ >__| \___ >
// \/ \/ \/ \/
2016-11-27 09:03:59 +03:00
// DeleteRepoFileForm form for deleting repository file
2016-08-11 15:48:08 +03:00
type DeleteRepoFileForm struct {
2016-11-04 14:28:56 +03:00
CommitSummary string ` binding:"MaxSize(100)" `
2016-08-28 11:41:44 +03:00
CommitMessage string
CommitChoice string ` binding:"Required;MaxSize(50)" `
2017-04-19 06:02:20 +03:00
NewBranchName string ` binding:"GitRefName;MaxSize(100)" `
2019-04-17 19:06:35 +03:00
LastCommit string
2021-01-29 11:57:45 +03:00
Signoff bool
2016-08-11 15:48:08 +03:00
}
2017-03-15 03:52:01 +03:00
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * DeleteRepoFileForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2016-08-11 15:48:08 +03:00
}
2017-09-12 09:48:13 +03:00
// ___________.__ ___________ __
// \__ ___/|__| _____ ____ \__ ___/___________ ____ | | __ ___________
// | | | |/ \_/ __ \ | | \_ __ \__ \ _/ ___\| |/ // __ \_ __ \
// | | | | Y Y \ ___/ | | | | \// __ \\ \___| <\ ___/| | \/
// |____| |__|__|_| /\___ > |____| |__| (____ /\___ >__|_ \\___ >__|
// \/ \/ \/ \/ \/ \/
// AddTimeManuallyForm form that adds spent time manually.
type AddTimeManuallyForm struct {
Hours int ` binding:"Range(0,1000)" `
Minutes int ` binding:"Range(0,1000)" `
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * AddTimeManuallyForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2017-09-12 09:48:13 +03:00
}
2018-04-11 05:51:44 +03:00
// SaveTopicForm form for save topics for repository
type SaveTopicForm struct {
Topics [ ] string ` binding:"topics;Required;" `
}
2018-05-01 22:05:28 +03:00
// DeadlineForm hold the validation rules for deadlines
type DeadlineForm struct {
DateString string ` form:"date" binding:"Required;Size(10)" `
}
// Validate validates the fields
2021-01-26 18:36:53 +03:00
func ( f * DeadlineForm ) Validate ( req * http . Request , errs binding . Errors ) binding . Errors {
2023-05-21 04:50:53 +03:00
ctx := context . GetValidateContext ( req )
2021-01-30 11:55:53 +03:00
return middleware . Validate ( errs , ctx . Data , f , ctx . Locale )
2018-05-01 22:05:28 +03:00
}