You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

transfer.go 2.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package repository
  5. import (
  6. "fmt"
  7. "code.gitea.io/gitea/models"
  8. "code.gitea.io/gitea/modules/notification"
  9. "code.gitea.io/gitea/modules/sync"
  10. "github.com/unknwon/com"
  11. )
  12. // repoWorkingPool represents a working pool to order the parallel changes to the same repository
  13. var repoWorkingPool = sync.NewExclusivePool()
  14. // TransferOwnership transfers all corresponding setting from old user to new one.
  15. func TransferOwnership(doer, newOwner *models.User, repo *models.Repository, teams []*models.Team) error {
  16. if err := repo.GetOwner(); err != nil {
  17. return err
  18. }
  19. for _, team := range teams {
  20. if newOwner.ID != team.OrgID {
  21. return fmt.Errorf("team %d does not belong to organization", team.ID)
  22. }
  23. }
  24. oldOwner := repo.Owner
  25. repoWorkingPool.CheckIn(com.ToStr(repo.ID))
  26. if err := models.TransferOwnership(doer, newOwner.Name, repo); err != nil {
  27. repoWorkingPool.CheckOut(com.ToStr(repo.ID))
  28. return err
  29. }
  30. repoWorkingPool.CheckOut(com.ToStr(repo.ID))
  31. newRepo, err := models.GetRepositoryByID(repo.ID)
  32. if err != nil {
  33. return err
  34. }
  35. for _, team := range teams {
  36. if err := team.AddRepository(newRepo); err != nil {
  37. return err
  38. }
  39. }
  40. notification.NotifyTransferRepository(doer, repo, oldOwner.Name)
  41. return nil
  42. }
  43. // ChangeRepositoryName changes all corresponding setting from old repository name to new one.
  44. func ChangeRepositoryName(doer *models.User, repo *models.Repository, newRepoName string) error {
  45. oldRepoName := repo.Name
  46. // Change repository directory name. We must lock the local copy of the
  47. // repo so that we can atomically rename the repo path and updates the
  48. // local copy's origin accordingly.
  49. repoWorkingPool.CheckIn(com.ToStr(repo.ID))
  50. if err := models.ChangeRepositoryName(doer, repo, newRepoName); err != nil {
  51. repoWorkingPool.CheckOut(com.ToStr(repo.ID))
  52. return err
  53. }
  54. repoWorkingPool.CheckOut(com.ToStr(repo.ID))
  55. notification.NotifyRenameRepository(doer, repo, oldRepoName)
  56. return nil
  57. }