Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove release attachments which repository has been deleted #9334

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions models/migrations/migrations.go
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,8 @@ var migrations = []Migration{
NewMigration("change review content type to text", changeReviewContentToText),
// v111 -> v112
NewMigration("update branch protection for can push and whitelist enable", addBranchProtectionCanPushAndEnableWhitelist),
// v112 -> v113
NewMigration("remove release attachments which repository deleted", removeAttachmentMissedRepo),
}

// Migrate database to current version
Expand Down
41 changes: 41 additions & 0 deletions models/migrations/v112.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package migrations

import (
"os"

"code.gitea.io/gitea/models"
"xorm.io/builder"
"xorm.io/xorm"
)

func removeAttachmentMissedRepo(x *xorm.Engine) error {
type Attachment struct {
UUID string `xorm:"uuid"`
}
var start int
attachments := make([]*Attachment, 0, 50)
for {
err := x.Select("uuid").Where(builder.NotIn("release_id", builder.Select("id").From("`release`"))).
OrderBy("id").Limit(50, start).Find(&attachments)
if err != nil {
return err
}

for i := 0; i < len(attachments); i++ {
os.RemoveAll(models.AttachmentLocalPath(attachments[i].UUID))
}

if len(attachments) < 50 {
break
}
start += 50
attachments = attachments[:0]
}

_, err := x.Exec("DELETE FROM attachment WHERE release_id NOT IN (SELECT id FROM `release`)")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's better to delete and commit inside the loop, after the for{} with os.RemoveAll, just in case the operation is lengthy. In that case OrderBy and the start parameter will not be needed.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@guillep2k That will spend more time than current implementation. And what's the advantage of that implementation?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lunny It would just proceed in small batches, so if any problems come up during the procedure, at least the work that was done will be commited. On second thought, it not that important in this case.

return err
}