@@ -43,7 +43,8 @@ import (
43
43
"xorm.io/builder"
44
44
)
45
45
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 ()
47
48
48
49
var (
49
50
// ErrMirrorNotExist mirror does not exist error
@@ -1655,7 +1656,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
1655
1656
return fmt .Errorf ("sess.Begin: %v" , err )
1656
1657
}
1657
1658
1658
- owner := repo .Owner
1659
+ oldOwner := repo .Owner
1659
1660
1660
1661
// Note: we have to set value here to make sure recalculate accesses is based on
1661
1662
// new owner.
@@ -1691,8 +1692,8 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
1691
1692
}
1692
1693
1693
1694
// 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 {
1696
1697
return fmt .Errorf ("removeOrgRepo: %v" , err )
1697
1698
}
1698
1699
}
@@ -1716,7 +1717,7 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
1716
1717
// Update repository count.
1717
1718
if _ , err = sess .Exec ("UPDATE `user` SET num_repos=num_repos+1 WHERE id=?" , newOwner .ID ); err != nil {
1718
1719
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 {
1720
1721
return fmt .Errorf ("decrease old owner repository count: %v" , err )
1721
1722
}
1722
1723
@@ -1725,8 +1726,8 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
1725
1726
}
1726
1727
1727
1728
// 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 {
1730
1731
return fmt .Errorf ("watchRepo [false]: %v" , err )
1731
1732
}
1732
1733
}
@@ -1738,12 +1739,12 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
1738
1739
return fmt .Errorf ("Failed to create dir %s: %v" , dir , err )
1739
1740
}
1740
1741
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 {
1742
1743
return fmt .Errorf ("rename repository directory: %v" , err )
1743
1744
}
1744
1745
1745
1746
// 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 )
1747
1748
if com .IsExist (wikiPath ) {
1748
1749
if err = os .Rename (wikiPath , WikiPath (newOwner .Name , repo .Name )); err != nil {
1749
1750
return fmt .Errorf ("rename repository wiki: %v" , err )
@@ -1755,11 +1756,16 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error
1755
1756
return fmt .Errorf ("delete repo redirect: %v" , err )
1756
1757
}
1757
1758
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
+
1758
1763
return sess .Commit ()
1759
1764
}
1760
1765
1761
1766
// ChangeRepositoryName changes all corresponding setting from old repository name to new one.
1762
1767
func ChangeRepositoryName (doer * User , repo * Repository , newRepoName string ) (err error ) {
1768
+ oldRepoName := repo .Name
1763
1769
newRepoName = strings .ToLower (newRepoName )
1764
1770
if err = IsUsableRepoName (newRepoName ); err != nil {
1765
1771
return err
@@ -1776,12 +1782,6 @@ func ChangeRepositoryName(doer *User, repo *Repository, newRepoName string) (err
1776
1782
return ErrRepoAlreadyExist {repo .Owner .Name , newRepoName }
1777
1783
}
1778
1784
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
-
1785
1785
newRepoPath := RepoPath (repo .Owner .Name , newRepoName )
1786
1786
if err = os .Rename (repo .RepoPath (), newRepoPath ); err != nil {
1787
1787
return fmt .Errorf ("rename repository directory: %v" , err )
@@ -1805,6 +1805,10 @@ func ChangeRepositoryName(doer *User, repo *Repository, newRepoName string) (err
1805
1805
return fmt .Errorf ("delete repo redirect: %v" , err )
1806
1806
}
1807
1807
1808
+ if err := NewRepoRedirect (DBContext {sess }, repo .Owner .ID , repo .ID , oldRepoName , newRepoName ); err != nil {
1809
+ return err
1810
+ }
1811
+
1808
1812
return sess .Commit ()
1809
1813
}
1810
1814
0 commit comments