You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

error.go 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. // Copyright 2015 The Gogs Authors. All rights reserved.
  2. // Copyright 2019 The Gitea Authors. All rights reserved.
  3. // SPDX-License-Identifier: MIT
  4. package models
  5. import (
  6. "fmt"
  7. repo_model "code.gitea.io/gitea/models/repo"
  8. "code.gitea.io/gitea/modules/git"
  9. "code.gitea.io/gitea/modules/util"
  10. )
  11. // ErrUserOwnRepos represents a "UserOwnRepos" kind of error.
  12. type ErrUserOwnRepos struct {
  13. UID int64
  14. }
  15. // IsErrUserOwnRepos checks if an error is a ErrUserOwnRepos.
  16. func IsErrUserOwnRepos(err error) bool {
  17. _, ok := err.(ErrUserOwnRepos)
  18. return ok
  19. }
  20. func (err ErrUserOwnRepos) Error() string {
  21. return fmt.Sprintf("user still has ownership of repositories [uid: %d]", err.UID)
  22. }
  23. // ErrUserHasOrgs represents a "UserHasOrgs" kind of error.
  24. type ErrUserHasOrgs struct {
  25. UID int64
  26. }
  27. // IsErrUserHasOrgs checks if an error is a ErrUserHasOrgs.
  28. func IsErrUserHasOrgs(err error) bool {
  29. _, ok := err.(ErrUserHasOrgs)
  30. return ok
  31. }
  32. func (err ErrUserHasOrgs) Error() string {
  33. return fmt.Sprintf("user still has membership of organizations [uid: %d]", err.UID)
  34. }
  35. // ErrUserOwnPackages notifies that the user (still) owns the packages.
  36. type ErrUserOwnPackages struct {
  37. UID int64
  38. }
  39. // IsErrUserOwnPackages checks if an error is an ErrUserOwnPackages.
  40. func IsErrUserOwnPackages(err error) bool {
  41. _, ok := err.(ErrUserOwnPackages)
  42. return ok
  43. }
  44. func (err ErrUserOwnPackages) Error() string {
  45. return fmt.Sprintf("user still has ownership of packages [uid: %d]", err.UID)
  46. }
  47. // ErrDeleteLastAdminUser represents a "DeleteLastAdminUser" kind of error.
  48. type ErrDeleteLastAdminUser struct {
  49. UID int64
  50. }
  51. // IsErrDeleteLastAdminUser checks if an error is a ErrDeleteLastAdminUser.
  52. func IsErrDeleteLastAdminUser(err error) bool {
  53. _, ok := err.(ErrDeleteLastAdminUser)
  54. return ok
  55. }
  56. func (err ErrDeleteLastAdminUser) Error() string {
  57. return fmt.Sprintf("can not delete the last admin user [uid: %d]", err.UID)
  58. }
  59. // ErrNoPendingRepoTransfer is an error type for repositories without a pending
  60. // transfer request
  61. type ErrNoPendingRepoTransfer struct {
  62. RepoID int64
  63. }
  64. func (err ErrNoPendingRepoTransfer) Error() string {
  65. return fmt.Sprintf("repository doesn't have a pending transfer [repo_id: %d]", err.RepoID)
  66. }
  67. // IsErrNoPendingTransfer is an error type when a repository has no pending
  68. // transfers
  69. func IsErrNoPendingTransfer(err error) bool {
  70. _, ok := err.(ErrNoPendingRepoTransfer)
  71. return ok
  72. }
  73. func (err ErrNoPendingRepoTransfer) Unwrap() error {
  74. return util.ErrNotExist
  75. }
  76. // ErrRepoTransferInProgress represents the state of a repository that has an
  77. // ongoing transfer
  78. type ErrRepoTransferInProgress struct {
  79. Uname string
  80. Name string
  81. }
  82. // IsErrRepoTransferInProgress checks if an error is a ErrRepoTransferInProgress.
  83. func IsErrRepoTransferInProgress(err error) bool {
  84. _, ok := err.(ErrRepoTransferInProgress)
  85. return ok
  86. }
  87. func (err ErrRepoTransferInProgress) Error() string {
  88. return fmt.Sprintf("repository is already being transferred [uname: %s, name: %s]", err.Uname, err.Name)
  89. }
  90. func (err ErrRepoTransferInProgress) Unwrap() error {
  91. return util.ErrAlreadyExist
  92. }
  93. // ErrInvalidCloneAddr represents a "InvalidCloneAddr" kind of error.
  94. type ErrInvalidCloneAddr struct {
  95. Host string
  96. IsURLError bool
  97. IsInvalidPath bool
  98. IsProtocolInvalid bool
  99. IsPermissionDenied bool
  100. LocalPath bool
  101. }
  102. // IsErrInvalidCloneAddr checks if an error is a ErrInvalidCloneAddr.
  103. func IsErrInvalidCloneAddr(err error) bool {
  104. _, ok := err.(*ErrInvalidCloneAddr)
  105. return ok
  106. }
  107. func (err *ErrInvalidCloneAddr) Error() string {
  108. if err.IsInvalidPath {
  109. return fmt.Sprintf("migration/cloning from '%s' is not allowed: the provided path is invalid", err.Host)
  110. }
  111. if err.IsProtocolInvalid {
  112. return fmt.Sprintf("migration/cloning from '%s' is not allowed: the provided url protocol is not allowed", err.Host)
  113. }
  114. if err.IsPermissionDenied {
  115. return fmt.Sprintf("migration/cloning from '%s' is not allowed.", err.Host)
  116. }
  117. if err.IsURLError {
  118. return fmt.Sprintf("migration/cloning from '%s' is not allowed: the provided url is invalid", err.Host)
  119. }
  120. return fmt.Sprintf("migration/cloning from '%s' is not allowed", err.Host)
  121. }
  122. func (err *ErrInvalidCloneAddr) Unwrap() error {
  123. return util.ErrInvalidArgument
  124. }
  125. // ErrUpdateTaskNotExist represents a "UpdateTaskNotExist" kind of error.
  126. type ErrUpdateTaskNotExist struct {
  127. UUID string
  128. }
  129. // IsErrUpdateTaskNotExist checks if an error is a ErrUpdateTaskNotExist.
  130. func IsErrUpdateTaskNotExist(err error) bool {
  131. _, ok := err.(ErrUpdateTaskNotExist)
  132. return ok
  133. }
  134. func (err ErrUpdateTaskNotExist) Error() string {
  135. return fmt.Sprintf("update task does not exist [uuid: %s]", err.UUID)
  136. }
  137. func (err ErrUpdateTaskNotExist) Unwrap() error {
  138. return util.ErrNotExist
  139. }
  140. // ErrInvalidTagName represents a "InvalidTagName" kind of error.
  141. type ErrInvalidTagName struct {
  142. TagName string
  143. }
  144. // IsErrInvalidTagName checks if an error is a ErrInvalidTagName.
  145. func IsErrInvalidTagName(err error) bool {
  146. _, ok := err.(ErrInvalidTagName)
  147. return ok
  148. }
  149. func (err ErrInvalidTagName) Error() string {
  150. return fmt.Sprintf("release tag name is not valid [tag_name: %s]", err.TagName)
  151. }
  152. func (err ErrInvalidTagName) Unwrap() error {
  153. return util.ErrInvalidArgument
  154. }
  155. // ErrProtectedTagName represents a "ProtectedTagName" kind of error.
  156. type ErrProtectedTagName struct {
  157. TagName string
  158. }
  159. // IsErrProtectedTagName checks if an error is a ErrProtectedTagName.
  160. func IsErrProtectedTagName(err error) bool {
  161. _, ok := err.(ErrProtectedTagName)
  162. return ok
  163. }
  164. func (err ErrProtectedTagName) Error() string {
  165. return fmt.Sprintf("release tag name is protected [tag_name: %s]", err.TagName)
  166. }
  167. func (err ErrProtectedTagName) Unwrap() error {
  168. return util.ErrPermissionDenied
  169. }
  170. // ErrRepoFileAlreadyExists represents a "RepoFileAlreadyExist" kind of error.
  171. type ErrRepoFileAlreadyExists struct {
  172. Path string
  173. }
  174. // IsErrRepoFileAlreadyExists checks if an error is a ErrRepoFileAlreadyExists.
  175. func IsErrRepoFileAlreadyExists(err error) bool {
  176. _, ok := err.(ErrRepoFileAlreadyExists)
  177. return ok
  178. }
  179. func (err ErrRepoFileAlreadyExists) Error() string {
  180. return fmt.Sprintf("repository file already exists [path: %s]", err.Path)
  181. }
  182. func (err ErrRepoFileAlreadyExists) Unwrap() error {
  183. return util.ErrAlreadyExist
  184. }
  185. // ErrRepoFileDoesNotExist represents a "RepoFileDoesNotExist" kind of error.
  186. type ErrRepoFileDoesNotExist struct {
  187. Path string
  188. Name string
  189. }
  190. // IsErrRepoFileDoesNotExist checks if an error is a ErrRepoDoesNotExist.
  191. func IsErrRepoFileDoesNotExist(err error) bool {
  192. _, ok := err.(ErrRepoFileDoesNotExist)
  193. return ok
  194. }
  195. func (err ErrRepoFileDoesNotExist) Error() string {
  196. return fmt.Sprintf("repository file does not exist [path: %s]", err.Path)
  197. }
  198. func (err ErrRepoFileDoesNotExist) Unwrap() error {
  199. return util.ErrNotExist
  200. }
  201. // ErrFilenameInvalid represents a "FilenameInvalid" kind of error.
  202. type ErrFilenameInvalid struct {
  203. Path string
  204. }
  205. // IsErrFilenameInvalid checks if an error is an ErrFilenameInvalid.
  206. func IsErrFilenameInvalid(err error) bool {
  207. _, ok := err.(ErrFilenameInvalid)
  208. return ok
  209. }
  210. func (err ErrFilenameInvalid) Error() string {
  211. return fmt.Sprintf("path contains a malformed path component [path: %s]", err.Path)
  212. }
  213. func (err ErrFilenameInvalid) Unwrap() error {
  214. return util.ErrInvalidArgument
  215. }
  216. // ErrUserCannotCommit represents "UserCannotCommit" kind of error.
  217. type ErrUserCannotCommit struct {
  218. UserName string
  219. }
  220. // IsErrUserCannotCommit checks if an error is an ErrUserCannotCommit.
  221. func IsErrUserCannotCommit(err error) bool {
  222. _, ok := err.(ErrUserCannotCommit)
  223. return ok
  224. }
  225. func (err ErrUserCannotCommit) Error() string {
  226. return fmt.Sprintf("user cannot commit to repo [user: %s]", err.UserName)
  227. }
  228. func (err ErrUserCannotCommit) Unwrap() error {
  229. return util.ErrPermissionDenied
  230. }
  231. // ErrFilePathInvalid represents a "FilePathInvalid" kind of error.
  232. type ErrFilePathInvalid struct {
  233. Message string
  234. Path string
  235. Name string
  236. Type git.EntryMode
  237. }
  238. // IsErrFilePathInvalid checks if an error is an ErrFilePathInvalid.
  239. func IsErrFilePathInvalid(err error) bool {
  240. _, ok := err.(ErrFilePathInvalid)
  241. return ok
  242. }
  243. func (err ErrFilePathInvalid) Error() string {
  244. if err.Message != "" {
  245. return err.Message
  246. }
  247. return fmt.Sprintf("path is invalid [path: %s]", err.Path)
  248. }
  249. func (err ErrFilePathInvalid) Unwrap() error {
  250. return util.ErrInvalidArgument
  251. }
  252. // ErrFilePathProtected represents a "FilePathProtected" kind of error.
  253. type ErrFilePathProtected struct {
  254. Message string
  255. Path string
  256. }
  257. // IsErrFilePathProtected checks if an error is an ErrFilePathProtected.
  258. func IsErrFilePathProtected(err error) bool {
  259. _, ok := err.(ErrFilePathProtected)
  260. return ok
  261. }
  262. func (err ErrFilePathProtected) Error() string {
  263. if err.Message != "" {
  264. return err.Message
  265. }
  266. return fmt.Sprintf("path is protected and can not be changed [path: %s]", err.Path)
  267. }
  268. func (err ErrFilePathProtected) Unwrap() error {
  269. return util.ErrPermissionDenied
  270. }
  271. // ErrDisallowedToMerge represents an error that a branch is protected and the current user is not allowed to modify it.
  272. type ErrDisallowedToMerge struct {
  273. Reason string
  274. }
  275. // IsErrDisallowedToMerge checks if an error is an ErrDisallowedToMerge.
  276. func IsErrDisallowedToMerge(err error) bool {
  277. _, ok := err.(ErrDisallowedToMerge)
  278. return ok
  279. }
  280. func (err ErrDisallowedToMerge) Error() string {
  281. return fmt.Sprintf("not allowed to merge [reason: %s]", err.Reason)
  282. }
  283. func (err ErrDisallowedToMerge) Unwrap() error {
  284. return util.ErrPermissionDenied
  285. }
  286. // ErrTagAlreadyExists represents an error that tag with such name already exists.
  287. type ErrTagAlreadyExists struct {
  288. TagName string
  289. }
  290. // IsErrTagAlreadyExists checks if an error is an ErrTagAlreadyExists.
  291. func IsErrTagAlreadyExists(err error) bool {
  292. _, ok := err.(ErrTagAlreadyExists)
  293. return ok
  294. }
  295. func (err ErrTagAlreadyExists) Error() string {
  296. return fmt.Sprintf("tag already exists [name: %s]", err.TagName)
  297. }
  298. func (err ErrTagAlreadyExists) Unwrap() error {
  299. return util.ErrAlreadyExist
  300. }
  301. // ErrSHADoesNotMatch represents a "SHADoesNotMatch" kind of error.
  302. type ErrSHADoesNotMatch struct {
  303. Path string
  304. GivenSHA string
  305. CurrentSHA string
  306. }
  307. // IsErrSHADoesNotMatch checks if an error is a ErrSHADoesNotMatch.
  308. func IsErrSHADoesNotMatch(err error) bool {
  309. _, ok := err.(ErrSHADoesNotMatch)
  310. return ok
  311. }
  312. func (err ErrSHADoesNotMatch) Error() string {
  313. return fmt.Sprintf("sha does not match [given: %s, expected: %s]", err.GivenSHA, err.CurrentSHA)
  314. }
  315. // ErrSHANotFound represents a "SHADoesNotMatch" kind of error.
  316. type ErrSHANotFound struct {
  317. SHA string
  318. }
  319. // IsErrSHANotFound checks if an error is a ErrSHANotFound.
  320. func IsErrSHANotFound(err error) bool {
  321. _, ok := err.(ErrSHANotFound)
  322. return ok
  323. }
  324. func (err ErrSHANotFound) Error() string {
  325. return fmt.Sprintf("sha not found [%s]", err.SHA)
  326. }
  327. func (err ErrSHANotFound) Unwrap() error {
  328. return util.ErrNotExist
  329. }
  330. // ErrCommitIDDoesNotMatch represents a "CommitIDDoesNotMatch" kind of error.
  331. type ErrCommitIDDoesNotMatch struct {
  332. GivenCommitID string
  333. CurrentCommitID string
  334. }
  335. // IsErrCommitIDDoesNotMatch checks if an error is a ErrCommitIDDoesNotMatch.
  336. func IsErrCommitIDDoesNotMatch(err error) bool {
  337. _, ok := err.(ErrCommitIDDoesNotMatch)
  338. return ok
  339. }
  340. func (err ErrCommitIDDoesNotMatch) Error() string {
  341. return fmt.Sprintf("file CommitID does not match [given: %s, expected: %s]", err.GivenCommitID, err.CurrentCommitID)
  342. }
  343. // ErrSHAOrCommitIDNotProvided represents a "SHAOrCommitIDNotProvided" kind of error.
  344. type ErrSHAOrCommitIDNotProvided struct{}
  345. // IsErrSHAOrCommitIDNotProvided checks if an error is a ErrSHAOrCommitIDNotProvided.
  346. func IsErrSHAOrCommitIDNotProvided(err error) bool {
  347. _, ok := err.(ErrSHAOrCommitIDNotProvided)
  348. return ok
  349. }
  350. func (err ErrSHAOrCommitIDNotProvided) Error() string {
  351. return "a SHA or commit ID must be proved when updating a file"
  352. }
  353. // ErrInvalidMergeStyle represents an error if merging with disabled merge strategy
  354. type ErrInvalidMergeStyle struct {
  355. ID int64
  356. Style repo_model.MergeStyle
  357. }
  358. // IsErrInvalidMergeStyle checks if an error is a ErrInvalidMergeStyle.
  359. func IsErrInvalidMergeStyle(err error) bool {
  360. _, ok := err.(ErrInvalidMergeStyle)
  361. return ok
  362. }
  363. func (err ErrInvalidMergeStyle) Error() string {
  364. return fmt.Sprintf("merge strategy is not allowed or is invalid [repo_id: %d, strategy: %s]",
  365. err.ID, err.Style)
  366. }
  367. func (err ErrInvalidMergeStyle) Unwrap() error {
  368. return util.ErrInvalidArgument
  369. }
  370. // ErrMergeConflicts represents an error if merging fails with a conflict
  371. type ErrMergeConflicts struct {
  372. Style repo_model.MergeStyle
  373. StdOut string
  374. StdErr string
  375. Err error
  376. }
  377. // IsErrMergeConflicts checks if an error is a ErrMergeConflicts.
  378. func IsErrMergeConflicts(err error) bool {
  379. _, ok := err.(ErrMergeConflicts)
  380. return ok
  381. }
  382. func (err ErrMergeConflicts) Error() string {
  383. return fmt.Sprintf("Merge Conflict Error: %v: %s\n%s", err.Err, err.StdErr, err.StdOut)
  384. }
  385. // ErrMergeUnrelatedHistories represents an error if merging fails due to unrelated histories
  386. type ErrMergeUnrelatedHistories struct {
  387. Style repo_model.MergeStyle
  388. StdOut string
  389. StdErr string
  390. Err error
  391. }
  392. // IsErrMergeUnrelatedHistories checks if an error is a ErrMergeUnrelatedHistories.
  393. func IsErrMergeUnrelatedHistories(err error) bool {
  394. _, ok := err.(ErrMergeUnrelatedHistories)
  395. return ok
  396. }
  397. func (err ErrMergeUnrelatedHistories) Error() string {
  398. return fmt.Sprintf("Merge UnrelatedHistories Error: %v: %s\n%s", err.Err, err.StdErr, err.StdOut)
  399. }
  400. // ErrRebaseConflicts represents an error if rebase fails with a conflict
  401. type ErrRebaseConflicts struct {
  402. Style repo_model.MergeStyle
  403. CommitSHA string
  404. StdOut string
  405. StdErr string
  406. Err error
  407. }
  408. // IsErrRebaseConflicts checks if an error is a ErrRebaseConflicts.
  409. func IsErrRebaseConflicts(err error) bool {
  410. _, ok := err.(ErrRebaseConflicts)
  411. return ok
  412. }
  413. func (err ErrRebaseConflicts) Error() string {
  414. return fmt.Sprintf("Rebase Error: %v: Whilst Rebasing: %s\n%s\n%s", err.Err, err.CommitSHA, err.StdErr, err.StdOut)
  415. }
  416. // ErrPullRequestHasMerged represents a "PullRequestHasMerged"-error
  417. type ErrPullRequestHasMerged struct {
  418. ID int64
  419. IssueID int64
  420. HeadRepoID int64
  421. BaseRepoID int64
  422. HeadBranch string
  423. BaseBranch string
  424. }
  425. // IsErrPullRequestHasMerged checks if an error is a ErrPullRequestHasMerged.
  426. func IsErrPullRequestHasMerged(err error) bool {
  427. _, ok := err.(ErrPullRequestHasMerged)
  428. return ok
  429. }
  430. // Error does pretty-printing :D
  431. func (err ErrPullRequestHasMerged) Error() string {
  432. return fmt.Sprintf("pull request has merged [id: %d, issue_id: %d, head_repo_id: %d, base_repo_id: %d, head_branch: %s, base_branch: %s]",
  433. err.ID, err.IssueID, err.HeadRepoID, err.BaseRepoID, err.HeadBranch, err.BaseBranch)
  434. }