From b40b85e006d0e3858b423e36d437de73cd08d00a Mon Sep 17 00:00:00 2001 From: Guy Smoilov <611655+guysmoilov@users.noreply.github.com> Date: Sun, 3 Nov 2019 21:07:40 +0200 Subject: [PATCH] repo: delete local copies on owner name change (#5843) * Protect local repo copy deletion with repoWorkingPool, and delete the local copy on owner name change. * Update internal/db/user.go Co-Authored-By: Unknwon * Error format on local repo and wiki deletion --- internal/db/repo.go | 11 +++++++++-- internal/db/user.go | 6 ++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/internal/db/repo.go b/internal/db/repo.go index 8e839ef62..e8f7fe3fa 100644 --- a/internal/db/repo.go +++ b/internal/db/repo.go @@ -1338,7 +1338,8 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error if err = os.Rename(RepoPath(owner.Name, repo.Name), RepoPath(newOwner.Name, repo.Name)); err != nil { return fmt.Errorf("rename repository directory: %v", err) } - RemoveAllWithNotice("Delete repository local copy", repo.LocalCopyPath()) + + deleteRepoLocalCopy(repo) // Rename remote wiki repository to new path and delete local copy. wikiPath := WikiPath(owner.Name, repo.Name) @@ -1352,6 +1353,12 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error return sess.Commit() } +func deleteRepoLocalCopy(repo *Repository) { + repoWorkingPool.CheckIn(com.ToStr(repo.ID)) + defer repoWorkingPool.CheckOut(com.ToStr(repo.ID)) + RemoveAllWithNotice("Delete repository local copy", repo.LocalCopyPath()) +} + // ChangeRepositoryName changes all corresponding setting from old repository name to new one. func ChangeRepositoryName(u *User, oldRepoName, newRepoName string) (err error) { oldRepoName = strings.ToLower(oldRepoName) @@ -1385,7 +1392,7 @@ func ChangeRepositoryName(u *User, oldRepoName, newRepoName string) (err error) RemoveAllWithNotice("Delete repository wiki local copy", repo.LocalWikiPath()) } - RemoveAllWithNotice("Delete repository local copy", repo.LocalCopyPath()) + deleteRepoLocalCopy(repo) return nil } diff --git a/internal/db/user.go b/internal/db/user.go index 3318a4bef..003e2efd0 100644 --- a/internal/db/user.go +++ b/internal/db/user.go @@ -667,13 +667,15 @@ func ChangeUserName(u *User, newUserName string) (err error) { return fmt.Errorf("ChangeUsernameInPullRequests: %v", err) } - // Delete all local copies of repository wiki that user owns. + // Delete all local copies of repositories and wikis the user owns. if err = x.Where("owner_id=?", u.ID).Iterate(new(Repository), func(idx int, bean interface{}) error { repo := bean.(*Repository) + deleteRepoLocalCopy(repo) + // TODO: By the same reasoning, shouldn't we also sync access to the local wiki path? RemoveAllWithNotice("Delete repository wiki local copy", repo.LocalWikiPath()) return nil }); err != nil { - return fmt.Errorf("Delete repository wiki local copy: %v", err) + return fmt.Errorf("delete repository and wiki local copy: %v", err) } // Rename or create user base directory