API endpoint for repo transfer (#9947)
* squash * optimize * fail before make any changes * fix-header
This commit is contained in:
parent
d816f7018b
commit
13bc82009c
9 changed files with 265 additions and 10 deletions
|
@ -5,6 +5,8 @@
|
|||
package repository
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"code.gitea.io/gitea/models"
|
||||
"code.gitea.io/gitea/modules/notification"
|
||||
"code.gitea.io/gitea/modules/sync"
|
||||
|
@ -16,20 +18,36 @@ import (
|
|||
var repoWorkingPool = sync.NewExclusivePool()
|
||||
|
||||
// TransferOwnership transfers all corresponding setting from old user to new one.
|
||||
func TransferOwnership(doer *models.User, newOwnerName string, repo *models.Repository) error {
|
||||
func TransferOwnership(doer, newOwner *models.User, repo *models.Repository, teams []*models.Team) error {
|
||||
if err := repo.GetOwner(); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, team := range teams {
|
||||
if newOwner.ID != team.OrgID {
|
||||
return fmt.Errorf("team %d does not belong to organization", team.ID)
|
||||
}
|
||||
}
|
||||
|
||||
oldOwner := repo.Owner
|
||||
|
||||
repoWorkingPool.CheckIn(com.ToStr(repo.ID))
|
||||
if err := models.TransferOwnership(doer, newOwnerName, repo); err != nil {
|
||||
if err := models.TransferOwnership(doer, newOwner.Name, repo); err != nil {
|
||||
repoWorkingPool.CheckOut(com.ToStr(repo.ID))
|
||||
return err
|
||||
}
|
||||
repoWorkingPool.CheckOut(com.ToStr(repo.ID))
|
||||
|
||||
newRepo, err := models.GetRepositoryByID(repo.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, team := range teams {
|
||||
if err := team.AddRepository(newRepo); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
notification.NotifyTransferRepository(doer, repo, oldOwner.Name)
|
||||
|
||||
return nil
|
||||
|
|
|
@ -32,7 +32,7 @@ func TestTransferOwnership(t *testing.T) {
|
|||
doer := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)
|
||||
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository)
|
||||
repo.Owner = models.AssertExistsAndLoadBean(t, &models.User{ID: repo.OwnerID}).(*models.User)
|
||||
assert.NoError(t, TransferOwnership(doer, "user2", repo))
|
||||
assert.NoError(t, TransferOwnership(doer, doer, repo, nil))
|
||||
|
||||
transferredRepo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository)
|
||||
assert.EqualValues(t, 2, transferredRepo.OwnerID)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue