diff options
author | ᴜɴᴋɴᴡᴏɴ <u@gogs.io> | 2020-03-16 01:22:27 +0800 |
---|---|---|
committer | ᴜɴᴋɴᴡᴏɴ <u@gogs.io> | 2020-03-16 01:22:27 +0800 |
commit | 9e9ca66467116e9079a2639c00e9e623aca23015 (patch) | |
tree | dacdef5392608ff7107e4dd498959d4899e13e54 /internal/db/repo.go | |
parent | 82ff0c5852f29daa5f95d965fd50665581e7ea3c (diff) |
refactor: unify error handling in routing layer
Diffstat (limited to 'internal/db/repo.go')
-rw-r--r-- | internal/db/repo.go | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/internal/db/repo.go b/internal/db/repo.go index 7e607dc0..1a27a34a 100644 --- a/internal/db/repo.go +++ b/internal/db/repo.go @@ -33,6 +33,7 @@ import ( "gogs.io/gogs/internal/avatar" "gogs.io/gogs/internal/conf" "gogs.io/gogs/internal/db/errors" + "gogs.io/gogs/internal/errutil" "gogs.io/gogs/internal/markup" "gogs.io/gogs/internal/osutil" "gogs.io/gogs/internal/process" @@ -248,11 +249,11 @@ func (repo *Repository) loadAttributes(e Engine) (err error) { if repo.IsFork && repo.BaseRepo == nil { repo.BaseRepo, err = getRepositoryByID(e, repo.ForkID) if err != nil { - if errors.IsRepoNotExist(err) { + if IsErrRepoNotExist(err) { repo.IsFork = false repo.ForkID = 0 } else { - return fmt.Errorf("getRepositoryByID [%d]: %v", repo.ForkID, err) + return fmt.Errorf("get fork repository by ID: %v", err) } } } @@ -1104,10 +1105,23 @@ func createRepository(e *xorm.Session, doer, owner *User, repo *Repository) (err return repo.loadAttributes(e) } +type ErrReachLimitOfRepo struct { + Limit int +} + +func IsErrReachLimitOfRepo(err error) bool { + _, ok := err.(ErrReachLimitOfRepo) + return ok +} + +func (err ErrReachLimitOfRepo) Error() string { + return fmt.Sprintf("user has reached maximum limit of repositories [limit: %d]", err.Limit) +} + // CreateRepository creates a repository for given user or organization. func CreateRepository(doer, owner *User, opts CreateRepoOptions) (_ *Repository, err error) { if !owner.CanCreateRepo() { - return nil, errors.ReachLimitOfRepo{Limit: owner.RepoCreationNum()} + return nil, ErrReachLimitOfRepo{Limit: owner.RepoCreationNum()} } repo := &Repository{ @@ -1481,17 +1495,17 @@ func UpdateRepository(repo *Repository, visibilityChanged bool) (err error) { } // DeleteRepository deletes a repository for a user or organization. -func DeleteRepository(uid, repoID int64) error { - repo := &Repository{ID: repoID, OwnerID: uid} +func DeleteRepository(ownerID, repoID int64) error { + repo := &Repository{ID: repoID, OwnerID: ownerID} has, err := x.Get(repo) if err != nil { return err } else if !has { - return errors.RepoNotExist{ID: repoID, UserID: uid} + return ErrRepoNotExist{args: map[string]interface{}{"ownerID": ownerID, "repoID": repoID}} } // In case is a organization. - org, err := GetUserByID(uid) + org, err := GetUserByID(ownerID) if err != nil { return err } @@ -1571,7 +1585,7 @@ func DeleteRepository(uid, repoID int64) error { } } - if _, err = sess.Exec("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?", uid); err != nil { + if _, err = sess.Exec("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?", ownerID); err != nil { return err } @@ -1616,6 +1630,25 @@ func GetRepositoryByRef(ref string) (*Repository, error) { return GetRepositoryByName(user.ID, repoName) } +var _ errutil.NotFound = (*ErrRepoNotExist)(nil) + +type ErrRepoNotExist struct { + args map[string]interface{} +} + +func IsErrRepoNotExist(err error) bool { + _, ok := err.(ErrRepoNotExist) + return ok +} + +func (err ErrRepoNotExist) Error() string { + return fmt.Sprintf("repository does not exist: %v", err.args) +} + +func (ErrRepoNotExist) NotFound() bool { + return true +} + // GetRepositoryByName returns the repository by given name under user if exists. func GetRepositoryByName(ownerID int64, name string) (*Repository, error) { repo := &Repository{ @@ -1626,7 +1659,7 @@ func GetRepositoryByName(ownerID int64, name string) (*Repository, error) { if err != nil { return nil, err } else if !has { - return nil, errors.RepoNotExist{UserID: ownerID, Name: name} + return nil, ErrRepoNotExist{args: map[string]interface{}{"ownerID": ownerID, "name": name}} } return repo, repo.LoadAttributes() } @@ -1637,7 +1670,7 @@ func getRepositoryByID(e Engine, id int64) (*Repository, error) { if err != nil { return nil, err } else if !has { - return nil, errors.RepoNotExist{ID: id} + return nil, ErrRepoNotExist{args: map[string]interface{}{"repoID": id}} } return repo, repo.loadAttributes(e) } @@ -2361,7 +2394,7 @@ func HasForkedRepo(ownerID, repoID int64) (*Repository, bool, error) { // ForkRepository creates a fork of target repository under another user domain. func ForkRepository(doer, owner *User, baseRepo *Repository, name, desc string) (_ *Repository, err error) { if !owner.CanCreateRepo() { - return nil, errors.ReachLimitOfRepo{Limit: owner.RepoCreationNum()} + return nil, ErrReachLimitOfRepo{Limit: owner.RepoCreationNum()} } repo := &Repository{ |