@@ -43,7 +43,8 @@ import (
4343 "xorm.io/builder"
4444)
4545
46- var repoWorkingPool = sync .NewExclusivePool ()
46+ // RepoWorkingPool represents a working pool to order the parallel changes to the same repository
47+ var RepoWorkingPool = sync .NewExclusivePool ()
4748
4849var (
4950 // ErrMirrorNotExist mirror does not exist error
@@ -1655,7 +1656,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
16551656 return fmt .Errorf ("sess.Begin: %v" , err )
16561657 }
16571658
1658- owner := repo .Owner
1659+ oldOwner := repo .Owner
16591660
16601661 // Note: we have to set value here to make sure recalculate accesses is based on
16611662 // new owner.
@@ -1691,8 +1692,8 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
16911692 }
16921693
16931694 // Remove old team-repository relations.
1694- if owner .IsOrganization () {
1695- if err = owner .removeOrgRepo (sess , repo .ID ); err != nil {
1695+ if oldOwner .IsOrganization () {
1696+ if err = oldOwner .removeOrgRepo (sess , repo .ID ); err != nil {
16961697 return fmt .Errorf ("removeOrgRepo: %v" , err )
16971698 }
16981699 }
@@ -1716,7 +1717,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
17161717 // Update repository count.
17171718 if _ , err = sess .Exec ("UPDATE `user` SET num_repos=num_repos+1 WHERE id=?" , newOwner .ID ); err != nil {
17181719 return fmt .Errorf ("increase new owner repository count: %v" , err )
1719- } else if _ , err = sess .Exec ("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?" , owner .ID ); err != nil {
1720+ } else if _ , err = sess .Exec ("UPDATE `user` SET num_repos=num_repos-1 WHERE id=?" , oldOwner .ID ); err != nil {
17201721 return fmt .Errorf ("decrease old owner repository count: %v" , err )
17211722 }
17221723
@@ -1725,8 +1726,8 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
17251726 }
17261727
17271728 // Remove watch for organization.
1728- if owner .IsOrganization () {
1729- if err = watchRepo (sess , owner .ID , repo .ID , false ); err != nil {
1729+ if oldOwner .IsOrganization () {
1730+ if err = watchRepo (sess , oldOwner .ID , repo .ID , false ); err != nil {
17301731 return fmt .Errorf ("watchRepo [false]: %v" , err )
17311732 }
17321733 }
@@ -1738,12 +1739,12 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
17381739 return fmt .Errorf ("Failed to create dir %s: %v" , dir , err )
17391740 }
17401741
1741- if err = os .Rename (RepoPath (owner .Name , repo .Name ), RepoPath (newOwner .Name , repo .Name )); err != nil {
1742+ if err = os .Rename (RepoPath (oldOwner .Name , repo .Name ), RepoPath (newOwner .Name , repo .Name )); err != nil {
17421743 return fmt .Errorf ("rename repository directory: %v" , err )
17431744 }
17441745
17451746 // Rename remote wiki repository to new path and delete local copy.
1746- wikiPath := WikiPath (owner .Name , repo .Name )
1747+ wikiPath := WikiPath (oldOwner .Name , repo .Name )
17471748 if com .IsExist (wikiPath ) {
17481749 if err = os .Rename (wikiPath , WikiPath (newOwner .Name , repo .Name )); err != nil {
17491750 return fmt .Errorf ("rename repository wiki: %v" , err )
@@ -1755,11 +1756,16 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
17551756 return fmt .Errorf ("delete repo redirect: %v" , err )
17561757 }
17571758
1759+ if err := NewRepoRedirect (DBContext {sess }, oldOwner .ID , repo .ID , repo .Name , repo .Name ); err != nil {
1760+ return fmt .Errorf ("NewRepoRedirect: %v" , err )
1761+ }
1762+
17581763 return sess .Commit ()
17591764}
17601765
17611766// ChangeRepositoryName changes all corresponding setting from old repository name to new one.
17621767func ChangeRepositoryName (doer * User , repo * Repository , newRepoName string ) (err error ) {
1768+ oldRepoName := repo .Name
17631769 newRepoName = strings .ToLower (newRepoName )
17641770 if err = IsUsableRepoName (newRepoName ); err != nil {
17651771 return err
@@ -1776,12 +1782,6 @@ func ChangeRepositoryName(doer *User, repo *Repository, newRepoName string) (err
17761782 return ErrRepoAlreadyExist {repo .Owner .Name , newRepoName }
17771783 }
17781784
1779- // Change repository directory name. We must lock the local copy of the
1780- // repo so that we can atomically rename the repo path and updates the
1781- // local copy's origin accordingly.
1782- repoWorkingPool .CheckIn (com .ToStr (repo .ID ))
1783- defer repoWorkingPool .CheckOut (com .ToStr (repo .ID ))
1784-
17851785 newRepoPath := RepoPath (repo .Owner .Name , newRepoName )
17861786 if err = os .Rename (repo .RepoPath (), newRepoPath ); err != nil {
17871787 return fmt .Errorf ("rename repository directory: %v" , err )
@@ -1805,6 +1805,10 @@ func ChangeRepositoryName(doer *User, repo *Repository, newRepoName string) (err
18051805 return fmt .Errorf ("delete repo redirect: %v" , err )
18061806 }
18071807
1808+ if err := NewRepoRedirect (DBContext {sess }, repo .Owner .ID , repo .ID , oldRepoName , newRepoName ); err != nil {
1809+ return err
1810+ }
1811+
18081812 return sess .Commit ()
18091813}
18101814
0 commit comments