aboutsummaryrefslogtreecommitdiff
path: root/internal/db/repo.go
diff options
context:
space:
mode:
authorᴜɴᴋɴᴡᴏɴ <u@gogs.io>2020-03-16 01:22:27 +0800
committerᴜɴᴋɴᴡᴏɴ <u@gogs.io>2020-03-16 01:22:27 +0800
commit9e9ca66467116e9079a2639c00e9e623aca23015 (patch)
treedacdef5392608ff7107e4dd498959d4899e13e54 /internal/db/repo.go
parent82ff0c5852f29daa5f95d965fd50665581e7ea3c (diff)
refactor: unify error handling in routing layer
Diffstat (limited to 'internal/db/repo.go')
-rw-r--r--internal/db/repo.go55
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{