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