diff options
author | Dennis Chen <barracks510@gmail.com> | 2018-03-12 15:03:51 -0400 |
---|---|---|
committer | jc <u@gogs.io> | 2018-03-12 15:03:51 -0400 |
commit | f0bbcef3a473ea72dc948ccc3537aeba7ef45e98 (patch) | |
tree | eb7d9a0ff563c0e55763e263c3e2ee4dba7e3baa | |
parent | d7280f82ac147ce50c9f2465d55ce939d01b4143 (diff) |
api: fix nil pointer dereference on repo/forks (#4633)
Sets BaseRepo value for each resulting fork in GetForks().
Finds correct permissions for parent repository in APIFormat().
The output JSON is a little redundant, perhaps we should offer a
different view of the api.Repository without the Parent attribute?
Signed-off-by: Dennis Chen <barracks510@gmail.com>
-rw-r--r-- | models/repo.go | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/models/repo.go b/models/repo.go index 50696558..6ed7cd18 100644 --- a/models/repo.go +++ b/models/repo.go @@ -287,7 +287,7 @@ func (repo *Repository) HTMLURL() string { // This method assumes following fields have been assigned with valid values: // Required - BaseRepo (if fork) // Arguments that are allowed to be nil: permission -func (repo *Repository) APIFormat(permission *api.Permission) *api.Repository { +func (repo *Repository) APIFormat(permission *api.Permission, user ...*User) *api.Repository { cloneLink := repo.CloneLink() apiRepo := &api.Repository{ ID: repo.ID, @@ -314,8 +314,12 @@ func (repo *Repository) APIFormat(permission *api.Permission) *api.Repository { Permissions: permission, } if repo.IsFork { - // FIXME: check precise permission for base repository - apiRepo.Parent = repo.BaseRepo.APIFormat(nil) + p := &api.Permission{Pull: true} + if len(user) != 0 { + p.Admin = user[0].IsAdminOfRepo(repo) + p.Push = user[0].IsWriterOfRepo(repo) + } + apiRepo.Parent = repo.BaseRepo.APIFormat(p) } return apiRepo } @@ -2335,7 +2339,14 @@ func ForkRepository(doer, owner *User, baseRepo *Repository, name, desc string) func (repo *Repository) GetForks() ([]*Repository, error) { forks := make([]*Repository, 0, repo.NumForks) - return forks, x.Find(&forks, &Repository{ForkID: repo.ID}) + if err := x.Find(&forks, &Repository{ForkID: repo.ID}); err != nil { + return nil, err + } + + for _, fork := range forks { + fork.BaseRepo = repo + } + return forks, nil } // __________ .__ |