Fix bug that release attachment files not deleted when deleting repository (#9322)

* Fix bug that release attachment files not deleted when deleting repository

* improve code

* add quote

* improve code
This commit is contained in:
Lunny Xiao 2019-12-12 13:31:05 +08:00 committed by GitHub
parent aceb1085c7
commit 751cfb805d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1992,6 +1992,17 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
} }
} }
attachments := make([]*Attachment, 0, 20)
if err = sess.Join("INNER", "`release`", "`release`.id = `attachment`.release_id").
Where("`release`.repo_id = ?", repoID).
Find(&attachments); err != nil {
return err
}
releaseAttachments := make([]string, 0, len(attachments))
for i := 0; i < len(attachments); i++ {
releaseAttachments = append(releaseAttachments, attachments[i].LocalPath())
}
if err = deleteBeans(sess, if err = deleteBeans(sess,
&Access{RepoID: repo.ID}, &Access{RepoID: repo.ID},
&Action{RepoID: repo.ID}, &Action{RepoID: repo.ID},
@ -2042,13 +2053,13 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
return err return err
} }
attachmentPaths := make([]string, 0, 20) attachments = attachments[:0]
attachments := make([]*Attachment, 0, len(attachmentPaths))
if err = sess.Join("INNER", "issue", "issue.id = attachment.issue_id"). if err = sess.Join("INNER", "issue", "issue.id = attachment.issue_id").
Where("issue.repo_id = ?", repoID). Where("issue.repo_id = ?", repoID).
Find(&attachments); err != nil { Find(&attachments); err != nil {
return err return err
} }
attachmentPaths := make([]string, 0, len(attachments))
for j := range attachments { for j := range attachments {
attachmentPaths = append(attachmentPaths, attachments[j].LocalPath()) attachmentPaths = append(attachmentPaths, attachments[j].LocalPath())
} }
@ -2085,11 +2096,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
return err return err
} }
// Remove attachment files.
for i := range attachmentPaths {
removeAllWithNotice(sess, "Delete attachment", attachmentPaths[i])
}
// Remove LFS objects // Remove LFS objects
var lfsObjects []*LFSMetaObject var lfsObjects []*LFSMetaObject
if err = sess.Where("repository_id=?", repoID).Find(&lfsObjects); err != nil { if err = sess.Where("repository_id=?", repoID).Find(&lfsObjects); err != nil {
@ -2129,6 +2135,21 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
return fmt.Errorf("Commit: %v", err) return fmt.Errorf("Commit: %v", err)
} }
sess.Close()
// We should always delete the files after the database transaction succeed. If
// we delete the file but the database rollback, the repository will be borken.
// Remove issue attachment files.
for i := range attachmentPaths {
removeAllWithNotice(x, "Delete issue attachment", attachmentPaths[i])
}
// Remove release attachment files.
for i := range releaseAttachments {
removeAllWithNotice(x, "Delete release attachment", releaseAttachments[i])
}
if len(repo.Avatar) > 0 { if len(repo.Avatar) > 0 {
avatarPath := repo.CustomAvatarPath() avatarPath := repo.CustomAvatarPath()
if com.IsExist(avatarPath) { if com.IsExist(avatarPath) {