loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Move some files under repo/setting (#25585)

There are too many files under `routers/web/repo` and the file
`routers/web/repo/setting.go` is too big.
This PR move all setting related routers' body functions under
`routers/web/repo/setting` and also split `routers/web/repo/setting.go`

authored by

Lunny Xiao and committed by
GitHub
aab7cb67 cea94016

+560 -478
+1 -1
routers/web/repo/lfs.go routers/web/repo/setting/lfs.go
··· 1 1 // Copyright 2019 The Gitea Authors. All rights reserved. 2 2 // SPDX-License-Identifier: MIT 3 3 4 - package repo 4 + package setting 5 5 6 6 import ( 7 7 "bytes"
+1 -402
routers/web/repo/setting.go routers/web/repo/setting/setting.go
··· 2 2 // Copyright 2018 The Gitea Authors. All rights reserved. 3 3 // SPDX-License-Identifier: MIT 4 4 5 - package repo 5 + package setting 6 6 7 7 import ( 8 - "errors" 9 8 "fmt" 10 - "io" 11 9 "net/http" 12 10 "strconv" 13 11 "strings" 14 12 "time" 15 13 16 14 "code.gitea.io/gitea/models" 17 - asymkey_model "code.gitea.io/gitea/models/asymkey" 18 15 "code.gitea.io/gitea/models/db" 19 16 "code.gitea.io/gitea/models/organization" 20 - "code.gitea.io/gitea/models/perm" 21 17 repo_model "code.gitea.io/gitea/models/repo" 22 18 unit_model "code.gitea.io/gitea/models/unit" 23 19 user_model "code.gitea.io/gitea/models/user" ··· 32 28 repo_module "code.gitea.io/gitea/modules/repository" 33 29 "code.gitea.io/gitea/modules/setting" 34 30 "code.gitea.io/gitea/modules/structs" 35 - "code.gitea.io/gitea/modules/typesniffer" 36 31 "code.gitea.io/gitea/modules/util" 37 32 "code.gitea.io/gitea/modules/validation" 38 33 "code.gitea.io/gitea/modules/web" 39 - "code.gitea.io/gitea/routers/utils" 40 34 asymkey_service "code.gitea.io/gitea/services/asymkey" 41 35 "code.gitea.io/gitea/services/forms" 42 - "code.gitea.io/gitea/services/mailer" 43 36 "code.gitea.io/gitea/services/migrations" 44 37 mirror_service "code.gitea.io/gitea/services/mirror" 45 - org_service "code.gitea.io/gitea/services/org" 46 38 repo_service "code.gitea.io/gitea/services/repository" 47 39 wiki_service "code.gitea.io/gitea/services/wiki" 48 40 ) ··· 51 43 tplSettingsOptions base.TplName = "repo/settings/options" 52 44 tplCollaboration base.TplName = "repo/settings/collaboration" 53 45 tplBranches base.TplName = "repo/settings/branches" 54 - tplTags base.TplName = "repo/settings/tags" 55 46 tplGithooks base.TplName = "repo/settings/githooks" 56 47 tplGithookEdit base.TplName = "repo/settings/githook_edit" 57 48 tplDeployKeys base.TplName = "repo/settings/deploy_keys" ··· 893 884 return 894 885 } 895 886 ctx.RenderWithErr(ctx.Tr("repo.mirror_address_url_invalid"), tplSettingsOptions, form) 896 - } 897 - 898 - // Collaboration render a repository's collaboration page 899 - func Collaboration(ctx *context.Context) { 900 - ctx.Data["Title"] = ctx.Tr("repo.settings.collaboration") 901 - ctx.Data["PageIsSettingsCollaboration"] = true 902 - 903 - users, err := repo_model.GetCollaborators(ctx, ctx.Repo.Repository.ID, db.ListOptions{}) 904 - if err != nil { 905 - ctx.ServerError("GetCollaborators", err) 906 - return 907 - } 908 - ctx.Data["Collaborators"] = users 909 - 910 - teams, err := organization.GetRepoTeams(ctx, ctx.Repo.Repository) 911 - if err != nil { 912 - ctx.ServerError("GetRepoTeams", err) 913 - return 914 - } 915 - ctx.Data["Teams"] = teams 916 - ctx.Data["Repo"] = ctx.Repo.Repository 917 - ctx.Data["OrgID"] = ctx.Repo.Repository.OwnerID 918 - ctx.Data["OrgName"] = ctx.Repo.Repository.OwnerName 919 - ctx.Data["Org"] = ctx.Repo.Repository.Owner 920 - ctx.Data["Units"] = unit_model.Units 921 - 922 - ctx.HTML(http.StatusOK, tplCollaboration) 923 - } 924 - 925 - // CollaborationPost response for actions for a collaboration of a repository 926 - func CollaborationPost(ctx *context.Context) { 927 - name := utils.RemoveUsernameParameterSuffix(strings.ToLower(ctx.FormString("collaborator"))) 928 - if len(name) == 0 || ctx.Repo.Owner.LowerName == name { 929 - ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 930 - return 931 - } 932 - 933 - u, err := user_model.GetUserByName(ctx, name) 934 - if err != nil { 935 - if user_model.IsErrUserNotExist(err) { 936 - ctx.Flash.Error(ctx.Tr("form.user_not_exist")) 937 - ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 938 - } else { 939 - ctx.ServerError("GetUserByName", err) 940 - } 941 - return 942 - } 943 - 944 - if !u.IsActive { 945 - ctx.Flash.Error(ctx.Tr("repo.settings.add_collaborator_inactive_user")) 946 - ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 947 - return 948 - } 949 - 950 - // Organization is not allowed to be added as a collaborator. 951 - if u.IsOrganization() { 952 - ctx.Flash.Error(ctx.Tr("repo.settings.org_not_allowed_to_be_collaborator")) 953 - ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 954 - return 955 - } 956 - 957 - if got, err := repo_model.IsCollaborator(ctx, ctx.Repo.Repository.ID, u.ID); err == nil && got { 958 - ctx.Flash.Error(ctx.Tr("repo.settings.add_collaborator_duplicate")) 959 - ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 960 - return 961 - } 962 - 963 - // find the owner team of the organization the repo belongs too and 964 - // check if the user we're trying to add is an owner. 965 - if ctx.Repo.Repository.Owner.IsOrganization() { 966 - if isOwner, err := organization.IsOrganizationOwner(ctx, ctx.Repo.Repository.Owner.ID, u.ID); err != nil { 967 - ctx.ServerError("IsOrganizationOwner", err) 968 - return 969 - } else if isOwner { 970 - ctx.Flash.Error(ctx.Tr("repo.settings.add_collaborator_owner")) 971 - ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 972 - return 973 - } 974 - } 975 - 976 - if err = repo_module.AddCollaborator(ctx, ctx.Repo.Repository, u); err != nil { 977 - ctx.ServerError("AddCollaborator", err) 978 - return 979 - } 980 - 981 - if setting.Service.EnableNotifyMail { 982 - mailer.SendCollaboratorMail(u, ctx.Doer, ctx.Repo.Repository) 983 - } 984 - 985 - ctx.Flash.Success(ctx.Tr("repo.settings.add_collaborator_success")) 986 - ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 987 - } 988 - 989 - // ChangeCollaborationAccessMode response for changing access of a collaboration 990 - func ChangeCollaborationAccessMode(ctx *context.Context) { 991 - if err := repo_model.ChangeCollaborationAccessMode( 992 - ctx, 993 - ctx.Repo.Repository, 994 - ctx.FormInt64("uid"), 995 - perm.AccessMode(ctx.FormInt("mode"))); err != nil { 996 - log.Error("ChangeCollaborationAccessMode: %v", err) 997 - } 998 - } 999 - 1000 - // DeleteCollaboration delete a collaboration for a repository 1001 - func DeleteCollaboration(ctx *context.Context) { 1002 - if err := models.DeleteCollaboration(ctx.Repo.Repository, ctx.FormInt64("id")); err != nil { 1003 - ctx.Flash.Error("DeleteCollaboration: " + err.Error()) 1004 - } else { 1005 - ctx.Flash.Success(ctx.Tr("repo.settings.remove_collaborator_success")) 1006 - } 1007 - 1008 - ctx.JSON(http.StatusOK, map[string]interface{}{ 1009 - "redirect": ctx.Repo.RepoLink + "/settings/collaboration", 1010 - }) 1011 - } 1012 - 1013 - // AddTeamPost response for adding a team to a repository 1014 - func AddTeamPost(ctx *context.Context) { 1015 - if !ctx.Repo.Owner.RepoAdminChangeTeamAccess && !ctx.Repo.IsOwner() { 1016 - ctx.Flash.Error(ctx.Tr("repo.settings.change_team_access_not_allowed")) 1017 - ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 1018 - return 1019 - } 1020 - 1021 - name := utils.RemoveUsernameParameterSuffix(strings.ToLower(ctx.FormString("team"))) 1022 - if len(name) == 0 { 1023 - ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 1024 - return 1025 - } 1026 - 1027 - team, err := organization.OrgFromUser(ctx.Repo.Owner).GetTeam(ctx, name) 1028 - if err != nil { 1029 - if organization.IsErrTeamNotExist(err) { 1030 - ctx.Flash.Error(ctx.Tr("form.team_not_exist")) 1031 - ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 1032 - } else { 1033 - ctx.ServerError("GetTeam", err) 1034 - } 1035 - return 1036 - } 1037 - 1038 - if team.OrgID != ctx.Repo.Repository.OwnerID { 1039 - ctx.Flash.Error(ctx.Tr("repo.settings.team_not_in_organization")) 1040 - ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 1041 - return 1042 - } 1043 - 1044 - if organization.HasTeamRepo(ctx, ctx.Repo.Repository.OwnerID, team.ID, ctx.Repo.Repository.ID) { 1045 - ctx.Flash.Error(ctx.Tr("repo.settings.add_team_duplicate")) 1046 - ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 1047 - return 1048 - } 1049 - 1050 - if err = org_service.TeamAddRepository(team, ctx.Repo.Repository); err != nil { 1051 - ctx.ServerError("TeamAddRepository", err) 1052 - return 1053 - } 1054 - 1055 - ctx.Flash.Success(ctx.Tr("repo.settings.add_team_success")) 1056 - ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 1057 - } 1058 - 1059 - // DeleteTeam response for deleting a team from a repository 1060 - func DeleteTeam(ctx *context.Context) { 1061 - if !ctx.Repo.Owner.RepoAdminChangeTeamAccess && !ctx.Repo.IsOwner() { 1062 - ctx.Flash.Error(ctx.Tr("repo.settings.change_team_access_not_allowed")) 1063 - ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 1064 - return 1065 - } 1066 - 1067 - team, err := organization.GetTeamByID(ctx, ctx.FormInt64("id")) 1068 - if err != nil { 1069 - ctx.ServerError("GetTeamByID", err) 1070 - return 1071 - } 1072 - 1073 - if err = models.RemoveRepository(team, ctx.Repo.Repository.ID); err != nil { 1074 - ctx.ServerError("team.RemoveRepositorys", err) 1075 - return 1076 - } 1077 - 1078 - ctx.Flash.Success(ctx.Tr("repo.settings.remove_team_success")) 1079 - ctx.JSON(http.StatusOK, map[string]interface{}{ 1080 - "redirect": ctx.Repo.RepoLink + "/settings/collaboration", 1081 - }) 1082 - } 1083 - 1084 - // GitHooks hooks of a repository 1085 - func GitHooks(ctx *context.Context) { 1086 - ctx.Data["Title"] = ctx.Tr("repo.settings.githooks") 1087 - ctx.Data["PageIsSettingsGitHooks"] = true 1088 - 1089 - hooks, err := ctx.Repo.GitRepo.Hooks() 1090 - if err != nil { 1091 - ctx.ServerError("Hooks", err) 1092 - return 1093 - } 1094 - ctx.Data["Hooks"] = hooks 1095 - 1096 - ctx.HTML(http.StatusOK, tplGithooks) 1097 - } 1098 - 1099 - // GitHooksEdit render for editing a hook of repository page 1100 - func GitHooksEdit(ctx *context.Context) { 1101 - ctx.Data["Title"] = ctx.Tr("repo.settings.githooks") 1102 - ctx.Data["PageIsSettingsGitHooks"] = true 1103 - 1104 - name := ctx.Params(":name") 1105 - hook, err := ctx.Repo.GitRepo.GetHook(name) 1106 - if err != nil { 1107 - if err == git.ErrNotValidHook { 1108 - ctx.NotFound("GetHook", err) 1109 - } else { 1110 - ctx.ServerError("GetHook", err) 1111 - } 1112 - return 1113 - } 1114 - ctx.Data["Hook"] = hook 1115 - ctx.HTML(http.StatusOK, tplGithookEdit) 1116 - } 1117 - 1118 - // GitHooksEditPost response for editing a git hook of a repository 1119 - func GitHooksEditPost(ctx *context.Context) { 1120 - name := ctx.Params(":name") 1121 - hook, err := ctx.Repo.GitRepo.GetHook(name) 1122 - if err != nil { 1123 - if err == git.ErrNotValidHook { 1124 - ctx.NotFound("GetHook", err) 1125 - } else { 1126 - ctx.ServerError("GetHook", err) 1127 - } 1128 - return 1129 - } 1130 - hook.Content = ctx.FormString("content") 1131 - if err = hook.Update(); err != nil { 1132 - ctx.ServerError("hook.Update", err) 1133 - return 1134 - } 1135 - ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks/git") 1136 - } 1137 - 1138 - // DeployKeys render the deploy keys list of a repository page 1139 - func DeployKeys(ctx *context.Context) { 1140 - ctx.Data["Title"] = ctx.Tr("repo.settings.deploy_keys") + " / " + ctx.Tr("secrets.secrets") 1141 - ctx.Data["PageIsSettingsKeys"] = true 1142 - ctx.Data["DisableSSH"] = setting.SSH.Disabled 1143 - 1144 - keys, err := asymkey_model.ListDeployKeys(ctx, &asymkey_model.ListDeployKeysOptions{RepoID: ctx.Repo.Repository.ID}) 1145 - if err != nil { 1146 - ctx.ServerError("ListDeployKeys", err) 1147 - return 1148 - } 1149 - ctx.Data["Deploykeys"] = keys 1150 - 1151 - ctx.HTML(http.StatusOK, tplDeployKeys) 1152 - } 1153 - 1154 - // DeployKeysPost response for adding a deploy key of a repository 1155 - func DeployKeysPost(ctx *context.Context) { 1156 - form := web.GetForm(ctx).(*forms.AddKeyForm) 1157 - ctx.Data["Title"] = ctx.Tr("repo.settings.deploy_keys") 1158 - ctx.Data["PageIsSettingsKeys"] = true 1159 - ctx.Data["DisableSSH"] = setting.SSH.Disabled 1160 - 1161 - keys, err := asymkey_model.ListDeployKeys(ctx, &asymkey_model.ListDeployKeysOptions{RepoID: ctx.Repo.Repository.ID}) 1162 - if err != nil { 1163 - ctx.ServerError("ListDeployKeys", err) 1164 - return 1165 - } 1166 - ctx.Data["Deploykeys"] = keys 1167 - 1168 - if ctx.HasError() { 1169 - ctx.HTML(http.StatusOK, tplDeployKeys) 1170 - return 1171 - } 1172 - 1173 - content, err := asymkey_model.CheckPublicKeyString(form.Content) 1174 - if err != nil { 1175 - if db.IsErrSSHDisabled(err) { 1176 - ctx.Flash.Info(ctx.Tr("settings.ssh_disabled")) 1177 - } else if asymkey_model.IsErrKeyUnableVerify(err) { 1178 - ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key")) 1179 - } else if err == asymkey_model.ErrKeyIsPrivate { 1180 - ctx.Data["HasError"] = true 1181 - ctx.Data["Err_Content"] = true 1182 - ctx.Flash.Error(ctx.Tr("form.must_use_public_key")) 1183 - } else { 1184 - ctx.Data["HasError"] = true 1185 - ctx.Data["Err_Content"] = true 1186 - ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error())) 1187 - } 1188 - ctx.Redirect(ctx.Repo.RepoLink + "/settings/keys") 1189 - return 1190 - } 1191 - 1192 - key, err := asymkey_model.AddDeployKey(ctx.Repo.Repository.ID, form.Title, content, !form.IsWritable) 1193 - if err != nil { 1194 - ctx.Data["HasError"] = true 1195 - switch { 1196 - case asymkey_model.IsErrDeployKeyAlreadyExist(err): 1197 - ctx.Data["Err_Content"] = true 1198 - ctx.RenderWithErr(ctx.Tr("repo.settings.key_been_used"), tplDeployKeys, &form) 1199 - case asymkey_model.IsErrKeyAlreadyExist(err): 1200 - ctx.Data["Err_Content"] = true 1201 - ctx.RenderWithErr(ctx.Tr("settings.ssh_key_been_used"), tplDeployKeys, &form) 1202 - case asymkey_model.IsErrKeyNameAlreadyUsed(err): 1203 - ctx.Data["Err_Title"] = true 1204 - ctx.RenderWithErr(ctx.Tr("repo.settings.key_name_used"), tplDeployKeys, &form) 1205 - case asymkey_model.IsErrDeployKeyNameAlreadyUsed(err): 1206 - ctx.Data["Err_Title"] = true 1207 - ctx.RenderWithErr(ctx.Tr("repo.settings.key_name_used"), tplDeployKeys, &form) 1208 - default: 1209 - ctx.ServerError("AddDeployKey", err) 1210 - } 1211 - return 1212 - } 1213 - 1214 - log.Trace("Deploy key added: %d", ctx.Repo.Repository.ID) 1215 - ctx.Flash.Success(ctx.Tr("repo.settings.add_key_success", key.Name)) 1216 - ctx.Redirect(ctx.Repo.RepoLink + "/settings/keys") 1217 - } 1218 - 1219 - // DeleteDeployKey response for deleting a deploy key 1220 - func DeleteDeployKey(ctx *context.Context) { 1221 - if err := asymkey_service.DeleteDeployKey(ctx.Doer, ctx.FormInt64("id")); err != nil { 1222 - ctx.Flash.Error("DeleteDeployKey: " + err.Error()) 1223 - } else { 1224 - ctx.Flash.Success(ctx.Tr("repo.settings.deploy_key_deletion_success")) 1225 - } 1226 - 1227 - ctx.JSON(http.StatusOK, map[string]interface{}{ 1228 - "redirect": ctx.Repo.RepoLink + "/settings/keys", 1229 - }) 1230 - } 1231 - 1232 - // UpdateAvatarSetting update repo's avatar 1233 - func UpdateAvatarSetting(ctx *context.Context, form forms.AvatarForm) error { 1234 - ctxRepo := ctx.Repo.Repository 1235 - 1236 - if form.Avatar == nil { 1237 - // No avatar is uploaded and we not removing it here. 1238 - // No random avatar generated here. 1239 - // Just exit, no action. 1240 - if ctxRepo.CustomAvatarRelativePath() == "" { 1241 - log.Trace("No avatar was uploaded for repo: %d. Default icon will appear instead.", ctxRepo.ID) 1242 - } 1243 - return nil 1244 - } 1245 - 1246 - r, err := form.Avatar.Open() 1247 - if err != nil { 1248 - return fmt.Errorf("Avatar.Open: %w", err) 1249 - } 1250 - defer r.Close() 1251 - 1252 - if form.Avatar.Size > setting.Avatar.MaxFileSize { 1253 - return errors.New(ctx.Tr("settings.uploaded_avatar_is_too_big")) 1254 - } 1255 - 1256 - data, err := io.ReadAll(r) 1257 - if err != nil { 1258 - return fmt.Errorf("io.ReadAll: %w", err) 1259 - } 1260 - st := typesniffer.DetectContentType(data) 1261 - if !(st.IsImage() && !st.IsSvgImage()) { 1262 - return errors.New(ctx.Tr("settings.uploaded_avatar_not_a_image")) 1263 - } 1264 - if err = repo_service.UploadAvatar(ctx, ctxRepo, data); err != nil { 1265 - return fmt.Errorf("UploadAvatar: %w", err) 1266 - } 1267 - return nil 1268 - } 1269 - 1270 - // SettingsAvatar save new POSTed repository avatar 1271 - func SettingsAvatar(ctx *context.Context) { 1272 - form := web.GetForm(ctx).(*forms.AvatarForm) 1273 - form.Source = forms.AvatarLocal 1274 - if err := UpdateAvatarSetting(ctx, *form); err != nil { 1275 - ctx.Flash.Error(err.Error()) 1276 - } else { 1277 - ctx.Flash.Success(ctx.Tr("repo.settings.update_avatar_success")) 1278 - } 1279 - ctx.Redirect(ctx.Repo.RepoLink + "/settings") 1280 - } 1281 - 1282 - // SettingsDeleteAvatar delete repository avatar 1283 - func SettingsDeleteAvatar(ctx *context.Context) { 1284 - if err := repo_service.DeleteAvatar(ctx, ctx.Repo.Repository); err != nil { 1285 - ctx.Flash.Error(fmt.Sprintf("DeleteAvatar: %v", err)) 1286 - } 1287 - ctx.Redirect(ctx.Repo.RepoLink + "/settings") 1288 887 } 1289 888 1290 889 func selectPushMirrorByForm(ctx *context.Context, form *forms.RepoSettingForm, repo *repo_model.Repository) (*repo_model.PushMirror, error) {
+76
routers/web/repo/setting/avatar.go
··· 1 + // Copyright 2023 The Gitea Authors. All rights reserved. 2 + // SPDX-License-Identifier: MIT 3 + 4 + package setting 5 + 6 + import ( 7 + "errors" 8 + "fmt" 9 + "io" 10 + 11 + "code.gitea.io/gitea/modules/context" 12 + "code.gitea.io/gitea/modules/log" 13 + "code.gitea.io/gitea/modules/setting" 14 + "code.gitea.io/gitea/modules/typesniffer" 15 + "code.gitea.io/gitea/modules/web" 16 + "code.gitea.io/gitea/services/forms" 17 + repo_service "code.gitea.io/gitea/services/repository" 18 + ) 19 + 20 + // UpdateAvatarSetting update repo's avatar 21 + func UpdateAvatarSetting(ctx *context.Context, form forms.AvatarForm) error { 22 + ctxRepo := ctx.Repo.Repository 23 + 24 + if form.Avatar == nil { 25 + // No avatar is uploaded and we not removing it here. 26 + // No random avatar generated here. 27 + // Just exit, no action. 28 + if ctxRepo.CustomAvatarRelativePath() == "" { 29 + log.Trace("No avatar was uploaded for repo: %d. Default icon will appear instead.", ctxRepo.ID) 30 + } 31 + return nil 32 + } 33 + 34 + r, err := form.Avatar.Open() 35 + if err != nil { 36 + return fmt.Errorf("Avatar.Open: %w", err) 37 + } 38 + defer r.Close() 39 + 40 + if form.Avatar.Size > setting.Avatar.MaxFileSize { 41 + return errors.New(ctx.Tr("settings.uploaded_avatar_is_too_big")) 42 + } 43 + 44 + data, err := io.ReadAll(r) 45 + if err != nil { 46 + return fmt.Errorf("io.ReadAll: %w", err) 47 + } 48 + st := typesniffer.DetectContentType(data) 49 + if !(st.IsImage() && !st.IsSvgImage()) { 50 + return errors.New(ctx.Tr("settings.uploaded_avatar_not_a_image")) 51 + } 52 + if err = repo_service.UploadAvatar(ctx, ctxRepo, data); err != nil { 53 + return fmt.Errorf("UploadAvatar: %w", err) 54 + } 55 + return nil 56 + } 57 + 58 + // SettingsAvatar save new POSTed repository avatar 59 + func SettingsAvatar(ctx *context.Context) { 60 + form := web.GetForm(ctx).(*forms.AvatarForm) 61 + form.Source = forms.AvatarLocal 62 + if err := UpdateAvatarSetting(ctx, *form); err != nil { 63 + ctx.Flash.Error(err.Error()) 64 + } else { 65 + ctx.Flash.Success(ctx.Tr("repo.settings.update_avatar_success")) 66 + } 67 + ctx.Redirect(ctx.Repo.RepoLink + "/settings") 68 + } 69 + 70 + // SettingsDeleteAvatar delete repository avatar 71 + func SettingsDeleteAvatar(ctx *context.Context) { 72 + if err := repo_service.DeleteAvatar(ctx, ctx.Repo.Repository); err != nil { 73 + ctx.Flash.Error(fmt.Sprintf("DeleteAvatar: %v", err)) 74 + } 75 + ctx.Redirect(ctx.Repo.RepoLink + "/settings") 76 + }
+210
routers/web/repo/setting/collaboration.go
··· 1 + // Copyright 2023 The Gitea Authors. All rights reserved. 2 + // SPDX-License-Identifier: MIT 3 + 4 + package setting 5 + 6 + import ( 7 + "net/http" 8 + "strings" 9 + 10 + "code.gitea.io/gitea/models" 11 + "code.gitea.io/gitea/models/db" 12 + "code.gitea.io/gitea/models/organization" 13 + "code.gitea.io/gitea/models/perm" 14 + repo_model "code.gitea.io/gitea/models/repo" 15 + unit_model "code.gitea.io/gitea/models/unit" 16 + user_model "code.gitea.io/gitea/models/user" 17 + "code.gitea.io/gitea/modules/context" 18 + "code.gitea.io/gitea/modules/log" 19 + repo_module "code.gitea.io/gitea/modules/repository" 20 + "code.gitea.io/gitea/modules/setting" 21 + "code.gitea.io/gitea/routers/utils" 22 + "code.gitea.io/gitea/services/mailer" 23 + org_service "code.gitea.io/gitea/services/org" 24 + ) 25 + 26 + // Collaboration render a repository's collaboration page 27 + func Collaboration(ctx *context.Context) { 28 + ctx.Data["Title"] = ctx.Tr("repo.settings.collaboration") 29 + ctx.Data["PageIsSettingsCollaboration"] = true 30 + 31 + users, err := repo_model.GetCollaborators(ctx, ctx.Repo.Repository.ID, db.ListOptions{}) 32 + if err != nil { 33 + ctx.ServerError("GetCollaborators", err) 34 + return 35 + } 36 + ctx.Data["Collaborators"] = users 37 + 38 + teams, err := organization.GetRepoTeams(ctx, ctx.Repo.Repository) 39 + if err != nil { 40 + ctx.ServerError("GetRepoTeams", err) 41 + return 42 + } 43 + ctx.Data["Teams"] = teams 44 + ctx.Data["Repo"] = ctx.Repo.Repository 45 + ctx.Data["OrgID"] = ctx.Repo.Repository.OwnerID 46 + ctx.Data["OrgName"] = ctx.Repo.Repository.OwnerName 47 + ctx.Data["Org"] = ctx.Repo.Repository.Owner 48 + ctx.Data["Units"] = unit_model.Units 49 + 50 + ctx.HTML(http.StatusOK, tplCollaboration) 51 + } 52 + 53 + // CollaborationPost response for actions for a collaboration of a repository 54 + func CollaborationPost(ctx *context.Context) { 55 + name := utils.RemoveUsernameParameterSuffix(strings.ToLower(ctx.FormString("collaborator"))) 56 + if len(name) == 0 || ctx.Repo.Owner.LowerName == name { 57 + ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 58 + return 59 + } 60 + 61 + u, err := user_model.GetUserByName(ctx, name) 62 + if err != nil { 63 + if user_model.IsErrUserNotExist(err) { 64 + ctx.Flash.Error(ctx.Tr("form.user_not_exist")) 65 + ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 66 + } else { 67 + ctx.ServerError("GetUserByName", err) 68 + } 69 + return 70 + } 71 + 72 + if !u.IsActive { 73 + ctx.Flash.Error(ctx.Tr("repo.settings.add_collaborator_inactive_user")) 74 + ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 75 + return 76 + } 77 + 78 + // Organization is not allowed to be added as a collaborator. 79 + if u.IsOrganization() { 80 + ctx.Flash.Error(ctx.Tr("repo.settings.org_not_allowed_to_be_collaborator")) 81 + ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 82 + return 83 + } 84 + 85 + if got, err := repo_model.IsCollaborator(ctx, ctx.Repo.Repository.ID, u.ID); err == nil && got { 86 + ctx.Flash.Error(ctx.Tr("repo.settings.add_collaborator_duplicate")) 87 + ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 88 + return 89 + } 90 + 91 + // find the owner team of the organization the repo belongs too and 92 + // check if the user we're trying to add is an owner. 93 + if ctx.Repo.Repository.Owner.IsOrganization() { 94 + if isOwner, err := organization.IsOrganizationOwner(ctx, ctx.Repo.Repository.Owner.ID, u.ID); err != nil { 95 + ctx.ServerError("IsOrganizationOwner", err) 96 + return 97 + } else if isOwner { 98 + ctx.Flash.Error(ctx.Tr("repo.settings.add_collaborator_owner")) 99 + ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 100 + return 101 + } 102 + } 103 + 104 + if err = repo_module.AddCollaborator(ctx, ctx.Repo.Repository, u); err != nil { 105 + ctx.ServerError("AddCollaborator", err) 106 + return 107 + } 108 + 109 + if setting.Service.EnableNotifyMail { 110 + mailer.SendCollaboratorMail(u, ctx.Doer, ctx.Repo.Repository) 111 + } 112 + 113 + ctx.Flash.Success(ctx.Tr("repo.settings.add_collaborator_success")) 114 + ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath()) 115 + } 116 + 117 + // ChangeCollaborationAccessMode response for changing access of a collaboration 118 + func ChangeCollaborationAccessMode(ctx *context.Context) { 119 + if err := repo_model.ChangeCollaborationAccessMode( 120 + ctx, 121 + ctx.Repo.Repository, 122 + ctx.FormInt64("uid"), 123 + perm.AccessMode(ctx.FormInt("mode"))); err != nil { 124 + log.Error("ChangeCollaborationAccessMode: %v", err) 125 + } 126 + } 127 + 128 + // DeleteCollaboration delete a collaboration for a repository 129 + func DeleteCollaboration(ctx *context.Context) { 130 + if err := models.DeleteCollaboration(ctx.Repo.Repository, ctx.FormInt64("id")); err != nil { 131 + ctx.Flash.Error("DeleteCollaboration: " + err.Error()) 132 + } else { 133 + ctx.Flash.Success(ctx.Tr("repo.settings.remove_collaborator_success")) 134 + } 135 + 136 + ctx.JSON(http.StatusOK, map[string]interface{}{ 137 + "redirect": ctx.Repo.RepoLink + "/settings/collaboration", 138 + }) 139 + } 140 + 141 + // AddTeamPost response for adding a team to a repository 142 + func AddTeamPost(ctx *context.Context) { 143 + if !ctx.Repo.Owner.RepoAdminChangeTeamAccess && !ctx.Repo.IsOwner() { 144 + ctx.Flash.Error(ctx.Tr("repo.settings.change_team_access_not_allowed")) 145 + ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 146 + return 147 + } 148 + 149 + name := utils.RemoveUsernameParameterSuffix(strings.ToLower(ctx.FormString("team"))) 150 + if len(name) == 0 { 151 + ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 152 + return 153 + } 154 + 155 + team, err := organization.OrgFromUser(ctx.Repo.Owner).GetTeam(ctx, name) 156 + if err != nil { 157 + if organization.IsErrTeamNotExist(err) { 158 + ctx.Flash.Error(ctx.Tr("form.team_not_exist")) 159 + ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 160 + } else { 161 + ctx.ServerError("GetTeam", err) 162 + } 163 + return 164 + } 165 + 166 + if team.OrgID != ctx.Repo.Repository.OwnerID { 167 + ctx.Flash.Error(ctx.Tr("repo.settings.team_not_in_organization")) 168 + ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 169 + return 170 + } 171 + 172 + if organization.HasTeamRepo(ctx, ctx.Repo.Repository.OwnerID, team.ID, ctx.Repo.Repository.ID) { 173 + ctx.Flash.Error(ctx.Tr("repo.settings.add_team_duplicate")) 174 + ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 175 + return 176 + } 177 + 178 + if err = org_service.TeamAddRepository(team, ctx.Repo.Repository); err != nil { 179 + ctx.ServerError("TeamAddRepository", err) 180 + return 181 + } 182 + 183 + ctx.Flash.Success(ctx.Tr("repo.settings.add_team_success")) 184 + ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 185 + } 186 + 187 + // DeleteTeam response for deleting a team from a repository 188 + func DeleteTeam(ctx *context.Context) { 189 + if !ctx.Repo.Owner.RepoAdminChangeTeamAccess && !ctx.Repo.IsOwner() { 190 + ctx.Flash.Error(ctx.Tr("repo.settings.change_team_access_not_allowed")) 191 + ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration") 192 + return 193 + } 194 + 195 + team, err := organization.GetTeamByID(ctx, ctx.FormInt64("id")) 196 + if err != nil { 197 + ctx.ServerError("GetTeamByID", err) 198 + return 199 + } 200 + 201 + if err = models.RemoveRepository(team, ctx.Repo.Repository.ID); err != nil { 202 + ctx.ServerError("team.RemoveRepositorys", err) 203 + return 204 + } 205 + 206 + ctx.Flash.Success(ctx.Tr("repo.settings.remove_team_success")) 207 + ctx.JSON(http.StatusOK, map[string]interface{}{ 208 + "redirect": ctx.Repo.RepoLink + "/settings/collaboration", 209 + }) 210 + }
+111
routers/web/repo/setting/deploy_key.go
··· 1 + // Copyright 2023 The Gitea Authors. All rights reserved. 2 + // SPDX-License-Identifier: MIT 3 + 4 + package setting 5 + 6 + import ( 7 + "net/http" 8 + 9 + asymkey_model "code.gitea.io/gitea/models/asymkey" 10 + "code.gitea.io/gitea/models/db" 11 + "code.gitea.io/gitea/modules/context" 12 + "code.gitea.io/gitea/modules/log" 13 + "code.gitea.io/gitea/modules/setting" 14 + "code.gitea.io/gitea/modules/web" 15 + asymkey_service "code.gitea.io/gitea/services/asymkey" 16 + "code.gitea.io/gitea/services/forms" 17 + ) 18 + 19 + // DeployKeys render the deploy keys list of a repository page 20 + func DeployKeys(ctx *context.Context) { 21 + ctx.Data["Title"] = ctx.Tr("repo.settings.deploy_keys") + " / " + ctx.Tr("secrets.secrets") 22 + ctx.Data["PageIsSettingsKeys"] = true 23 + ctx.Data["DisableSSH"] = setting.SSH.Disabled 24 + 25 + keys, err := asymkey_model.ListDeployKeys(ctx, &asymkey_model.ListDeployKeysOptions{RepoID: ctx.Repo.Repository.ID}) 26 + if err != nil { 27 + ctx.ServerError("ListDeployKeys", err) 28 + return 29 + } 30 + ctx.Data["Deploykeys"] = keys 31 + 32 + ctx.HTML(http.StatusOK, tplDeployKeys) 33 + } 34 + 35 + // DeployKeysPost response for adding a deploy key of a repository 36 + func DeployKeysPost(ctx *context.Context) { 37 + form := web.GetForm(ctx).(*forms.AddKeyForm) 38 + ctx.Data["Title"] = ctx.Tr("repo.settings.deploy_keys") 39 + ctx.Data["PageIsSettingsKeys"] = true 40 + ctx.Data["DisableSSH"] = setting.SSH.Disabled 41 + 42 + keys, err := asymkey_model.ListDeployKeys(ctx, &asymkey_model.ListDeployKeysOptions{RepoID: ctx.Repo.Repository.ID}) 43 + if err != nil { 44 + ctx.ServerError("ListDeployKeys", err) 45 + return 46 + } 47 + ctx.Data["Deploykeys"] = keys 48 + 49 + if ctx.HasError() { 50 + ctx.HTML(http.StatusOK, tplDeployKeys) 51 + return 52 + } 53 + 54 + content, err := asymkey_model.CheckPublicKeyString(form.Content) 55 + if err != nil { 56 + if db.IsErrSSHDisabled(err) { 57 + ctx.Flash.Info(ctx.Tr("settings.ssh_disabled")) 58 + } else if asymkey_model.IsErrKeyUnableVerify(err) { 59 + ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key")) 60 + } else if err == asymkey_model.ErrKeyIsPrivate { 61 + ctx.Data["HasError"] = true 62 + ctx.Data["Err_Content"] = true 63 + ctx.Flash.Error(ctx.Tr("form.must_use_public_key")) 64 + } else { 65 + ctx.Data["HasError"] = true 66 + ctx.Data["Err_Content"] = true 67 + ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error())) 68 + } 69 + ctx.Redirect(ctx.Repo.RepoLink + "/settings/keys") 70 + return 71 + } 72 + 73 + key, err := asymkey_model.AddDeployKey(ctx.Repo.Repository.ID, form.Title, content, !form.IsWritable) 74 + if err != nil { 75 + ctx.Data["HasError"] = true 76 + switch { 77 + case asymkey_model.IsErrDeployKeyAlreadyExist(err): 78 + ctx.Data["Err_Content"] = true 79 + ctx.RenderWithErr(ctx.Tr("repo.settings.key_been_used"), tplDeployKeys, &form) 80 + case asymkey_model.IsErrKeyAlreadyExist(err): 81 + ctx.Data["Err_Content"] = true 82 + ctx.RenderWithErr(ctx.Tr("settings.ssh_key_been_used"), tplDeployKeys, &form) 83 + case asymkey_model.IsErrKeyNameAlreadyUsed(err): 84 + ctx.Data["Err_Title"] = true 85 + ctx.RenderWithErr(ctx.Tr("repo.settings.key_name_used"), tplDeployKeys, &form) 86 + case asymkey_model.IsErrDeployKeyNameAlreadyUsed(err): 87 + ctx.Data["Err_Title"] = true 88 + ctx.RenderWithErr(ctx.Tr("repo.settings.key_name_used"), tplDeployKeys, &form) 89 + default: 90 + ctx.ServerError("AddDeployKey", err) 91 + } 92 + return 93 + } 94 + 95 + log.Trace("Deploy key added: %d", ctx.Repo.Repository.ID) 96 + ctx.Flash.Success(ctx.Tr("repo.settings.add_key_success", key.Name)) 97 + ctx.Redirect(ctx.Repo.RepoLink + "/settings/keys") 98 + } 99 + 100 + // DeleteDeployKey response for deleting a deploy key 101 + func DeleteDeployKey(ctx *context.Context) { 102 + if err := asymkey_service.DeleteDeployKey(ctx.Doer, ctx.FormInt64("id")); err != nil { 103 + ctx.Flash.Error("DeleteDeployKey: " + err.Error()) 104 + } else { 105 + ctx.Flash.Success(ctx.Tr("repo.settings.deploy_key_deletion_success")) 106 + } 107 + 108 + ctx.JSON(http.StatusOK, map[string]interface{}{ 109 + "redirect": ctx.Repo.RepoLink + "/settings/keys", 110 + }) 111 + }
+65
routers/web/repo/setting/git_hooks.go
··· 1 + // Copyright 2023 The Gitea Authors. All rights reserved. 2 + // SPDX-License-Identifier: MIT 3 + 4 + package setting 5 + 6 + import ( 7 + "net/http" 8 + 9 + "code.gitea.io/gitea/modules/context" 10 + "code.gitea.io/gitea/modules/git" 11 + ) 12 + 13 + // GitHooks hooks of a repository 14 + func GitHooks(ctx *context.Context) { 15 + ctx.Data["Title"] = ctx.Tr("repo.settings.githooks") 16 + ctx.Data["PageIsSettingsGitHooks"] = true 17 + 18 + hooks, err := ctx.Repo.GitRepo.Hooks() 19 + if err != nil { 20 + ctx.ServerError("Hooks", err) 21 + return 22 + } 23 + ctx.Data["Hooks"] = hooks 24 + 25 + ctx.HTML(http.StatusOK, tplGithooks) 26 + } 27 + 28 + // GitHooksEdit render for editing a hook of repository page 29 + func GitHooksEdit(ctx *context.Context) { 30 + ctx.Data["Title"] = ctx.Tr("repo.settings.githooks") 31 + ctx.Data["PageIsSettingsGitHooks"] = true 32 + 33 + name := ctx.Params(":name") 34 + hook, err := ctx.Repo.GitRepo.GetHook(name) 35 + if err != nil { 36 + if err == git.ErrNotValidHook { 37 + ctx.NotFound("GetHook", err) 38 + } else { 39 + ctx.ServerError("GetHook", err) 40 + } 41 + return 42 + } 43 + ctx.Data["Hook"] = hook 44 + ctx.HTML(http.StatusOK, tplGithookEdit) 45 + } 46 + 47 + // GitHooksEditPost response for editing a git hook of a repository 48 + func GitHooksEditPost(ctx *context.Context) { 49 + name := ctx.Params(":name") 50 + hook, err := ctx.Repo.GitRepo.GetHook(name) 51 + if err != nil { 52 + if err == git.ErrNotValidHook { 53 + ctx.NotFound("GetHook", err) 54 + } else { 55 + ctx.ServerError("GetHook", err) 56 + } 57 + return 58 + } 59 + hook.Content = ctx.FormString("content") 60 + if err = hook.Update(); err != nil { 61 + ctx.ServerError("hook.Update", err) 62 + return 63 + } 64 + ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks/git") 65 + }
+17
routers/web/repo/setting/main_test.go
··· 1 + // Copyright 2017 The Gitea Authors. All rights reserved. 2 + // SPDX-License-Identifier: MIT 3 + 4 + package setting 5 + 6 + import ( 7 + "path/filepath" 8 + "testing" 9 + 10 + "code.gitea.io/gitea/models/unittest" 11 + ) 12 + 13 + func TestMain(m *testing.M) { 14 + unittest.MainTest(m, &unittest.TestOptions{ 15 + GiteaRootPath: filepath.Join("..", "..", "..", ".."), 16 + }) 17 + }
+1 -1
routers/web/repo/setting_protected_branch.go routers/web/repo/setting/protected_branch.go
··· 1 1 // Copyright 2017 The Gitea Authors. All rights reserved. 2 2 // SPDX-License-Identifier: MIT 3 3 4 - package repo 4 + package setting 5 5 6 6 import ( 7 7 "fmt"
+1 -1
routers/web/repo/settings_test.go routers/web/repo/setting/settings_test.go
··· 1 1 // Copyright 2017 The Gitea Authors. All rights reserved. 2 2 // SPDX-License-Identifier: MIT 3 3 4 - package repo 4 + package setting 5 5 6 6 import ( 7 7 "net/http"
+6 -2
routers/web/repo/tag.go routers/web/repo/setting/protected_tag.go
··· 1 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 2 // SPDX-License-Identifier: MIT 3 3 4 - package repo 4 + package setting 5 5 6 6 import ( 7 7 "fmt" ··· 19 19 "code.gitea.io/gitea/services/forms" 20 20 ) 21 21 22 + const ( 23 + tplTags base.TplName = "repo/settings/tags" 24 + ) 25 + 22 26 // Tags render the page to protect tags 23 - func Tags(ctx *context.Context) { 27 + func ProtectedTags(ctx *context.Context) { 24 28 if setTagsContext(ctx) != nil { 25 29 return 26 30 }
+1 -1
routers/web/repo/webhook.go routers/web/repo/setting/webhook.go
··· 2 2 // Copyright 2017 The Gitea Authors. All rights reserved. 3 3 // SPDX-License-Identifier: MIT 4 4 5 - package repo 5 + package setting 6 6 7 7 import ( 8 8 "errors"
+70 -70
routers/web/web.go
··· 279 279 } 280 280 281 281 addWebhookAddRoutes := func() { 282 - m.Get("/{type}/new", repo.WebhooksNew) 283 - m.Post("/gitea/new", web.Bind(forms.NewWebhookForm{}), repo.GiteaHooksNewPost) 284 - m.Post("/gogs/new", web.Bind(forms.NewGogshookForm{}), repo.GogsHooksNewPost) 285 - m.Post("/slack/new", web.Bind(forms.NewSlackHookForm{}), repo.SlackHooksNewPost) 286 - m.Post("/discord/new", web.Bind(forms.NewDiscordHookForm{}), repo.DiscordHooksNewPost) 287 - m.Post("/dingtalk/new", web.Bind(forms.NewDingtalkHookForm{}), repo.DingtalkHooksNewPost) 288 - m.Post("/telegram/new", web.Bind(forms.NewTelegramHookForm{}), repo.TelegramHooksNewPost) 289 - m.Post("/matrix/new", web.Bind(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost) 290 - m.Post("/msteams/new", web.Bind(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost) 291 - m.Post("/feishu/new", web.Bind(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost) 292 - m.Post("/wechatwork/new", web.Bind(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost) 293 - m.Post("/packagist/new", web.Bind(forms.NewPackagistHookForm{}), repo.PackagistHooksNewPost) 282 + m.Get("/{type}/new", repo_setting.WebhooksNew) 283 + m.Post("/gitea/new", web.Bind(forms.NewWebhookForm{}), repo_setting.GiteaHooksNewPost) 284 + m.Post("/gogs/new", web.Bind(forms.NewGogshookForm{}), repo_setting.GogsHooksNewPost) 285 + m.Post("/slack/new", web.Bind(forms.NewSlackHookForm{}), repo_setting.SlackHooksNewPost) 286 + m.Post("/discord/new", web.Bind(forms.NewDiscordHookForm{}), repo_setting.DiscordHooksNewPost) 287 + m.Post("/dingtalk/new", web.Bind(forms.NewDingtalkHookForm{}), repo_setting.DingtalkHooksNewPost) 288 + m.Post("/telegram/new", web.Bind(forms.NewTelegramHookForm{}), repo_setting.TelegramHooksNewPost) 289 + m.Post("/matrix/new", web.Bind(forms.NewMatrixHookForm{}), repo_setting.MatrixHooksNewPost) 290 + m.Post("/msteams/new", web.Bind(forms.NewMSTeamsHookForm{}), repo_setting.MSTeamsHooksNewPost) 291 + m.Post("/feishu/new", web.Bind(forms.NewFeishuHookForm{}), repo_setting.FeishuHooksNewPost) 292 + m.Post("/wechatwork/new", web.Bind(forms.NewWechatWorkHookForm{}), repo_setting.WechatworkHooksNewPost) 293 + m.Post("/packagist/new", web.Bind(forms.NewPackagistHookForm{}), repo_setting.PackagistHooksNewPost) 294 294 } 295 295 296 296 addWebhookEditRoutes := func() { 297 - m.Post("/gitea/{id}", web.Bind(forms.NewWebhookForm{}), repo.GiteaHooksEditPost) 298 - m.Post("/gogs/{id}", web.Bind(forms.NewGogshookForm{}), repo.GogsHooksEditPost) 299 - m.Post("/slack/{id}", web.Bind(forms.NewSlackHookForm{}), repo.SlackHooksEditPost) 300 - m.Post("/discord/{id}", web.Bind(forms.NewDiscordHookForm{}), repo.DiscordHooksEditPost) 301 - m.Post("/dingtalk/{id}", web.Bind(forms.NewDingtalkHookForm{}), repo.DingtalkHooksEditPost) 302 - m.Post("/telegram/{id}", web.Bind(forms.NewTelegramHookForm{}), repo.TelegramHooksEditPost) 303 - m.Post("/matrix/{id}", web.Bind(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost) 304 - m.Post("/msteams/{id}", web.Bind(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost) 305 - m.Post("/feishu/{id}", web.Bind(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost) 306 - m.Post("/wechatwork/{id}", web.Bind(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost) 307 - m.Post("/packagist/{id}", web.Bind(forms.NewPackagistHookForm{}), repo.PackagistHooksEditPost) 297 + m.Post("/gitea/{id}", web.Bind(forms.NewWebhookForm{}), repo_setting.GiteaHooksEditPost) 298 + m.Post("/gogs/{id}", web.Bind(forms.NewGogshookForm{}), repo_setting.GogsHooksEditPost) 299 + m.Post("/slack/{id}", web.Bind(forms.NewSlackHookForm{}), repo_setting.SlackHooksEditPost) 300 + m.Post("/discord/{id}", web.Bind(forms.NewDiscordHookForm{}), repo_setting.DiscordHooksEditPost) 301 + m.Post("/dingtalk/{id}", web.Bind(forms.NewDingtalkHookForm{}), repo_setting.DingtalkHooksEditPost) 302 + m.Post("/telegram/{id}", web.Bind(forms.NewTelegramHookForm{}), repo_setting.TelegramHooksEditPost) 303 + m.Post("/matrix/{id}", web.Bind(forms.NewMatrixHookForm{}), repo_setting.MatrixHooksEditPost) 304 + m.Post("/msteams/{id}", web.Bind(forms.NewMSTeamsHookForm{}), repo_setting.MSTeamsHooksEditPost) 305 + m.Post("/feishu/{id}", web.Bind(forms.NewFeishuHookForm{}), repo_setting.FeishuHooksEditPost) 306 + m.Post("/wechatwork/{id}", web.Bind(forms.NewWechatWorkHookForm{}), repo_setting.WechatworkHooksEditPost) 307 + m.Post("/packagist/{id}", web.Bind(forms.NewPackagistHookForm{}), repo_setting.PackagistHooksEditPost) 308 308 } 309 309 310 310 addSettingVariablesRoutes := func() { ··· 515 515 m.Post("/delete", user_setting.DeleteWebhook) 516 516 addWebhookAddRoutes() 517 517 m.Group("/{id}", func() { 518 - m.Get("", repo.WebHooksEdit) 519 - m.Post("/replay/{uuid}", repo.ReplayWebhook) 518 + m.Get("", repo_setting.WebHooksEdit) 519 + m.Post("/replay/{uuid}", repo_setting.ReplayWebhook) 520 520 }) 521 521 addWebhookEditRoutes() 522 522 }, webhooksEnabled) ··· 604 604 m.Get("", admin.DefaultOrSystemWebhooks) 605 605 m.Post("/delete", admin.DeleteDefaultOrSystemWebhook) 606 606 m.Group("/{id}", func() { 607 - m.Get("", repo.WebHooksEdit) 608 - m.Post("/replay/{uuid}", repo.ReplayWebhook) 607 + m.Get("", repo_setting.WebHooksEdit) 608 + m.Post("/replay/{uuid}", repo_setting.ReplayWebhook) 609 609 }) 610 610 addWebhookEditRoutes() 611 611 }, webhooksEnabled) ··· 752 752 m.Post("/delete", org.DeleteWebhook) 753 753 addWebhookAddRoutes() 754 754 m.Group("/{id}", func() { 755 - m.Get("", repo.WebHooksEdit) 756 - m.Post("/replay/{uuid}", repo.ReplayWebhook) 755 + m.Get("", repo_setting.WebHooksEdit) 756 + m.Post("/replay/{uuid}", repo_setting.ReplayWebhook) 757 757 }) 758 758 addWebhookEditRoutes() 759 759 }, webhooksEnabled) ··· 874 874 m.Group("/{username}/{reponame}", func() { 875 875 m.Group("/settings", func() { 876 876 m.Group("", func() { 877 - m.Combo("").Get(repo.Settings). 878 - Post(web.Bind(forms.RepoSettingForm{}), repo.SettingsPost) 879 - }, repo.SettingsCtxData) 880 - m.Post("/avatar", web.Bind(forms.AvatarForm{}), repo.SettingsAvatar) 881 - m.Post("/avatar/delete", repo.SettingsDeleteAvatar) 877 + m.Combo("").Get(repo_setting.Settings). 878 + Post(web.Bind(forms.RepoSettingForm{}), repo_setting.SettingsPost) 879 + }, repo_setting.SettingsCtxData) 880 + m.Post("/avatar", web.Bind(forms.AvatarForm{}), repo_setting.SettingsAvatar) 881 + m.Post("/avatar/delete", repo_setting.SettingsDeleteAvatar) 882 882 883 883 m.Group("/collaboration", func() { 884 - m.Combo("").Get(repo.Collaboration).Post(repo.CollaborationPost) 885 - m.Post("/access_mode", repo.ChangeCollaborationAccessMode) 886 - m.Post("/delete", repo.DeleteCollaboration) 884 + m.Combo("").Get(repo_setting.Collaboration).Post(repo_setting.CollaborationPost) 885 + m.Post("/access_mode", repo_setting.ChangeCollaborationAccessMode) 886 + m.Post("/delete", repo_setting.DeleteCollaboration) 887 887 m.Group("/team", func() { 888 - m.Post("", repo.AddTeamPost) 889 - m.Post("/delete", repo.DeleteTeam) 888 + m.Post("", repo_setting.AddTeamPost) 889 + m.Post("/delete", repo_setting.DeleteTeam) 890 890 }) 891 891 }) 892 892 893 893 m.Group("/branches", func() { 894 - m.Post("/", repo.SetDefaultBranchPost) 894 + m.Post("/", repo_setting.SetDefaultBranchPost) 895 895 }, repo.MustBeNotEmpty) 896 896 897 897 m.Group("/branches", func() { 898 - m.Get("/", repo.ProtectedBranchRules) 899 - m.Combo("/edit").Get(repo.SettingsProtectedBranch). 900 - Post(web.Bind(forms.ProtectBranchForm{}), context.RepoMustNotBeArchived(), repo.SettingsProtectedBranchPost) 901 - m.Post("/{id}/delete", repo.DeleteProtectedBranchRulePost) 898 + m.Get("/", repo_setting.ProtectedBranchRules) 899 + m.Combo("/edit").Get(repo_setting.SettingsProtectedBranch). 900 + Post(web.Bind(forms.ProtectBranchForm{}), context.RepoMustNotBeArchived(), repo_setting.SettingsProtectedBranchPost) 901 + m.Post("/{id}/delete", repo_setting.DeleteProtectedBranchRulePost) 902 902 }, repo.MustBeNotEmpty) 903 903 904 - m.Post("/rename_branch", web.Bind(forms.RenameBranchForm{}), context.RepoMustNotBeArchived(), repo.RenameBranchPost) 904 + m.Post("/rename_branch", web.Bind(forms.RenameBranchForm{}), context.RepoMustNotBeArchived(), repo_setting.RenameBranchPost) 905 905 906 906 m.Group("/tags", func() { 907 - m.Get("", repo.Tags) 908 - m.Post("", web.Bind(forms.ProtectTagForm{}), context.RepoMustNotBeArchived(), repo.NewProtectedTagPost) 909 - m.Post("/delete", context.RepoMustNotBeArchived(), repo.DeleteProtectedTagPost) 910 - m.Get("/{id}", repo.EditProtectedTag) 911 - m.Post("/{id}", web.Bind(forms.ProtectTagForm{}), context.RepoMustNotBeArchived(), repo.EditProtectedTagPost) 907 + m.Get("", repo_setting.ProtectedTags) 908 + m.Post("", web.Bind(forms.ProtectTagForm{}), context.RepoMustNotBeArchived(), repo_setting.NewProtectedTagPost) 909 + m.Post("/delete", context.RepoMustNotBeArchived(), repo_setting.DeleteProtectedTagPost) 910 + m.Get("/{id}", repo_setting.EditProtectedTag) 911 + m.Post("/{id}", web.Bind(forms.ProtectTagForm{}), context.RepoMustNotBeArchived(), repo_setting.EditProtectedTagPost) 912 912 }) 913 913 914 914 m.Group("/hooks/git", func() { 915 - m.Get("", repo.GitHooks) 916 - m.Combo("/{name}").Get(repo.GitHooksEdit). 917 - Post(repo.GitHooksEditPost) 915 + m.Get("", repo_setting.GitHooks) 916 + m.Combo("/{name}").Get(repo_setting.GitHooksEdit). 917 + Post(repo_setting.GitHooksEditPost) 918 918 }, context.GitHookService()) 919 919 920 920 m.Group("/hooks", func() { 921 - m.Get("", repo.Webhooks) 922 - m.Post("/delete", repo.DeleteWebhook) 921 + m.Get("", repo_setting.Webhooks) 922 + m.Post("/delete", repo_setting.DeleteWebhook) 923 923 addWebhookAddRoutes() 924 924 m.Group("/{id}", func() { 925 - m.Get("", repo.WebHooksEdit) 926 - m.Post("/test", repo.TestWebhook) 927 - m.Post("/replay/{uuid}", repo.ReplayWebhook) 925 + m.Get("", repo_setting.WebHooksEdit) 926 + m.Post("/test", repo_setting.TestWebhook) 927 + m.Post("/replay/{uuid}", repo_setting.ReplayWebhook) 928 928 }) 929 929 addWebhookEditRoutes() 930 930 }, webhooksEnabled) 931 931 932 932 m.Group("/keys", func() { 933 - m.Combo("").Get(repo.DeployKeys). 934 - Post(web.Bind(forms.AddKeyForm{}), repo.DeployKeysPost) 935 - m.Post("/delete", repo.DeleteDeployKey) 933 + m.Combo("").Get(repo_setting.DeployKeys). 934 + Post(web.Bind(forms.AddKeyForm{}), repo_setting.DeployKeysPost) 935 + m.Post("/delete", repo_setting.DeleteDeployKey) 936 936 }) 937 937 938 938 m.Group("/lfs", func() { 939 - m.Get("/", repo.LFSFiles) 940 - m.Get("/show/{oid}", repo.LFSFileGet) 941 - m.Post("/delete/{oid}", repo.LFSDelete) 942 - m.Get("/pointers", repo.LFSPointerFiles) 943 - m.Post("/pointers/associate", repo.LFSAutoAssociate) 944 - m.Get("/find", repo.LFSFileFind) 939 + m.Get("/", repo_setting.LFSFiles) 940 + m.Get("/show/{oid}", repo_setting.LFSFileGet) 941 + m.Post("/delete/{oid}", repo_setting.LFSDelete) 942 + m.Get("/pointers", repo_setting.LFSPointerFiles) 943 + m.Post("/pointers/associate", repo_setting.LFSAutoAssociate) 944 + m.Get("/find", repo_setting.LFSFileFind) 945 945 m.Group("/locks", func() { 946 - m.Get("/", repo.LFSLocks) 947 - m.Post("/", repo.LFSLockFile) 948 - m.Post("/{lid}/unlock", repo.LFSUnlock) 946 + m.Get("/", repo_setting.LFSLocks) 947 + m.Post("/", repo_setting.LFSLockFile) 948 + m.Post("/{lid}/unlock", repo_setting.LFSUnlock) 949 949 }) 950 950 }) 951 951 m.Group("/actions", func() {