summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2019-12-12 15:05:44 +0800
committerGitHub <noreply@github.com>2019-12-12 15:05:44 +0800
commiteb8d5f6affd4d96c375e354534ecd3faeaffaa97 (patch)
tree4a3ac1a39fa1b50ea154a27cb004d08dc388f93f
parent9ef148abeb1036e0d0b9899e71c95ecd20701dc4 (diff)
downloadgitea-eb8d5f6affd4d96c375e354534ecd3faeaffaa97.tar.gz
gitea-eb8d5f6affd4d96c375e354534ecd3faeaffaa97.zip
Fix bug that release attachment files not deleted when deleting repository (#9322) (#9329)
* Fix bug that release attachment files not deleted when deleting repository * improve code * add quote * improve code
-rw-r--r--models/repo.go35
1 files changed, 28 insertions, 7 deletions
diff --git a/models/repo.go b/models/repo.go
index 8875c96376..2d31184d6d 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -1860,6 +1860,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,
&Access{RepoID: repo.ID},
&Action{RepoID: repo.ID},
@@ -1910,13 +1921,13 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
return err
}
- attachmentPaths := make([]string, 0, 20)
- attachments := make([]*Attachment, 0, len(attachmentPaths))
+ attachments = attachments[:0]
if err = sess.Join("INNER", "issue", "issue.id = attachment.issue_id").
Where("issue.repo_id = ?", repoID).
Find(&attachments); err != nil {
return err
}
+ attachmentPaths := make([]string, 0, len(attachments))
for j := range attachments {
attachmentPaths = append(attachmentPaths, attachments[j].LocalPath())
}
@@ -1953,11 +1964,6 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
return err
}
- // Remove attachment files.
- for i := range attachmentPaths {
- removeAllWithNotice(sess, "Delete attachment", attachmentPaths[i])
- }
-
// Remove LFS objects
var lfsObjects []*LFSMetaObject
if err = sess.Where("repository_id=?", repoID).Find(&lfsObjects); err != nil {
@@ -1997,6 +2003,8 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
return fmt.Errorf("Commit: %v", err)
}
+ sess.Close()
+
if org.IsOrganization() {
if err = PrepareWebhooks(repo, HookEventRepository, &api.RepositoryPayload{
Action: api.HookRepoDeleted,
@@ -2009,6 +2017,19 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
go HookQueue.Add(repo.ID)
}
+ // 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 {
avatarPath := repo.CustomAvatarPath()
if com.IsExist(avatarPath) {