From 63bd1b92037c5deb1bb13b0753855a689b9450bc Mon Sep 17 00:00:00 2001 From: Harshit Bansal Date: Tue, 1 Jan 2019 04:30:54 +0530 Subject: [PATCH] mirror: Delete tags in mirror which are removed for original repo. (#5609) This bug was being caused by an error in the logic in `release.go`. Credit to @yasuokav for tracing the root of the issue. Fixes: #5192. --- models/release.go | 4 +-- models/release_test.go | 55 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/models/release.go b/models/release.go index c18e152293..c1c8b933d0 100644 --- a/models/release.go +++ b/models/release.go @@ -479,10 +479,10 @@ func SyncReleasesWithTags(repo *Repository, gitRepo *git.Repository) error { continue } commitID, err := gitRepo.GetTagCommitID(rel.TagName) - if err != nil { + if err != nil && !git.IsErrNotExist(err) { return fmt.Errorf("GetTagCommitID: %v", err) } - if !gitRepo.IsTagExist(rel.TagName) || commitID != rel.Sha1 { + if git.IsErrNotExist(err) || commitID != rel.Sha1 { if err := pushUpdateDeleteTag(repo, gitRepo, rel.TagName); err != nil { return fmt.Errorf("pushUpdateDeleteTag: %v", err) } diff --git a/models/release_test.go b/models/release_test.go index de3155f6bd..de34109e8c 100644 --- a/models/release_test.go +++ b/models/release_test.go @@ -94,3 +94,58 @@ func TestRelease_Create(t *testing.T) { IsTag: true, }, nil)) } + +func TestRelease_MirrorDelete(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) + repo := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository) + repoPath := RepoPath(user.Name, repo.Name) + migrationOptions := MigrateRepoOptions{ + Name: "test_mirror", + Description: "Test mirror", + IsPrivate: false, + IsMirror: true, + RemoteAddr: repoPath, + } + mirror, err := MigrateRepository(user, user, migrationOptions) + assert.NoError(t, err) + + gitRepo, err := git.OpenRepository(repoPath) + assert.NoError(t, err) + + findOptions := FindReleasesOptions{IncludeDrafts: true, IncludeTags: true} + initCount, err := GetReleaseCountByRepoID(mirror.ID, findOptions) + assert.NoError(t, err) + + assert.NoError(t, CreateRelease(gitRepo, &Release{ + RepoID: repo.ID, + PublisherID: user.ID, + TagName: "v0.2", + Target: "master", + Title: "v0.2 is released", + Note: "v0.2 is released", + IsDraft: false, + IsPrerelease: false, + IsTag: true, + }, nil)) + + err = mirror.GetMirror() + assert.NoError(t, err) + + _, ok := mirror.Mirror.runSync() + assert.True(t, ok) + + count, err := GetReleaseCountByRepoID(mirror.ID, findOptions) + assert.EqualValues(t, initCount+1, count) + + release, err := GetRelease(repo.ID, "v0.2") + assert.NoError(t, err) + assert.NoError(t, DeleteReleaseByID(release.ID, user, true)) + + _, ok = mirror.Mirror.runSync() + assert.True(t, ok) + + count, err = GetReleaseCountByRepoID(mirror.ID, findOptions) + assert.EqualValues(t, initCount, count) +}