mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	refactor bind functions based on generics (#22055)
This commit is contained in:
		@@ -7,7 +7,6 @@ import (
 | 
				
			|||||||
	goctx "context"
 | 
						goctx "context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"reflect"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"code.gitea.io/gitea/modules/context"
 | 
						"code.gitea.io/gitea/modules/context"
 | 
				
			||||||
@@ -18,16 +17,9 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Bind binding an obj to a handler
 | 
					// Bind binding an obj to a handler
 | 
				
			||||||
func Bind(obj interface{}) http.HandlerFunc {
 | 
					func Bind[T any](obj T) http.HandlerFunc {
 | 
				
			||||||
	tp := reflect.TypeOf(obj)
 | 
					 | 
				
			||||||
	if tp.Kind() == reflect.Ptr {
 | 
					 | 
				
			||||||
		tp = tp.Elem()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if tp.Kind() != reflect.Struct {
 | 
					 | 
				
			||||||
		panic("Only structs are allowed to bind")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return Wrap(func(ctx *context.Context) {
 | 
						return Wrap(func(ctx *context.Context) {
 | 
				
			||||||
		theObj := reflect.New(tp).Interface() // create a new form obj for every request but not use obj directly
 | 
							theObj := new(T) // create a new form obj for every request but not use obj directly
 | 
				
			||||||
		binding.Bind(ctx.Req, theObj)
 | 
							binding.Bind(ctx.Req, theObj)
 | 
				
			||||||
		SetForm(ctx, theObj)
 | 
							SetForm(ctx, theObj)
 | 
				
			||||||
		middleware.AssignForm(theObj, ctx.Data)
 | 
							middleware.AssignForm(theObj, ctx.Data)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -67,7 +67,6 @@ import (
 | 
				
			|||||||
	gocontext "context"
 | 
						gocontext "context"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"reflect"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"code.gitea.io/gitea/models/organization"
 | 
						"code.gitea.io/gitea/models/organization"
 | 
				
			||||||
@@ -575,13 +574,9 @@ func mustEnableAttachments(ctx *context.APIContext) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// bind binding an obj to a func(ctx *context.APIContext)
 | 
					// bind binding an obj to a func(ctx *context.APIContext)
 | 
				
			||||||
func bind(obj interface{}) http.HandlerFunc {
 | 
					func bind[T any](obj T) http.HandlerFunc {
 | 
				
			||||||
	tp := reflect.TypeOf(obj)
 | 
					 | 
				
			||||||
	for tp.Kind() == reflect.Ptr {
 | 
					 | 
				
			||||||
		tp = tp.Elem()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return web.Wrap(func(ctx *context.APIContext) {
 | 
						return web.Wrap(func(ctx *context.APIContext) {
 | 
				
			||||||
		theObj := reflect.New(tp).Interface() // create a new form obj for every request but not use obj directly
 | 
							theObj := new(T) // create a new form obj for every request but not use obj directly
 | 
				
			||||||
		errs := binding.Bind(ctx.Req, theObj)
 | 
							errs := binding.Bind(ctx.Req, theObj)
 | 
				
			||||||
		if len(errs) > 0 {
 | 
							if len(errs) > 0 {
 | 
				
			||||||
			ctx.Error(http.StatusUnprocessableEntity, "validationError", fmt.Sprintf("%s: %s", errs[0].FieldNames, errs[0].Error()))
 | 
								ctx.Error(http.StatusUnprocessableEntity, "validationError", fmt.Sprintf("%s: %s", errs[0].FieldNames, errs[0].Error()))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ package private
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"reflect"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"code.gitea.io/gitea/modules/context"
 | 
						"code.gitea.io/gitea/modules/context"
 | 
				
			||||||
@@ -39,13 +38,9 @@ func CheckInternalToken(next http.Handler) http.Handler {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// bind binding an obj to a handler
 | 
					// bind binding an obj to a handler
 | 
				
			||||||
func bind(obj interface{}) http.HandlerFunc {
 | 
					func bind[T any](obj T) http.HandlerFunc {
 | 
				
			||||||
	tp := reflect.TypeOf(obj)
 | 
					 | 
				
			||||||
	for tp.Kind() == reflect.Ptr {
 | 
					 | 
				
			||||||
		tp = tp.Elem()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return web.Wrap(func(ctx *context.PrivateContext) {
 | 
						return web.Wrap(func(ctx *context.PrivateContext) {
 | 
				
			||||||
		theObj := reflect.New(tp).Interface() // create a new form obj for every request but not use obj directly
 | 
							theObj := new(T) // create a new form obj for every request but not use obj directly
 | 
				
			||||||
		binding.Bind(ctx.Req, theObj)
 | 
							binding.Bind(ctx.Req, theObj)
 | 
				
			||||||
		web.SetForm(ctx, theObj)
 | 
							web.SetForm(ctx, theObj)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -234,8 +234,6 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
	ignExploreSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: setting.Service.RequireSignInView || setting.Service.Explore.RequireSigninView})
 | 
						ignExploreSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: setting.Service.RequireSignInView || setting.Service.Explore.RequireSigninView})
 | 
				
			||||||
	ignSignInAndCsrf := context.Toggle(&context.ToggleOptions{DisableCSRF: true})
 | 
						ignSignInAndCsrf := context.Toggle(&context.ToggleOptions{DisableCSRF: true})
 | 
				
			||||||
	reqSignOut := context.Toggle(&context.ToggleOptions{SignOutRequired: true})
 | 
						reqSignOut := context.Toggle(&context.ToggleOptions{SignOutRequired: true})
 | 
				
			||||||
 | 
					 | 
				
			||||||
	bindIgnErr := web.Bind
 | 
					 | 
				
			||||||
	validation.AddBindingRules()
 | 
						validation.AddBindingRules()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	linkAccountEnabled := func(ctx *context.Context) {
 | 
						linkAccountEnabled := func(ctx *context.Context) {
 | 
				
			||||||
@@ -356,32 +354,32 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
	// ***** START: User *****
 | 
						// ***** START: User *****
 | 
				
			||||||
	m.Group("/user", func() {
 | 
						m.Group("/user", func() {
 | 
				
			||||||
		m.Get("/login", auth.SignIn)
 | 
							m.Get("/login", auth.SignIn)
 | 
				
			||||||
		m.Post("/login", bindIgnErr(forms.SignInForm{}), auth.SignInPost)
 | 
							m.Post("/login", web.Bind(forms.SignInForm{}), auth.SignInPost)
 | 
				
			||||||
		m.Group("", func() {
 | 
							m.Group("", func() {
 | 
				
			||||||
			m.Combo("/login/openid").
 | 
								m.Combo("/login/openid").
 | 
				
			||||||
				Get(auth.SignInOpenID).
 | 
									Get(auth.SignInOpenID).
 | 
				
			||||||
				Post(bindIgnErr(forms.SignInOpenIDForm{}), auth.SignInOpenIDPost)
 | 
									Post(web.Bind(forms.SignInOpenIDForm{}), auth.SignInOpenIDPost)
 | 
				
			||||||
		}, openIDSignInEnabled)
 | 
							}, openIDSignInEnabled)
 | 
				
			||||||
		m.Group("/openid", func() {
 | 
							m.Group("/openid", func() {
 | 
				
			||||||
			m.Combo("/connect").
 | 
								m.Combo("/connect").
 | 
				
			||||||
				Get(auth.ConnectOpenID).
 | 
									Get(auth.ConnectOpenID).
 | 
				
			||||||
				Post(bindIgnErr(forms.ConnectOpenIDForm{}), auth.ConnectOpenIDPost)
 | 
									Post(web.Bind(forms.ConnectOpenIDForm{}), auth.ConnectOpenIDPost)
 | 
				
			||||||
			m.Group("/register", func() {
 | 
								m.Group("/register", func() {
 | 
				
			||||||
				m.Combo("").
 | 
									m.Combo("").
 | 
				
			||||||
					Get(auth.RegisterOpenID, openIDSignUpEnabled).
 | 
										Get(auth.RegisterOpenID, openIDSignUpEnabled).
 | 
				
			||||||
					Post(bindIgnErr(forms.SignUpOpenIDForm{}), auth.RegisterOpenIDPost)
 | 
										Post(web.Bind(forms.SignUpOpenIDForm{}), auth.RegisterOpenIDPost)
 | 
				
			||||||
			}, openIDSignUpEnabled)
 | 
								}, openIDSignUpEnabled)
 | 
				
			||||||
		}, openIDSignInEnabled)
 | 
							}, openIDSignInEnabled)
 | 
				
			||||||
		m.Get("/sign_up", auth.SignUp)
 | 
							m.Get("/sign_up", auth.SignUp)
 | 
				
			||||||
		m.Post("/sign_up", bindIgnErr(forms.RegisterForm{}), auth.SignUpPost)
 | 
							m.Post("/sign_up", web.Bind(forms.RegisterForm{}), auth.SignUpPost)
 | 
				
			||||||
		m.Get("/link_account", linkAccountEnabled, auth.LinkAccount)
 | 
							m.Get("/link_account", linkAccountEnabled, auth.LinkAccount)
 | 
				
			||||||
		m.Post("/link_account_signin", linkAccountEnabled, bindIgnErr(forms.SignInForm{}), auth.LinkAccountPostSignIn)
 | 
							m.Post("/link_account_signin", linkAccountEnabled, web.Bind(forms.SignInForm{}), auth.LinkAccountPostSignIn)
 | 
				
			||||||
		m.Post("/link_account_signup", linkAccountEnabled, bindIgnErr(forms.RegisterForm{}), auth.LinkAccountPostRegister)
 | 
							m.Post("/link_account_signup", linkAccountEnabled, web.Bind(forms.RegisterForm{}), auth.LinkAccountPostRegister)
 | 
				
			||||||
		m.Group("/two_factor", func() {
 | 
							m.Group("/two_factor", func() {
 | 
				
			||||||
			m.Get("", auth.TwoFactor)
 | 
								m.Get("", auth.TwoFactor)
 | 
				
			||||||
			m.Post("", bindIgnErr(forms.TwoFactorAuthForm{}), auth.TwoFactorPost)
 | 
								m.Post("", web.Bind(forms.TwoFactorAuthForm{}), auth.TwoFactorPost)
 | 
				
			||||||
			m.Get("/scratch", auth.TwoFactorScratch)
 | 
								m.Get("/scratch", auth.TwoFactorScratch)
 | 
				
			||||||
			m.Post("/scratch", bindIgnErr(forms.TwoFactorScratchAuthForm{}), auth.TwoFactorScratchPost)
 | 
								m.Post("/scratch", web.Bind(forms.TwoFactorScratchAuthForm{}), auth.TwoFactorScratchPost)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		m.Group("/webauthn", func() {
 | 
							m.Group("/webauthn", func() {
 | 
				
			||||||
			m.Get("", auth.WebAuthn)
 | 
								m.Get("", auth.WebAuthn)
 | 
				
			||||||
@@ -393,34 +391,34 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
	m.Any("/user/events", routing.MarkLongPolling, events.Events)
 | 
						m.Any("/user/events", routing.MarkLongPolling, events.Events)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	m.Group("/login/oauth", func() {
 | 
						m.Group("/login/oauth", func() {
 | 
				
			||||||
		m.Get("/authorize", bindIgnErr(forms.AuthorizationForm{}), auth.AuthorizeOAuth)
 | 
							m.Get("/authorize", web.Bind(forms.AuthorizationForm{}), auth.AuthorizeOAuth)
 | 
				
			||||||
		m.Post("/grant", bindIgnErr(forms.GrantApplicationForm{}), auth.GrantApplicationOAuth)
 | 
							m.Post("/grant", web.Bind(forms.GrantApplicationForm{}), auth.GrantApplicationOAuth)
 | 
				
			||||||
		// TODO manage redirection
 | 
							// TODO manage redirection
 | 
				
			||||||
		m.Post("/authorize", bindIgnErr(forms.AuthorizationForm{}), auth.AuthorizeOAuth)
 | 
							m.Post("/authorize", web.Bind(forms.AuthorizationForm{}), auth.AuthorizeOAuth)
 | 
				
			||||||
	}, ignSignInAndCsrf, reqSignIn)
 | 
						}, ignSignInAndCsrf, reqSignIn)
 | 
				
			||||||
	m.Get("/login/oauth/userinfo", ignSignInAndCsrf, auth.InfoOAuth)
 | 
						m.Get("/login/oauth/userinfo", ignSignInAndCsrf, auth.InfoOAuth)
 | 
				
			||||||
	m.Post("/login/oauth/access_token", CorsHandler(), bindIgnErr(forms.AccessTokenForm{}), ignSignInAndCsrf, auth.AccessTokenOAuth)
 | 
						m.Post("/login/oauth/access_token", CorsHandler(), web.Bind(forms.AccessTokenForm{}), ignSignInAndCsrf, auth.AccessTokenOAuth)
 | 
				
			||||||
	m.Get("/login/oauth/keys", ignSignInAndCsrf, auth.OIDCKeys)
 | 
						m.Get("/login/oauth/keys", ignSignInAndCsrf, auth.OIDCKeys)
 | 
				
			||||||
	m.Post("/login/oauth/introspect", CorsHandler(), bindIgnErr(forms.IntrospectTokenForm{}), ignSignInAndCsrf, auth.IntrospectOAuth)
 | 
						m.Post("/login/oauth/introspect", CorsHandler(), web.Bind(forms.IntrospectTokenForm{}), ignSignInAndCsrf, auth.IntrospectOAuth)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	m.Group("/user/settings", func() {
 | 
						m.Group("/user/settings", func() {
 | 
				
			||||||
		m.Get("", user_setting.Profile)
 | 
							m.Get("", user_setting.Profile)
 | 
				
			||||||
		m.Post("", bindIgnErr(forms.UpdateProfileForm{}), user_setting.ProfilePost)
 | 
							m.Post("", web.Bind(forms.UpdateProfileForm{}), user_setting.ProfilePost)
 | 
				
			||||||
		m.Get("/change_password", auth.MustChangePassword)
 | 
							m.Get("/change_password", auth.MustChangePassword)
 | 
				
			||||||
		m.Post("/change_password", bindIgnErr(forms.MustChangePasswordForm{}), auth.MustChangePasswordPost)
 | 
							m.Post("/change_password", web.Bind(forms.MustChangePasswordForm{}), auth.MustChangePasswordPost)
 | 
				
			||||||
		m.Post("/avatar", bindIgnErr(forms.AvatarForm{}), user_setting.AvatarPost)
 | 
							m.Post("/avatar", web.Bind(forms.AvatarForm{}), user_setting.AvatarPost)
 | 
				
			||||||
		m.Post("/avatar/delete", user_setting.DeleteAvatar)
 | 
							m.Post("/avatar/delete", user_setting.DeleteAvatar)
 | 
				
			||||||
		m.Group("/account", func() {
 | 
							m.Group("/account", func() {
 | 
				
			||||||
			m.Combo("").Get(user_setting.Account).Post(bindIgnErr(forms.ChangePasswordForm{}), user_setting.AccountPost)
 | 
								m.Combo("").Get(user_setting.Account).Post(web.Bind(forms.ChangePasswordForm{}), user_setting.AccountPost)
 | 
				
			||||||
			m.Post("/email", bindIgnErr(forms.AddEmailForm{}), user_setting.EmailPost)
 | 
								m.Post("/email", web.Bind(forms.AddEmailForm{}), user_setting.EmailPost)
 | 
				
			||||||
			m.Post("/email/delete", user_setting.DeleteEmail)
 | 
								m.Post("/email/delete", user_setting.DeleteEmail)
 | 
				
			||||||
			m.Post("/delete", user_setting.DeleteAccount)
 | 
								m.Post("/delete", user_setting.DeleteAccount)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		m.Group("/appearance", func() {
 | 
							m.Group("/appearance", func() {
 | 
				
			||||||
			m.Get("", user_setting.Appearance)
 | 
								m.Get("", user_setting.Appearance)
 | 
				
			||||||
			m.Post("/language", bindIgnErr(forms.UpdateLanguageForm{}), user_setting.UpdateUserLang)
 | 
								m.Post("/language", web.Bind(forms.UpdateLanguageForm{}), user_setting.UpdateUserLang)
 | 
				
			||||||
			m.Post("/hidden_comments", user_setting.UpdateUserHiddenComments)
 | 
								m.Post("/hidden_comments", user_setting.UpdateUserHiddenComments)
 | 
				
			||||||
			m.Post("/theme", bindIgnErr(forms.UpdateThemeForm{}), user_setting.UpdateUIThemePost)
 | 
								m.Post("/theme", web.Bind(forms.UpdateThemeForm{}), user_setting.UpdateUIThemePost)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		m.Group("/security", func() {
 | 
							m.Group("/security", func() {
 | 
				
			||||||
			m.Get("", security.Security)
 | 
								m.Get("", security.Security)
 | 
				
			||||||
@@ -428,15 +426,15 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
				m.Post("/regenerate_scratch", security.RegenerateScratchTwoFactor)
 | 
									m.Post("/regenerate_scratch", security.RegenerateScratchTwoFactor)
 | 
				
			||||||
				m.Post("/disable", security.DisableTwoFactor)
 | 
									m.Post("/disable", security.DisableTwoFactor)
 | 
				
			||||||
				m.Get("/enroll", security.EnrollTwoFactor)
 | 
									m.Get("/enroll", security.EnrollTwoFactor)
 | 
				
			||||||
				m.Post("/enroll", bindIgnErr(forms.TwoFactorAuthForm{}), security.EnrollTwoFactorPost)
 | 
									m.Post("/enroll", web.Bind(forms.TwoFactorAuthForm{}), security.EnrollTwoFactorPost)
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
			m.Group("/webauthn", func() {
 | 
								m.Group("/webauthn", func() {
 | 
				
			||||||
				m.Post("/request_register", bindIgnErr(forms.WebauthnRegistrationForm{}), security.WebAuthnRegister)
 | 
									m.Post("/request_register", web.Bind(forms.WebauthnRegistrationForm{}), security.WebAuthnRegister)
 | 
				
			||||||
				m.Post("/register", security.WebauthnRegisterPost)
 | 
									m.Post("/register", security.WebauthnRegisterPost)
 | 
				
			||||||
				m.Post("/delete", bindIgnErr(forms.WebauthnDeleteForm{}), security.WebauthnDelete)
 | 
									m.Post("/delete", web.Bind(forms.WebauthnDeleteForm{}), security.WebauthnDelete)
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
			m.Group("/openid", func() {
 | 
								m.Group("/openid", func() {
 | 
				
			||||||
				m.Post("", bindIgnErr(forms.AddOpenIDForm{}), security.OpenIDPost)
 | 
									m.Post("", web.Bind(forms.AddOpenIDForm{}), security.OpenIDPost)
 | 
				
			||||||
				m.Post("/delete", security.DeleteOpenID)
 | 
									m.Post("/delete", security.DeleteOpenID)
 | 
				
			||||||
				m.Post("/toggle_visibility", security.ToggleOpenIDVisibility)
 | 
									m.Post("/toggle_visibility", security.ToggleOpenIDVisibility)
 | 
				
			||||||
			}, openIDSignInEnabled)
 | 
								}, openIDSignInEnabled)
 | 
				
			||||||
@@ -444,28 +442,28 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
		})
 | 
							})
 | 
				
			||||||
		m.Group("/applications/oauth2", func() {
 | 
							m.Group("/applications/oauth2", func() {
 | 
				
			||||||
			m.Get("/{id}", user_setting.OAuth2ApplicationShow)
 | 
								m.Get("/{id}", user_setting.OAuth2ApplicationShow)
 | 
				
			||||||
			m.Post("/{id}", bindIgnErr(forms.EditOAuth2ApplicationForm{}), user_setting.OAuthApplicationsEdit)
 | 
								m.Post("/{id}", web.Bind(forms.EditOAuth2ApplicationForm{}), user_setting.OAuthApplicationsEdit)
 | 
				
			||||||
			m.Post("/{id}/regenerate_secret", user_setting.OAuthApplicationsRegenerateSecret)
 | 
								m.Post("/{id}/regenerate_secret", user_setting.OAuthApplicationsRegenerateSecret)
 | 
				
			||||||
			m.Post("", bindIgnErr(forms.EditOAuth2ApplicationForm{}), user_setting.OAuthApplicationsPost)
 | 
								m.Post("", web.Bind(forms.EditOAuth2ApplicationForm{}), user_setting.OAuthApplicationsPost)
 | 
				
			||||||
			m.Post("/{id}/delete", user_setting.DeleteOAuth2Application)
 | 
								m.Post("/{id}/delete", user_setting.DeleteOAuth2Application)
 | 
				
			||||||
			m.Post("/{id}/revoke/{grantId}", user_setting.RevokeOAuth2Grant)
 | 
								m.Post("/{id}/revoke/{grantId}", user_setting.RevokeOAuth2Grant)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		m.Combo("/applications").Get(user_setting.Applications).
 | 
							m.Combo("/applications").Get(user_setting.Applications).
 | 
				
			||||||
			Post(bindIgnErr(forms.NewAccessTokenForm{}), user_setting.ApplicationsPost)
 | 
								Post(web.Bind(forms.NewAccessTokenForm{}), user_setting.ApplicationsPost)
 | 
				
			||||||
		m.Post("/applications/delete", user_setting.DeleteApplication)
 | 
							m.Post("/applications/delete", user_setting.DeleteApplication)
 | 
				
			||||||
		m.Combo("/keys").Get(user_setting.Keys).
 | 
							m.Combo("/keys").Get(user_setting.Keys).
 | 
				
			||||||
			Post(bindIgnErr(forms.AddKeyForm{}), user_setting.KeysPost)
 | 
								Post(web.Bind(forms.AddKeyForm{}), user_setting.KeysPost)
 | 
				
			||||||
		m.Post("/keys/delete", user_setting.DeleteKey)
 | 
							m.Post("/keys/delete", user_setting.DeleteKey)
 | 
				
			||||||
		m.Group("/packages", func() {
 | 
							m.Group("/packages", func() {
 | 
				
			||||||
			m.Get("", user_setting.Packages)
 | 
								m.Get("", user_setting.Packages)
 | 
				
			||||||
			m.Group("/rules", func() {
 | 
								m.Group("/rules", func() {
 | 
				
			||||||
				m.Group("/add", func() {
 | 
									m.Group("/add", func() {
 | 
				
			||||||
					m.Get("", user_setting.PackagesRuleAdd)
 | 
										m.Get("", user_setting.PackagesRuleAdd)
 | 
				
			||||||
					m.Post("", bindIgnErr(forms.PackageCleanupRuleForm{}), user_setting.PackagesRuleAddPost)
 | 
										m.Post("", web.Bind(forms.PackageCleanupRuleForm{}), user_setting.PackagesRuleAddPost)
 | 
				
			||||||
				})
 | 
									})
 | 
				
			||||||
				m.Group("/{id}", func() {
 | 
									m.Group("/{id}", func() {
 | 
				
			||||||
					m.Get("", user_setting.PackagesRuleEdit)
 | 
										m.Get("", user_setting.PackagesRuleEdit)
 | 
				
			||||||
					m.Post("", bindIgnErr(forms.PackageCleanupRuleForm{}), user_setting.PackagesRuleEditPost)
 | 
										m.Post("", web.Bind(forms.PackageCleanupRuleForm{}), user_setting.PackagesRuleEditPost)
 | 
				
			||||||
					m.Get("/preview", user_setting.PackagesRulePreview)
 | 
										m.Get("/preview", user_setting.PackagesRulePreview)
 | 
				
			||||||
				})
 | 
									})
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
@@ -507,7 +505,7 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
	// ***** START: Admin *****
 | 
						// ***** START: Admin *****
 | 
				
			||||||
	m.Group("/admin", func() {
 | 
						m.Group("/admin", func() {
 | 
				
			||||||
		m.Get("", adminReq, admin.Dashboard)
 | 
							m.Get("", adminReq, admin.Dashboard)
 | 
				
			||||||
		m.Post("", adminReq, bindIgnErr(forms.AdminDashboardForm{}), admin.DashboardPost)
 | 
							m.Post("", adminReq, web.Bind(forms.AdminDashboardForm{}), admin.DashboardPost)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		m.Group("/config", func() {
 | 
							m.Group("/config", func() {
 | 
				
			||||||
			m.Get("", admin.Config)
 | 
								m.Get("", admin.Config)
 | 
				
			||||||
@@ -532,10 +530,10 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		m.Group("/users", func() {
 | 
							m.Group("/users", func() {
 | 
				
			||||||
			m.Get("", admin.Users)
 | 
								m.Get("", admin.Users)
 | 
				
			||||||
			m.Combo("/new").Get(admin.NewUser).Post(bindIgnErr(forms.AdminCreateUserForm{}), admin.NewUserPost)
 | 
								m.Combo("/new").Get(admin.NewUser).Post(web.Bind(forms.AdminCreateUserForm{}), admin.NewUserPost)
 | 
				
			||||||
			m.Combo("/{userid}").Get(admin.EditUser).Post(bindIgnErr(forms.AdminEditUserForm{}), admin.EditUserPost)
 | 
								m.Combo("/{userid}").Get(admin.EditUser).Post(web.Bind(forms.AdminEditUserForm{}), admin.EditUserPost)
 | 
				
			||||||
			m.Post("/{userid}/delete", admin.DeleteUser)
 | 
								m.Post("/{userid}/delete", admin.DeleteUser)
 | 
				
			||||||
			m.Post("/{userid}/avatar", bindIgnErr(forms.AvatarForm{}), admin.AvatarPost)
 | 
								m.Post("/{userid}/avatar", web.Bind(forms.AvatarForm{}), admin.AvatarPost)
 | 
				
			||||||
			m.Post("/{userid}/avatar/delete", admin.DeleteAvatar)
 | 
								m.Post("/{userid}/avatar/delete", admin.DeleteAvatar)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -566,39 +564,39 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
				m.Get("", repo.WebHooksEdit)
 | 
									m.Get("", repo.WebHooksEdit)
 | 
				
			||||||
				m.Post("/replay/{uuid}", repo.ReplayWebhook)
 | 
									m.Post("/replay/{uuid}", repo.ReplayWebhook)
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
			m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
 | 
								m.Post("/gitea/{id}", web.Bind(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
 | 
				
			||||||
			m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
 | 
								m.Post("/gogs/{id}", web.Bind(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
 | 
				
			||||||
			m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
 | 
								m.Post("/slack/{id}", web.Bind(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
 | 
				
			||||||
			m.Post("/discord/{id}", bindIgnErr(forms.NewDiscordHookForm{}), repo.DiscordHooksEditPost)
 | 
								m.Post("/discord/{id}", web.Bind(forms.NewDiscordHookForm{}), repo.DiscordHooksEditPost)
 | 
				
			||||||
			m.Post("/dingtalk/{id}", bindIgnErr(forms.NewDingtalkHookForm{}), repo.DingtalkHooksEditPost)
 | 
								m.Post("/dingtalk/{id}", web.Bind(forms.NewDingtalkHookForm{}), repo.DingtalkHooksEditPost)
 | 
				
			||||||
			m.Post("/telegram/{id}", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost)
 | 
								m.Post("/telegram/{id}", web.Bind(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost)
 | 
				
			||||||
			m.Post("/matrix/{id}", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost)
 | 
								m.Post("/matrix/{id}", web.Bind(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost)
 | 
				
			||||||
			m.Post("/msteams/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost)
 | 
								m.Post("/msteams/{id}", web.Bind(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost)
 | 
				
			||||||
			m.Post("/feishu/{id}", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost)
 | 
								m.Post("/feishu/{id}", web.Bind(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost)
 | 
				
			||||||
			m.Post("/wechatwork/{id}", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost)
 | 
								m.Post("/wechatwork/{id}", web.Bind(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost)
 | 
				
			||||||
			m.Post("/packagist/{id}", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksEditPost)
 | 
								m.Post("/packagist/{id}", web.Bind(forms.NewPackagistHookForm{}), repo.PackagistHooksEditPost)
 | 
				
			||||||
		}, webhooksEnabled)
 | 
							}, webhooksEnabled)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		m.Group("/{configType:default-hooks|system-hooks}", func() {
 | 
							m.Group("/{configType:default-hooks|system-hooks}", func() {
 | 
				
			||||||
			m.Get("/{type}/new", repo.WebhooksNew)
 | 
								m.Get("/{type}/new", repo.WebhooksNew)
 | 
				
			||||||
			m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
 | 
								m.Post("/gitea/new", web.Bind(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
 | 
				
			||||||
			m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
 | 
								m.Post("/gogs/new", web.Bind(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
 | 
				
			||||||
			m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
 | 
								m.Post("/slack/new", web.Bind(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
 | 
				
			||||||
			m.Post("/discord/new", bindIgnErr(forms.NewDiscordHookForm{}), repo.DiscordHooksNewPost)
 | 
								m.Post("/discord/new", web.Bind(forms.NewDiscordHookForm{}), repo.DiscordHooksNewPost)
 | 
				
			||||||
			m.Post("/dingtalk/new", bindIgnErr(forms.NewDingtalkHookForm{}), repo.DingtalkHooksNewPost)
 | 
								m.Post("/dingtalk/new", web.Bind(forms.NewDingtalkHookForm{}), repo.DingtalkHooksNewPost)
 | 
				
			||||||
			m.Post("/telegram/new", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost)
 | 
								m.Post("/telegram/new", web.Bind(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost)
 | 
				
			||||||
			m.Post("/matrix/new", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost)
 | 
								m.Post("/matrix/new", web.Bind(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost)
 | 
				
			||||||
			m.Post("/msteams/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost)
 | 
								m.Post("/msteams/new", web.Bind(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost)
 | 
				
			||||||
			m.Post("/feishu/new", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost)
 | 
								m.Post("/feishu/new", web.Bind(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost)
 | 
				
			||||||
			m.Post("/wechatwork/new", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost)
 | 
								m.Post("/wechatwork/new", web.Bind(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost)
 | 
				
			||||||
			m.Post("/packagist/new", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksNewPost)
 | 
								m.Post("/packagist/new", web.Bind(forms.NewPackagistHookForm{}), repo.PackagistHooksNewPost)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		m.Group("/auths", func() {
 | 
							m.Group("/auths", func() {
 | 
				
			||||||
			m.Get("", admin.Authentications)
 | 
								m.Get("", admin.Authentications)
 | 
				
			||||||
			m.Combo("/new").Get(admin.NewAuthSource).Post(bindIgnErr(forms.AuthenticationForm{}), admin.NewAuthSourcePost)
 | 
								m.Combo("/new").Get(admin.NewAuthSource).Post(web.Bind(forms.AuthenticationForm{}), admin.NewAuthSourcePost)
 | 
				
			||||||
			m.Combo("/{authid}").Get(admin.EditAuthSource).
 | 
								m.Combo("/{authid}").Get(admin.EditAuthSource).
 | 
				
			||||||
				Post(bindIgnErr(forms.AuthenticationForm{}), admin.EditAuthSourcePost)
 | 
									Post(web.Bind(forms.AuthenticationForm{}), admin.EditAuthSourcePost)
 | 
				
			||||||
			m.Post("/{authid}/delete", admin.DeleteAuthSource)
 | 
								m.Post("/{authid}/delete", admin.DeleteAuthSource)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -610,9 +608,9 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		m.Group("/applications", func() {
 | 
							m.Group("/applications", func() {
 | 
				
			||||||
			m.Get("", admin.Applications)
 | 
								m.Get("", admin.Applications)
 | 
				
			||||||
			m.Post("/oauth2", bindIgnErr(forms.EditOAuth2ApplicationForm{}), admin.ApplicationsPost)
 | 
								m.Post("/oauth2", web.Bind(forms.EditOAuth2ApplicationForm{}), admin.ApplicationsPost)
 | 
				
			||||||
			m.Group("/oauth2/{id}", func() {
 | 
								m.Group("/oauth2/{id}", func() {
 | 
				
			||||||
				m.Combo("").Get(admin.EditApplication).Post(bindIgnErr(forms.EditOAuth2ApplicationForm{}), admin.EditApplicationPost)
 | 
									m.Combo("").Get(admin.EditApplication).Post(web.Bind(forms.EditOAuth2ApplicationForm{}), admin.EditApplicationPost)
 | 
				
			||||||
				m.Post("/regenerate_secret", admin.ApplicationsRegenerateSecret)
 | 
									m.Post("/regenerate_secret", admin.ApplicationsRegenerateSecret)
 | 
				
			||||||
				m.Post("/delete", admin.DeleteApplication)
 | 
									m.Post("/delete", admin.DeleteApplication)
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
@@ -683,7 +681,7 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
	m.Group("/org", func() {
 | 
						m.Group("/org", func() {
 | 
				
			||||||
		m.Group("", func() {
 | 
							m.Group("", func() {
 | 
				
			||||||
			m.Get("/create", org.Create)
 | 
								m.Get("/create", org.Create)
 | 
				
			||||||
			m.Post("/create", bindIgnErr(forms.CreateOrgForm{}), org.CreatePost)
 | 
								m.Post("/create", web.Bind(forms.CreateOrgForm{}), org.CreatePost)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		m.Group("/invite/{token}", func() {
 | 
							m.Group("/invite/{token}", func() {
 | 
				
			||||||
@@ -713,22 +711,22 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		m.Group("/{org}", func() {
 | 
							m.Group("/{org}", func() {
 | 
				
			||||||
			m.Get("/teams/new", org.NewTeam)
 | 
								m.Get("/teams/new", org.NewTeam)
 | 
				
			||||||
			m.Post("/teams/new", bindIgnErr(forms.CreateTeamForm{}), org.NewTeamPost)
 | 
								m.Post("/teams/new", web.Bind(forms.CreateTeamForm{}), org.NewTeamPost)
 | 
				
			||||||
			m.Get("/teams/-/search", org.SearchTeam)
 | 
								m.Get("/teams/-/search", org.SearchTeam)
 | 
				
			||||||
			m.Get("/teams/{team}/edit", org.EditTeam)
 | 
								m.Get("/teams/{team}/edit", org.EditTeam)
 | 
				
			||||||
			m.Post("/teams/{team}/edit", bindIgnErr(forms.CreateTeamForm{}), org.EditTeamPost)
 | 
								m.Post("/teams/{team}/edit", web.Bind(forms.CreateTeamForm{}), org.EditTeamPost)
 | 
				
			||||||
			m.Post("/teams/{team}/delete", org.DeleteTeam)
 | 
								m.Post("/teams/{team}/delete", org.DeleteTeam)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			m.Group("/settings", func() {
 | 
								m.Group("/settings", func() {
 | 
				
			||||||
				m.Combo("").Get(org.Settings).
 | 
									m.Combo("").Get(org.Settings).
 | 
				
			||||||
					Post(bindIgnErr(forms.UpdateOrgSettingForm{}), org.SettingsPost)
 | 
										Post(web.Bind(forms.UpdateOrgSettingForm{}), org.SettingsPost)
 | 
				
			||||||
				m.Post("/avatar", bindIgnErr(forms.AvatarForm{}), org.SettingsAvatar)
 | 
									m.Post("/avatar", web.Bind(forms.AvatarForm{}), org.SettingsAvatar)
 | 
				
			||||||
				m.Post("/avatar/delete", org.SettingsDeleteAvatar)
 | 
									m.Post("/avatar/delete", org.SettingsDeleteAvatar)
 | 
				
			||||||
				m.Group("/applications", func() {
 | 
									m.Group("/applications", func() {
 | 
				
			||||||
					m.Get("", org.Applications)
 | 
										m.Get("", org.Applications)
 | 
				
			||||||
					m.Post("/oauth2", bindIgnErr(forms.EditOAuth2ApplicationForm{}), org.OAuthApplicationsPost)
 | 
										m.Post("/oauth2", web.Bind(forms.EditOAuth2ApplicationForm{}), org.OAuthApplicationsPost)
 | 
				
			||||||
					m.Group("/oauth2/{id}", func() {
 | 
										m.Group("/oauth2/{id}", func() {
 | 
				
			||||||
						m.Combo("").Get(org.OAuth2ApplicationShow).Post(bindIgnErr(forms.EditOAuth2ApplicationForm{}), org.OAuth2ApplicationEdit)
 | 
											m.Combo("").Get(org.OAuth2ApplicationShow).Post(web.Bind(forms.EditOAuth2ApplicationForm{}), org.OAuth2ApplicationEdit)
 | 
				
			||||||
						m.Post("/regenerate_secret", org.OAuthApplicationsRegenerateSecret)
 | 
											m.Post("/regenerate_secret", org.OAuthApplicationsRegenerateSecret)
 | 
				
			||||||
						m.Post("/delete", org.DeleteOAuth2Application)
 | 
											m.Post("/delete", org.DeleteOAuth2Application)
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
@@ -743,38 +741,38 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
					m.Get("", org.Webhooks)
 | 
										m.Get("", org.Webhooks)
 | 
				
			||||||
					m.Post("/delete", org.DeleteWebhook)
 | 
										m.Post("/delete", org.DeleteWebhook)
 | 
				
			||||||
					m.Get("/{type}/new", repo.WebhooksNew)
 | 
										m.Get("/{type}/new", repo.WebhooksNew)
 | 
				
			||||||
					m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
 | 
										m.Post("/gitea/new", web.Bind(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
 | 
				
			||||||
					m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
 | 
										m.Post("/gogs/new", web.Bind(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
 | 
				
			||||||
					m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
 | 
										m.Post("/slack/new", web.Bind(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
 | 
				
			||||||
					m.Post("/discord/new", bindIgnErr(forms.NewDiscordHookForm{}), repo.DiscordHooksNewPost)
 | 
										m.Post("/discord/new", web.Bind(forms.NewDiscordHookForm{}), repo.DiscordHooksNewPost)
 | 
				
			||||||
					m.Post("/dingtalk/new", bindIgnErr(forms.NewDingtalkHookForm{}), repo.DingtalkHooksNewPost)
 | 
										m.Post("/dingtalk/new", web.Bind(forms.NewDingtalkHookForm{}), repo.DingtalkHooksNewPost)
 | 
				
			||||||
					m.Post("/telegram/new", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost)
 | 
										m.Post("/telegram/new", web.Bind(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost)
 | 
				
			||||||
					m.Post("/matrix/new", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost)
 | 
										m.Post("/matrix/new", web.Bind(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost)
 | 
				
			||||||
					m.Post("/msteams/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost)
 | 
										m.Post("/msteams/new", web.Bind(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost)
 | 
				
			||||||
					m.Post("/feishu/new", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost)
 | 
										m.Post("/feishu/new", web.Bind(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost)
 | 
				
			||||||
					m.Post("/wechatwork/new", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost)
 | 
										m.Post("/wechatwork/new", web.Bind(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost)
 | 
				
			||||||
					m.Group("/{id}", func() {
 | 
										m.Group("/{id}", func() {
 | 
				
			||||||
						m.Get("", repo.WebHooksEdit)
 | 
											m.Get("", repo.WebHooksEdit)
 | 
				
			||||||
						m.Post("/replay/{uuid}", repo.ReplayWebhook)
 | 
											m.Post("/replay/{uuid}", repo.ReplayWebhook)
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
					m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
 | 
										m.Post("/gitea/{id}", web.Bind(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
 | 
				
			||||||
					m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
 | 
										m.Post("/gogs/{id}", web.Bind(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
 | 
				
			||||||
					m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
 | 
										m.Post("/slack/{id}", web.Bind(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
 | 
				
			||||||
					m.Post("/discord/{id}", bindIgnErr(forms.NewDiscordHookForm{}), repo.DiscordHooksEditPost)
 | 
										m.Post("/discord/{id}", web.Bind(forms.NewDiscordHookForm{}), repo.DiscordHooksEditPost)
 | 
				
			||||||
					m.Post("/dingtalk/{id}", bindIgnErr(forms.NewDingtalkHookForm{}), repo.DingtalkHooksEditPost)
 | 
										m.Post("/dingtalk/{id}", web.Bind(forms.NewDingtalkHookForm{}), repo.DingtalkHooksEditPost)
 | 
				
			||||||
					m.Post("/telegram/{id}", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost)
 | 
										m.Post("/telegram/{id}", web.Bind(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost)
 | 
				
			||||||
					m.Post("/matrix/{id}", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost)
 | 
										m.Post("/matrix/{id}", web.Bind(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost)
 | 
				
			||||||
					m.Post("/msteams/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost)
 | 
										m.Post("/msteams/{id}", web.Bind(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost)
 | 
				
			||||||
					m.Post("/feishu/{id}", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost)
 | 
										m.Post("/feishu/{id}", web.Bind(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost)
 | 
				
			||||||
					m.Post("/wechatwork/{id}", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost)
 | 
										m.Post("/wechatwork/{id}", web.Bind(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost)
 | 
				
			||||||
				}, webhooksEnabled)
 | 
									}, webhooksEnabled)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				m.Group("/labels", func() {
 | 
									m.Group("/labels", func() {
 | 
				
			||||||
					m.Get("", org.RetrieveLabels, org.Labels)
 | 
										m.Get("", org.RetrieveLabels, org.Labels)
 | 
				
			||||||
					m.Post("/new", bindIgnErr(forms.CreateLabelForm{}), org.NewLabel)
 | 
										m.Post("/new", web.Bind(forms.CreateLabelForm{}), org.NewLabel)
 | 
				
			||||||
					m.Post("/edit", bindIgnErr(forms.CreateLabelForm{}), org.UpdateLabel)
 | 
										m.Post("/edit", web.Bind(forms.CreateLabelForm{}), org.UpdateLabel)
 | 
				
			||||||
					m.Post("/delete", org.DeleteLabel)
 | 
										m.Post("/delete", org.DeleteLabel)
 | 
				
			||||||
					m.Post("/initialize", bindIgnErr(forms.InitializeLabelsForm{}), org.InitializeLabels)
 | 
										m.Post("/initialize", web.Bind(forms.InitializeLabelsForm{}), org.InitializeLabels)
 | 
				
			||||||
				})
 | 
									})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				m.Route("/delete", "GET,POST", org.SettingsDelete)
 | 
									m.Route("/delete", "GET,POST", org.SettingsDelete)
 | 
				
			||||||
@@ -784,11 +782,11 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
					m.Group("/rules", func() {
 | 
										m.Group("/rules", func() {
 | 
				
			||||||
						m.Group("/add", func() {
 | 
											m.Group("/add", func() {
 | 
				
			||||||
							m.Get("", org.PackagesRuleAdd)
 | 
												m.Get("", org.PackagesRuleAdd)
 | 
				
			||||||
							m.Post("", bindIgnErr(forms.PackageCleanupRuleForm{}), org.PackagesRuleAddPost)
 | 
												m.Post("", web.Bind(forms.PackageCleanupRuleForm{}), org.PackagesRuleAddPost)
 | 
				
			||||||
						})
 | 
											})
 | 
				
			||||||
						m.Group("/{id}", func() {
 | 
											m.Group("/{id}", func() {
 | 
				
			||||||
							m.Get("", org.PackagesRuleEdit)
 | 
												m.Get("", org.PackagesRuleEdit)
 | 
				
			||||||
							m.Post("", bindIgnErr(forms.PackageCleanupRuleForm{}), org.PackagesRuleEditPost)
 | 
												m.Post("", web.Bind(forms.PackageCleanupRuleForm{}), org.PackagesRuleEditPost)
 | 
				
			||||||
							m.Get("/preview", org.PackagesRulePreview)
 | 
												m.Get("/preview", org.PackagesRulePreview)
 | 
				
			||||||
						})
 | 
											})
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
@@ -804,12 +802,12 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
	// ***** START: Repository *****
 | 
						// ***** START: Repository *****
 | 
				
			||||||
	m.Group("/repo", func() {
 | 
						m.Group("/repo", func() {
 | 
				
			||||||
		m.Get("/create", repo.Create)
 | 
							m.Get("/create", repo.Create)
 | 
				
			||||||
		m.Post("/create", bindIgnErr(forms.CreateRepoForm{}), repo.CreatePost)
 | 
							m.Post("/create", web.Bind(forms.CreateRepoForm{}), repo.CreatePost)
 | 
				
			||||||
		m.Get("/migrate", repo.Migrate)
 | 
							m.Get("/migrate", repo.Migrate)
 | 
				
			||||||
		m.Post("/migrate", bindIgnErr(forms.MigrateRepoForm{}), repo.MigratePost)
 | 
							m.Post("/migrate", web.Bind(forms.MigrateRepoForm{}), repo.MigratePost)
 | 
				
			||||||
		m.Group("/fork", func() {
 | 
							m.Group("/fork", func() {
 | 
				
			||||||
			m.Combo("/{repoid}").Get(repo.Fork).
 | 
								m.Combo("/{repoid}").Get(repo.Fork).
 | 
				
			||||||
				Post(bindIgnErr(forms.CreateRepoForm{}), repo.ForkPost)
 | 
									Post(web.Bind(forms.CreateRepoForm{}), repo.ForkPost)
 | 
				
			||||||
		}, context.RepoIDAssignment(), context.UnitTypes(), reqRepoCodeReader)
 | 
							}, context.RepoIDAssignment(), context.UnitTypes(), reqRepoCodeReader)
 | 
				
			||||||
		m.Get("/search", repo.SearchRepo)
 | 
							m.Get("/search", repo.SearchRepo)
 | 
				
			||||||
	}, reqSignIn)
 | 
						}, reqSignIn)
 | 
				
			||||||
@@ -826,7 +824,7 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
						m.Get("/files/{fileid}", user.DownloadPackageFile)
 | 
											m.Get("/files/{fileid}", user.DownloadPackageFile)
 | 
				
			||||||
						m.Group("/settings", func() {
 | 
											m.Group("/settings", func() {
 | 
				
			||||||
							m.Get("", user.PackageSettings)
 | 
												m.Get("", user.PackageSettings)
 | 
				
			||||||
							m.Post("", bindIgnErr(forms.PackageSettingForm{}), user.PackageSettingsPost)
 | 
												m.Post("", web.Bind(forms.PackageSettingForm{}), user.PackageSettingsPost)
 | 
				
			||||||
						}, reqPackageAccess(perm.AccessModeWrite))
 | 
											}, reqPackageAccess(perm.AccessModeWrite))
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				})
 | 
									})
 | 
				
			||||||
@@ -842,9 +840,9 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
		m.Group("/settings", func() {
 | 
							m.Group("/settings", func() {
 | 
				
			||||||
			m.Group("", func() {
 | 
								m.Group("", func() {
 | 
				
			||||||
				m.Combo("").Get(repo.Settings).
 | 
									m.Combo("").Get(repo.Settings).
 | 
				
			||||||
					Post(bindIgnErr(forms.RepoSettingForm{}), repo.SettingsPost)
 | 
										Post(web.Bind(forms.RepoSettingForm{}), repo.SettingsPost)
 | 
				
			||||||
			}, repo.SettingsCtxData)
 | 
								}, repo.SettingsCtxData)
 | 
				
			||||||
			m.Post("/avatar", bindIgnErr(forms.AvatarForm{}), repo.SettingsAvatar)
 | 
								m.Post("/avatar", web.Bind(forms.AvatarForm{}), repo.SettingsAvatar)
 | 
				
			||||||
			m.Post("/avatar/delete", repo.SettingsDeleteAvatar)
 | 
								m.Post("/avatar/delete", repo.SettingsDeleteAvatar)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			m.Group("/collaboration", func() {
 | 
								m.Group("/collaboration", func() {
 | 
				
			||||||
@@ -860,16 +858,16 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
			m.Group("/branches", func() {
 | 
								m.Group("/branches", func() {
 | 
				
			||||||
				m.Combo("").Get(repo.ProtectedBranch).Post(repo.ProtectedBranchPost)
 | 
									m.Combo("").Get(repo.ProtectedBranch).Post(repo.ProtectedBranchPost)
 | 
				
			||||||
				m.Combo("/*").Get(repo.SettingsProtectedBranch).
 | 
									m.Combo("/*").Get(repo.SettingsProtectedBranch).
 | 
				
			||||||
					Post(bindIgnErr(forms.ProtectBranchForm{}), context.RepoMustNotBeArchived(), repo.SettingsProtectedBranchPost)
 | 
										Post(web.Bind(forms.ProtectBranchForm{}), context.RepoMustNotBeArchived(), repo.SettingsProtectedBranchPost)
 | 
				
			||||||
			}, repo.MustBeNotEmpty)
 | 
								}, repo.MustBeNotEmpty)
 | 
				
			||||||
			m.Post("/rename_branch", bindIgnErr(forms.RenameBranchForm{}), context.RepoMustNotBeArchived(), repo.RenameBranchPost)
 | 
								m.Post("/rename_branch", web.Bind(forms.RenameBranchForm{}), context.RepoMustNotBeArchived(), repo.RenameBranchPost)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			m.Group("/tags", func() {
 | 
								m.Group("/tags", func() {
 | 
				
			||||||
				m.Get("", repo.Tags)
 | 
									m.Get("", repo.Tags)
 | 
				
			||||||
				m.Post("", bindIgnErr(forms.ProtectTagForm{}), context.RepoMustNotBeArchived(), repo.NewProtectedTagPost)
 | 
									m.Post("", web.Bind(forms.ProtectTagForm{}), context.RepoMustNotBeArchived(), repo.NewProtectedTagPost)
 | 
				
			||||||
				m.Post("/delete", context.RepoMustNotBeArchived(), repo.DeleteProtectedTagPost)
 | 
									m.Post("/delete", context.RepoMustNotBeArchived(), repo.DeleteProtectedTagPost)
 | 
				
			||||||
				m.Get("/{id}", repo.EditProtectedTag)
 | 
									m.Get("/{id}", repo.EditProtectedTag)
 | 
				
			||||||
				m.Post("/{id}", bindIgnErr(forms.ProtectTagForm{}), context.RepoMustNotBeArchived(), repo.EditProtectedTagPost)
 | 
									m.Post("/{id}", web.Bind(forms.ProtectTagForm{}), context.RepoMustNotBeArchived(), repo.EditProtectedTagPost)
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			m.Group("/hooks/git", func() {
 | 
								m.Group("/hooks/git", func() {
 | 
				
			||||||
@@ -882,38 +880,38 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
				m.Get("", repo.Webhooks)
 | 
									m.Get("", repo.Webhooks)
 | 
				
			||||||
				m.Post("/delete", repo.DeleteWebhook)
 | 
									m.Post("/delete", repo.DeleteWebhook)
 | 
				
			||||||
				m.Get("/{type}/new", repo.WebhooksNew)
 | 
									m.Get("/{type}/new", repo.WebhooksNew)
 | 
				
			||||||
				m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
 | 
									m.Post("/gitea/new", web.Bind(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
 | 
				
			||||||
				m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
 | 
									m.Post("/gogs/new", web.Bind(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
 | 
				
			||||||
				m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
 | 
									m.Post("/slack/new", web.Bind(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
 | 
				
			||||||
				m.Post("/discord/new", bindIgnErr(forms.NewDiscordHookForm{}), repo.DiscordHooksNewPost)
 | 
									m.Post("/discord/new", web.Bind(forms.NewDiscordHookForm{}), repo.DiscordHooksNewPost)
 | 
				
			||||||
				m.Post("/dingtalk/new", bindIgnErr(forms.NewDingtalkHookForm{}), repo.DingtalkHooksNewPost)
 | 
									m.Post("/dingtalk/new", web.Bind(forms.NewDingtalkHookForm{}), repo.DingtalkHooksNewPost)
 | 
				
			||||||
				m.Post("/telegram/new", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost)
 | 
									m.Post("/telegram/new", web.Bind(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost)
 | 
				
			||||||
				m.Post("/matrix/new", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost)
 | 
									m.Post("/matrix/new", web.Bind(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost)
 | 
				
			||||||
				m.Post("/msteams/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost)
 | 
									m.Post("/msteams/new", web.Bind(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost)
 | 
				
			||||||
				m.Post("/feishu/new", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost)
 | 
									m.Post("/feishu/new", web.Bind(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost)
 | 
				
			||||||
				m.Post("/wechatwork/new", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost)
 | 
									m.Post("/wechatwork/new", web.Bind(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost)
 | 
				
			||||||
				m.Post("/packagist/new", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksNewPost)
 | 
									m.Post("/packagist/new", web.Bind(forms.NewPackagistHookForm{}), repo.PackagistHooksNewPost)
 | 
				
			||||||
				m.Group("/{id}", func() {
 | 
									m.Group("/{id}", func() {
 | 
				
			||||||
					m.Get("", repo.WebHooksEdit)
 | 
										m.Get("", repo.WebHooksEdit)
 | 
				
			||||||
					m.Post("/test", repo.TestWebhook)
 | 
										m.Post("/test", repo.TestWebhook)
 | 
				
			||||||
					m.Post("/replay/{uuid}", repo.ReplayWebhook)
 | 
										m.Post("/replay/{uuid}", repo.ReplayWebhook)
 | 
				
			||||||
				})
 | 
									})
 | 
				
			||||||
				m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
 | 
									m.Post("/gitea/{id}", web.Bind(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
 | 
				
			||||||
				m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
 | 
									m.Post("/gogs/{id}", web.Bind(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
 | 
				
			||||||
				m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
 | 
									m.Post("/slack/{id}", web.Bind(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
 | 
				
			||||||
				m.Post("/discord/{id}", bindIgnErr(forms.NewDiscordHookForm{}), repo.DiscordHooksEditPost)
 | 
									m.Post("/discord/{id}", web.Bind(forms.NewDiscordHookForm{}), repo.DiscordHooksEditPost)
 | 
				
			||||||
				m.Post("/dingtalk/{id}", bindIgnErr(forms.NewDingtalkHookForm{}), repo.DingtalkHooksEditPost)
 | 
									m.Post("/dingtalk/{id}", web.Bind(forms.NewDingtalkHookForm{}), repo.DingtalkHooksEditPost)
 | 
				
			||||||
				m.Post("/telegram/{id}", bindIgnErr(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost)
 | 
									m.Post("/telegram/{id}", web.Bind(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost)
 | 
				
			||||||
				m.Post("/matrix/{id}", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost)
 | 
									m.Post("/matrix/{id}", web.Bind(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost)
 | 
				
			||||||
				m.Post("/msteams/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost)
 | 
									m.Post("/msteams/{id}", web.Bind(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost)
 | 
				
			||||||
				m.Post("/feishu/{id}", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost)
 | 
									m.Post("/feishu/{id}", web.Bind(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost)
 | 
				
			||||||
				m.Post("/wechatwork/{id}", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost)
 | 
									m.Post("/wechatwork/{id}", web.Bind(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost)
 | 
				
			||||||
				m.Post("/packagist/{id}", bindIgnErr(forms.NewPackagistHookForm{}), repo.PackagistHooksEditPost)
 | 
									m.Post("/packagist/{id}", web.Bind(forms.NewPackagistHookForm{}), repo.PackagistHooksEditPost)
 | 
				
			||||||
			}, webhooksEnabled)
 | 
								}, webhooksEnabled)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			m.Group("/keys", func() {
 | 
								m.Group("/keys", func() {
 | 
				
			||||||
				m.Combo("").Get(repo.DeployKeys).
 | 
									m.Combo("").Get(repo.DeployKeys).
 | 
				
			||||||
					Post(bindIgnErr(forms.AddKeyForm{}), repo.DeployKeysPost)
 | 
										Post(web.Bind(forms.AddKeyForm{}), repo.DeployKeysPost)
 | 
				
			||||||
				m.Post("/delete", repo.DeleteDeployKey)
 | 
									m.Post("/delete", repo.DeleteDeployKey)
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -952,7 +950,7 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
		m.Get("/compare", repo.MustBeNotEmpty, reqRepoCodeReader, repo.SetEditorconfigIfExists, ignSignIn, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.CompareDiff)
 | 
							m.Get("/compare", repo.MustBeNotEmpty, reqRepoCodeReader, repo.SetEditorconfigIfExists, ignSignIn, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.CompareDiff)
 | 
				
			||||||
		m.Combo("/compare/*", repo.MustBeNotEmpty, reqRepoCodeReader, repo.SetEditorconfigIfExists).
 | 
							m.Combo("/compare/*", repo.MustBeNotEmpty, reqRepoCodeReader, repo.SetEditorconfigIfExists).
 | 
				
			||||||
			Get(ignSignIn, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.CompareDiff).
 | 
								Get(ignSignIn, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.CompareDiff).
 | 
				
			||||||
			Post(reqSignIn, context.RepoMustNotBeArchived(), reqRepoPullsReader, repo.MustAllowPulls, bindIgnErr(forms.CreateIssueForm{}), repo.SetWhitespaceBehavior, repo.CompareAndPullRequestPost)
 | 
								Post(reqSignIn, context.RepoMustNotBeArchived(), reqRepoPullsReader, repo.MustAllowPulls, web.Bind(forms.CreateIssueForm{}), repo.SetWhitespaceBehavior, repo.CompareAndPullRequestPost)
 | 
				
			||||||
		m.Group("/{type:issues|pulls}", func() {
 | 
							m.Group("/{type:issues|pulls}", func() {
 | 
				
			||||||
			m.Group("/{index}", func() {
 | 
								m.Group("/{index}", func() {
 | 
				
			||||||
				m.Get("/info", repo.GetIssueInfo)
 | 
									m.Get("/info", repo.GetIssueInfo)
 | 
				
			||||||
@@ -965,7 +963,7 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
		m.Group("/issues", func() {
 | 
							m.Group("/issues", func() {
 | 
				
			||||||
			m.Group("/new", func() {
 | 
								m.Group("/new", func() {
 | 
				
			||||||
				m.Combo("").Get(context.RepoRef(), repo.NewIssue).
 | 
									m.Combo("").Get(context.RepoRef(), repo.NewIssue).
 | 
				
			||||||
					Post(bindIgnErr(forms.CreateIssueForm{}), repo.NewIssuePost)
 | 
										Post(web.Bind(forms.CreateIssueForm{}), repo.NewIssuePost)
 | 
				
			||||||
				m.Get("/choose", context.RepoRef(), repo.NewIssueChooseTemplate)
 | 
									m.Get("/choose", context.RepoRef(), repo.NewIssueChooseTemplate)
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
			m.Get("/search", repo.ListIssues)
 | 
								m.Get("/search", repo.ListIssues)
 | 
				
			||||||
@@ -976,7 +974,7 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
			m.Group("/{index}", func() {
 | 
								m.Group("/{index}", func() {
 | 
				
			||||||
				m.Post("/title", repo.UpdateIssueTitle)
 | 
									m.Post("/title", repo.UpdateIssueTitle)
 | 
				
			||||||
				m.Post("/content", repo.UpdateIssueContent)
 | 
									m.Post("/content", repo.UpdateIssueContent)
 | 
				
			||||||
				m.Post("/deadline", bindIgnErr(structs.EditDeadlineOption{}), repo.UpdateIssueDeadline)
 | 
									m.Post("/deadline", web.Bind(structs.EditDeadlineOption{}), repo.UpdateIssueDeadline)
 | 
				
			||||||
				m.Post("/watch", repo.IssueWatch)
 | 
									m.Post("/watch", repo.IssueWatch)
 | 
				
			||||||
				m.Post("/ref", repo.UpdateIssueRef)
 | 
									m.Post("/ref", repo.UpdateIssueRef)
 | 
				
			||||||
				m.Post("/viewed-files", repo.UpdateViewedFiles)
 | 
									m.Post("/viewed-files", repo.UpdateViewedFiles)
 | 
				
			||||||
@@ -984,17 +982,17 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
					m.Post("/add", repo.AddDependency)
 | 
										m.Post("/add", repo.AddDependency)
 | 
				
			||||||
					m.Post("/delete", repo.RemoveDependency)
 | 
										m.Post("/delete", repo.RemoveDependency)
 | 
				
			||||||
				})
 | 
									})
 | 
				
			||||||
				m.Combo("/comments").Post(repo.MustAllowUserComment, bindIgnErr(forms.CreateCommentForm{}), repo.NewComment)
 | 
									m.Combo("/comments").Post(repo.MustAllowUserComment, web.Bind(forms.CreateCommentForm{}), repo.NewComment)
 | 
				
			||||||
				m.Group("/times", func() {
 | 
									m.Group("/times", func() {
 | 
				
			||||||
					m.Post("/add", bindIgnErr(forms.AddTimeManuallyForm{}), repo.AddTimeManually)
 | 
										m.Post("/add", web.Bind(forms.AddTimeManuallyForm{}), repo.AddTimeManually)
 | 
				
			||||||
					m.Post("/{timeid}/delete", repo.DeleteTime)
 | 
										m.Post("/{timeid}/delete", repo.DeleteTime)
 | 
				
			||||||
					m.Group("/stopwatch", func() {
 | 
										m.Group("/stopwatch", func() {
 | 
				
			||||||
						m.Post("/toggle", repo.IssueStopwatch)
 | 
											m.Post("/toggle", repo.IssueStopwatch)
 | 
				
			||||||
						m.Post("/cancel", repo.CancelStopwatch)
 | 
											m.Post("/cancel", repo.CancelStopwatch)
 | 
				
			||||||
					})
 | 
										})
 | 
				
			||||||
				})
 | 
									})
 | 
				
			||||||
				m.Post("/reactions/{action}", bindIgnErr(forms.ReactionForm{}), repo.ChangeIssueReaction)
 | 
									m.Post("/reactions/{action}", web.Bind(forms.ReactionForm{}), repo.ChangeIssueReaction)
 | 
				
			||||||
				m.Post("/lock", reqRepoIssueWriter, bindIgnErr(forms.IssueLockForm{}), repo.LockIssue)
 | 
									m.Post("/lock", reqRepoIssueWriter, web.Bind(forms.IssueLockForm{}), repo.LockIssue)
 | 
				
			||||||
				m.Post("/unlock", reqRepoIssueWriter, repo.UnlockIssue)
 | 
									m.Post("/unlock", reqRepoIssueWriter, repo.UnlockIssue)
 | 
				
			||||||
				m.Post("/delete", reqRepoAdmin, repo.DeleteIssue)
 | 
									m.Post("/delete", reqRepoAdmin, repo.DeleteIssue)
 | 
				
			||||||
			}, context.RepoMustNotBeArchived())
 | 
								}, context.RepoMustNotBeArchived())
 | 
				
			||||||
@@ -1011,7 +1009,7 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
			m.Post("/projects", reqRepoIssuesOrPullsWriter, reqRepoProjectsReader, repo.UpdateIssueProject)
 | 
								m.Post("/projects", reqRepoIssuesOrPullsWriter, reqRepoProjectsReader, repo.UpdateIssueProject)
 | 
				
			||||||
			m.Post("/assignee", reqRepoIssuesOrPullsWriter, repo.UpdateIssueAssignee)
 | 
								m.Post("/assignee", reqRepoIssuesOrPullsWriter, repo.UpdateIssueAssignee)
 | 
				
			||||||
			m.Post("/request_review", reqRepoIssuesOrPullsReader, repo.UpdatePullReviewRequest)
 | 
								m.Post("/request_review", reqRepoIssuesOrPullsReader, repo.UpdatePullReviewRequest)
 | 
				
			||||||
			m.Post("/dismiss_review", reqRepoAdmin, bindIgnErr(forms.DismissReviewForm{}), repo.DismissReview)
 | 
								m.Post("/dismiss_review", reqRepoAdmin, web.Bind(forms.DismissReviewForm{}), repo.DismissReview)
 | 
				
			||||||
			m.Post("/status", reqRepoIssuesOrPullsWriter, repo.UpdateIssueStatus)
 | 
								m.Post("/status", reqRepoIssuesOrPullsWriter, repo.UpdateIssueStatus)
 | 
				
			||||||
			m.Post("/resolve_conversation", reqRepoIssuesOrPullsReader, repo.UpdateResolveConversation)
 | 
								m.Post("/resolve_conversation", reqRepoIssuesOrPullsReader, repo.UpdateResolveConversation)
 | 
				
			||||||
			m.Post("/attachments", repo.UploadIssueAttachment)
 | 
								m.Post("/attachments", repo.UploadIssueAttachment)
 | 
				
			||||||
@@ -1020,23 +1018,23 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
		m.Group("/comments/{id}", func() {
 | 
							m.Group("/comments/{id}", func() {
 | 
				
			||||||
			m.Post("", repo.UpdateCommentContent)
 | 
								m.Post("", repo.UpdateCommentContent)
 | 
				
			||||||
			m.Post("/delete", repo.DeleteComment)
 | 
								m.Post("/delete", repo.DeleteComment)
 | 
				
			||||||
			m.Post("/reactions/{action}", bindIgnErr(forms.ReactionForm{}), repo.ChangeCommentReaction)
 | 
								m.Post("/reactions/{action}", web.Bind(forms.ReactionForm{}), repo.ChangeCommentReaction)
 | 
				
			||||||
		}, context.RepoMustNotBeArchived())
 | 
							}, context.RepoMustNotBeArchived())
 | 
				
			||||||
		m.Group("/comments/{id}", func() {
 | 
							m.Group("/comments/{id}", func() {
 | 
				
			||||||
			m.Get("/attachments", repo.GetCommentAttachments)
 | 
								m.Get("/attachments", repo.GetCommentAttachments)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
		m.Post("/markdown", bindIgnErr(structs.MarkdownOption{}), misc.Markdown)
 | 
							m.Post("/markdown", web.Bind(structs.MarkdownOption{}), misc.Markdown)
 | 
				
			||||||
		m.Group("/labels", func() {
 | 
							m.Group("/labels", func() {
 | 
				
			||||||
			m.Post("/new", bindIgnErr(forms.CreateLabelForm{}), repo.NewLabel)
 | 
								m.Post("/new", web.Bind(forms.CreateLabelForm{}), repo.NewLabel)
 | 
				
			||||||
			m.Post("/edit", bindIgnErr(forms.CreateLabelForm{}), repo.UpdateLabel)
 | 
								m.Post("/edit", web.Bind(forms.CreateLabelForm{}), repo.UpdateLabel)
 | 
				
			||||||
			m.Post("/delete", repo.DeleteLabel)
 | 
								m.Post("/delete", repo.DeleteLabel)
 | 
				
			||||||
			m.Post("/initialize", bindIgnErr(forms.InitializeLabelsForm{}), repo.InitializeLabels)
 | 
								m.Post("/initialize", web.Bind(forms.InitializeLabelsForm{}), repo.InitializeLabels)
 | 
				
			||||||
		}, context.RepoMustNotBeArchived(), reqRepoIssuesOrPullsWriter, context.RepoRef())
 | 
							}, context.RepoMustNotBeArchived(), reqRepoIssuesOrPullsWriter, context.RepoRef())
 | 
				
			||||||
		m.Group("/milestones", func() {
 | 
							m.Group("/milestones", func() {
 | 
				
			||||||
			m.Combo("/new").Get(repo.NewMilestone).
 | 
								m.Combo("/new").Get(repo.NewMilestone).
 | 
				
			||||||
				Post(bindIgnErr(forms.CreateMilestoneForm{}), repo.NewMilestonePost)
 | 
									Post(web.Bind(forms.CreateMilestoneForm{}), repo.NewMilestonePost)
 | 
				
			||||||
			m.Get("/{id}/edit", repo.EditMilestone)
 | 
								m.Get("/{id}/edit", repo.EditMilestone)
 | 
				
			||||||
			m.Post("/{id}/edit", bindIgnErr(forms.CreateMilestoneForm{}), repo.EditMilestonePost)
 | 
								m.Post("/{id}/edit", web.Bind(forms.CreateMilestoneForm{}), repo.EditMilestonePost)
 | 
				
			||||||
			m.Post("/{id}/{action}", repo.ChangeMilestoneStatus)
 | 
								m.Post("/{id}/{action}", repo.ChangeMilestoneStatus)
 | 
				
			||||||
			m.Post("/delete", repo.DeleteMilestone)
 | 
								m.Post("/delete", repo.DeleteMilestone)
 | 
				
			||||||
		}, context.RepoMustNotBeArchived(), reqRepoIssuesOrPullsWriter, context.RepoRef())
 | 
							}, context.RepoMustNotBeArchived(), reqRepoIssuesOrPullsWriter, context.RepoRef())
 | 
				
			||||||
@@ -1047,23 +1045,23 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
		m.Group("", func() {
 | 
							m.Group("", func() {
 | 
				
			||||||
			m.Group("", func() {
 | 
								m.Group("", func() {
 | 
				
			||||||
				m.Combo("/_edit/*").Get(repo.EditFile).
 | 
									m.Combo("/_edit/*").Get(repo.EditFile).
 | 
				
			||||||
					Post(bindIgnErr(forms.EditRepoFileForm{}), repo.EditFilePost)
 | 
										Post(web.Bind(forms.EditRepoFileForm{}), repo.EditFilePost)
 | 
				
			||||||
				m.Combo("/_new/*").Get(repo.NewFile).
 | 
									m.Combo("/_new/*").Get(repo.NewFile).
 | 
				
			||||||
					Post(bindIgnErr(forms.EditRepoFileForm{}), repo.NewFilePost)
 | 
										Post(web.Bind(forms.EditRepoFileForm{}), repo.NewFilePost)
 | 
				
			||||||
				m.Post("/_preview/*", bindIgnErr(forms.EditPreviewDiffForm{}), repo.DiffPreviewPost)
 | 
									m.Post("/_preview/*", web.Bind(forms.EditPreviewDiffForm{}), repo.DiffPreviewPost)
 | 
				
			||||||
				m.Combo("/_delete/*").Get(repo.DeleteFile).
 | 
									m.Combo("/_delete/*").Get(repo.DeleteFile).
 | 
				
			||||||
					Post(bindIgnErr(forms.DeleteRepoFileForm{}), repo.DeleteFilePost)
 | 
										Post(web.Bind(forms.DeleteRepoFileForm{}), repo.DeleteFilePost)
 | 
				
			||||||
				m.Combo("/_upload/*", repo.MustBeAbleToUpload).
 | 
									m.Combo("/_upload/*", repo.MustBeAbleToUpload).
 | 
				
			||||||
					Get(repo.UploadFile).
 | 
										Get(repo.UploadFile).
 | 
				
			||||||
					Post(bindIgnErr(forms.UploadRepoFileForm{}), repo.UploadFilePost)
 | 
										Post(web.Bind(forms.UploadRepoFileForm{}), repo.UploadFilePost)
 | 
				
			||||||
				m.Combo("/_diffpatch/*").Get(repo.NewDiffPatch).
 | 
									m.Combo("/_diffpatch/*").Get(repo.NewDiffPatch).
 | 
				
			||||||
					Post(bindIgnErr(forms.EditRepoFileForm{}), repo.NewDiffPatchPost)
 | 
										Post(web.Bind(forms.EditRepoFileForm{}), repo.NewDiffPatchPost)
 | 
				
			||||||
				m.Combo("/_cherrypick/{sha:([a-f0-9]{7,40})}/*").Get(repo.CherryPick).
 | 
									m.Combo("/_cherrypick/{sha:([a-f0-9]{7,40})}/*").Get(repo.CherryPick).
 | 
				
			||||||
					Post(bindIgnErr(forms.CherryPickForm{}), repo.CherryPickPost)
 | 
										Post(web.Bind(forms.CherryPickForm{}), repo.CherryPickPost)
 | 
				
			||||||
			}, repo.MustBeEditable)
 | 
								}, repo.MustBeEditable)
 | 
				
			||||||
			m.Group("", func() {
 | 
								m.Group("", func() {
 | 
				
			||||||
				m.Post("/upload-file", repo.UploadFileToServer)
 | 
									m.Post("/upload-file", repo.UploadFileToServer)
 | 
				
			||||||
				m.Post("/upload-remove", bindIgnErr(forms.RemoveUploadFileForm{}), repo.RemoveUploadFileFromServer)
 | 
									m.Post("/upload-remove", web.Bind(forms.RemoveUploadFileForm{}), repo.RemoveUploadFileFromServer)
 | 
				
			||||||
			}, repo.MustBeEditable, repo.MustBeAbleToUpload)
 | 
								}, repo.MustBeEditable, repo.MustBeAbleToUpload)
 | 
				
			||||||
		}, context.RepoRef(), canEnableEditor, context.RepoMustNotBeArchived(), repo.MustBeNotEmpty)
 | 
							}, context.RepoRef(), canEnableEditor, context.RepoMustNotBeArchived(), repo.MustBeNotEmpty)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1072,7 +1070,7 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
				m.Post("/branch/*", context.RepoRefByType(context.RepoRefBranch), repo.CreateBranch)
 | 
									m.Post("/branch/*", context.RepoRefByType(context.RepoRefBranch), repo.CreateBranch)
 | 
				
			||||||
				m.Post("/tag/*", context.RepoRefByType(context.RepoRefTag), repo.CreateBranch)
 | 
									m.Post("/tag/*", context.RepoRefByType(context.RepoRefTag), repo.CreateBranch)
 | 
				
			||||||
				m.Post("/commit/*", context.RepoRefByType(context.RepoRefCommit), repo.CreateBranch)
 | 
									m.Post("/commit/*", context.RepoRefByType(context.RepoRefCommit), repo.CreateBranch)
 | 
				
			||||||
			}, bindIgnErr(forms.NewBranchForm{}))
 | 
								}, web.Bind(forms.NewBranchForm{}))
 | 
				
			||||||
			m.Post("/delete", repo.DeleteBranchPost)
 | 
								m.Post("/delete", repo.DeleteBranchPost)
 | 
				
			||||||
			m.Post("/restore", repo.RestoreBranchPost)
 | 
								m.Post("/restore", repo.RestoreBranchPost)
 | 
				
			||||||
		}, context.RepoMustNotBeArchived(), reqRepoCodeWriter, repo.MustBeNotEmpty)
 | 
							}, context.RepoMustNotBeArchived(), reqRepoCodeWriter, repo.MustBeNotEmpty)
 | 
				
			||||||
@@ -1090,7 +1088,7 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
		m.Get("/releases/attachments/{uuid}", repo.GetAttachment, repo.MustBeNotEmpty, reqRepoReleaseReader)
 | 
							m.Get("/releases/attachments/{uuid}", repo.GetAttachment, repo.MustBeNotEmpty, reqRepoReleaseReader)
 | 
				
			||||||
		m.Group("/releases", func() {
 | 
							m.Group("/releases", func() {
 | 
				
			||||||
			m.Get("/new", repo.NewRelease)
 | 
								m.Get("/new", repo.NewRelease)
 | 
				
			||||||
			m.Post("/new", bindIgnErr(forms.NewReleaseForm{}), repo.NewReleasePost)
 | 
								m.Post("/new", web.Bind(forms.NewReleaseForm{}), repo.NewReleasePost)
 | 
				
			||||||
			m.Post("/delete", repo.DeleteRelease)
 | 
								m.Post("/delete", repo.DeleteRelease)
 | 
				
			||||||
			m.Post("/attachments", repo.UploadReleaseAttachment)
 | 
								m.Post("/attachments", repo.UploadReleaseAttachment)
 | 
				
			||||||
			m.Post("/attachments/remove", repo.DeleteAttachment)
 | 
								m.Post("/attachments/remove", repo.DeleteAttachment)
 | 
				
			||||||
@@ -1099,7 +1097,7 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
			repo.MustBeNotEmpty, context.RepoMustNotBeArchived(), reqRepoCodeWriter, context.RepoRef())
 | 
								repo.MustBeNotEmpty, context.RepoMustNotBeArchived(), reqRepoCodeWriter, context.RepoRef())
 | 
				
			||||||
		m.Group("/releases", func() {
 | 
							m.Group("/releases", func() {
 | 
				
			||||||
			m.Get("/edit/*", repo.EditRelease)
 | 
								m.Get("/edit/*", repo.EditRelease)
 | 
				
			||||||
			m.Post("/edit/*", bindIgnErr(forms.EditReleaseForm{}), repo.EditReleasePost)
 | 
								m.Post("/edit/*", web.Bind(forms.EditReleaseForm{}), repo.EditReleasePost)
 | 
				
			||||||
		}, reqSignIn, repo.MustBeNotEmpty, context.RepoMustNotBeArchived(), reqRepoReleaseWriter, func(ctx *context.Context) {
 | 
							}, reqSignIn, repo.MustBeNotEmpty, context.RepoMustNotBeArchived(), reqRepoReleaseWriter, func(ctx *context.Context) {
 | 
				
			||||||
			var err error
 | 
								var err error
 | 
				
			||||||
			ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch)
 | 
								ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch)
 | 
				
			||||||
@@ -1148,17 +1146,17 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
			m.Get("/{id}", repo.ViewProject)
 | 
								m.Get("/{id}", repo.ViewProject)
 | 
				
			||||||
			m.Group("", func() {
 | 
								m.Group("", func() {
 | 
				
			||||||
				m.Get("/new", repo.NewProject)
 | 
									m.Get("/new", repo.NewProject)
 | 
				
			||||||
				m.Post("/new", bindIgnErr(forms.CreateProjectForm{}), repo.NewProjectPost)
 | 
									m.Post("/new", web.Bind(forms.CreateProjectForm{}), repo.NewProjectPost)
 | 
				
			||||||
				m.Group("/{id}", func() {
 | 
									m.Group("/{id}", func() {
 | 
				
			||||||
					m.Post("", bindIgnErr(forms.EditProjectBoardForm{}), repo.AddBoardToProjectPost)
 | 
										m.Post("", web.Bind(forms.EditProjectBoardForm{}), repo.AddBoardToProjectPost)
 | 
				
			||||||
					m.Post("/delete", repo.DeleteProject)
 | 
										m.Post("/delete", repo.DeleteProject)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					m.Get("/edit", repo.EditProject)
 | 
										m.Get("/edit", repo.EditProject)
 | 
				
			||||||
					m.Post("/edit", bindIgnErr(forms.CreateProjectForm{}), repo.EditProjectPost)
 | 
										m.Post("/edit", web.Bind(forms.CreateProjectForm{}), repo.EditProjectPost)
 | 
				
			||||||
					m.Post("/{action:open|close}", repo.ChangeProjectStatus)
 | 
										m.Post("/{action:open|close}", repo.ChangeProjectStatus)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					m.Group("/{boardID}", func() {
 | 
										m.Group("/{boardID}", func() {
 | 
				
			||||||
						m.Put("", bindIgnErr(forms.EditProjectBoardForm{}), repo.EditProjectBoard)
 | 
											m.Put("", web.Bind(forms.EditProjectBoardForm{}), repo.EditProjectBoard)
 | 
				
			||||||
						m.Delete("", repo.DeleteProjectBoard)
 | 
											m.Delete("", repo.DeleteProjectBoard)
 | 
				
			||||||
						m.Post("/default", repo.SetDefaultProjectBoard)
 | 
											m.Post("/default", repo.SetDefaultProjectBoard)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1174,14 +1172,14 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
				Post(context.RepoMustNotBeArchived(),
 | 
									Post(context.RepoMustNotBeArchived(),
 | 
				
			||||||
					reqSignIn,
 | 
										reqSignIn,
 | 
				
			||||||
					reqRepoWikiWriter,
 | 
										reqRepoWikiWriter,
 | 
				
			||||||
					bindIgnErr(forms.NewWikiForm{}),
 | 
										web.Bind(forms.NewWikiForm{}),
 | 
				
			||||||
					repo.WikiPost)
 | 
										repo.WikiPost)
 | 
				
			||||||
			m.Combo("/*").
 | 
								m.Combo("/*").
 | 
				
			||||||
				Get(repo.Wiki).
 | 
									Get(repo.Wiki).
 | 
				
			||||||
				Post(context.RepoMustNotBeArchived(),
 | 
									Post(context.RepoMustNotBeArchived(),
 | 
				
			||||||
					reqSignIn,
 | 
										reqSignIn,
 | 
				
			||||||
					reqRepoWikiWriter,
 | 
										reqRepoWikiWriter,
 | 
				
			||||||
					bindIgnErr(forms.NewWikiForm{}),
 | 
										web.Bind(forms.NewWikiForm{}),
 | 
				
			||||||
					repo.WikiPost)
 | 
										repo.WikiPost)
 | 
				
			||||||
			m.Get("/commit/{sha:[a-f0-9]{7,40}}", repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.Diff)
 | 
								m.Get("/commit/{sha:[a-f0-9]{7,40}}", repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.Diff)
 | 
				
			||||||
			m.Get("/commit/{sha:[a-f0-9]{7,40}}.{ext:patch|diff}", repo.RawDiff)
 | 
								m.Get("/commit/{sha:[a-f0-9]{7,40}}.{ext:patch|diff}", repo.RawDiff)
 | 
				
			||||||
@@ -1239,17 +1237,17 @@ func RegisterRoutes(m *web.Route) {
 | 
				
			|||||||
			m.Get(".diff", repo.DownloadPullDiff)
 | 
								m.Get(".diff", repo.DownloadPullDiff)
 | 
				
			||||||
			m.Get(".patch", repo.DownloadPullPatch)
 | 
								m.Get(".patch", repo.DownloadPullPatch)
 | 
				
			||||||
			m.Get("/commits", context.RepoRef(), repo.ViewPullCommits)
 | 
								m.Get("/commits", context.RepoRef(), repo.ViewPullCommits)
 | 
				
			||||||
			m.Post("/merge", context.RepoMustNotBeArchived(), bindIgnErr(forms.MergePullRequestForm{}), repo.MergePullRequest)
 | 
								m.Post("/merge", context.RepoMustNotBeArchived(), web.Bind(forms.MergePullRequestForm{}), repo.MergePullRequest)
 | 
				
			||||||
			m.Post("/cancel_auto_merge", context.RepoMustNotBeArchived(), repo.CancelAutoMergePullRequest)
 | 
								m.Post("/cancel_auto_merge", context.RepoMustNotBeArchived(), repo.CancelAutoMergePullRequest)
 | 
				
			||||||
			m.Post("/update", repo.UpdatePullRequest)
 | 
								m.Post("/update", repo.UpdatePullRequest)
 | 
				
			||||||
			m.Post("/set_allow_maintainer_edit", bindIgnErr(forms.UpdateAllowEditsForm{}), repo.SetAllowEdits)
 | 
								m.Post("/set_allow_maintainer_edit", web.Bind(forms.UpdateAllowEditsForm{}), repo.SetAllowEdits)
 | 
				
			||||||
			m.Post("/cleanup", context.RepoMustNotBeArchived(), context.RepoRef(), repo.CleanUpPullRequest)
 | 
								m.Post("/cleanup", context.RepoMustNotBeArchived(), context.RepoRef(), repo.CleanUpPullRequest)
 | 
				
			||||||
			m.Group("/files", func() {
 | 
								m.Group("/files", func() {
 | 
				
			||||||
				m.Get("", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.ViewPullFiles)
 | 
									m.Get("", context.RepoRef(), repo.SetEditorconfigIfExists, repo.SetDiffViewStyle, repo.SetWhitespaceBehavior, repo.ViewPullFiles)
 | 
				
			||||||
				m.Group("/reviews", func() {
 | 
									m.Group("/reviews", func() {
 | 
				
			||||||
					m.Get("/new_comment", repo.RenderNewCodeCommentForm)
 | 
										m.Get("/new_comment", repo.RenderNewCodeCommentForm)
 | 
				
			||||||
					m.Post("/comments", bindIgnErr(forms.CodeCommentForm{}), repo.CreateCodeComment)
 | 
										m.Post("/comments", web.Bind(forms.CodeCommentForm{}), repo.CreateCodeComment)
 | 
				
			||||||
					m.Post("/submit", bindIgnErr(forms.SubmitReviewForm{}), repo.SubmitReview)
 | 
										m.Post("/submit", web.Bind(forms.SubmitReviewForm{}), repo.SubmitReview)
 | 
				
			||||||
				}, context.RepoMustNotBeArchived())
 | 
									}, context.RepoMustNotBeArchived())
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
		}, repo.MustAllowPulls)
 | 
							}, repo.MustAllowPulls)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user