From 912ce274210727f185478176774f80269af16878 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Fri, 31 Jan 2020 10:04:49 +0200 Subject: [PATCH] Update topics repo count when deleting repository (#10081) --- models/repo.go | 6 ++++++ models/topic.go | 24 +++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/models/repo.go b/models/repo.go index 3071c11f3..804320a2b 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1910,6 +1910,12 @@ func DeleteRepository(doer *User, uid, repoID int64) error { return err } + if len(repo.Topics) > 0 { + if err = removeTopicsFromRepo(sess, repo.ID); err != nil { + return err + } + } + // FIXME: Remove repository files should be executed after transaction succeed. repoPath := repo.repoPath(sess) removeAllWithNotice(sess, "Delete repository files", repoPath) diff --git a/models/topic.go b/models/topic.go index e4fda03fc..f4d414bf3 100644 --- a/models/topic.go +++ b/models/topic.go @@ -129,7 +129,7 @@ func addTopicByNameToRepo(e Engine, repoID int64, topicName string) (*Topic, err } // removeTopicFromRepo remove a topic from a repo and decrements the topic repo count -func removeTopicFromRepo(repoID int64, topic *Topic, e Engine) error { +func removeTopicFromRepo(e Engine, repoID int64, topic *Topic) error { topic.RepoCount-- if _, err := e.ID(topic.ID).Cols("repo_count").Update(topic); err != nil { return err @@ -145,6 +145,24 @@ func removeTopicFromRepo(repoID int64, topic *Topic, e Engine) error { return nil } +// removeTopicsFromRepo remove all topics from the repo and decrements respective topics repo count +func removeTopicsFromRepo(e Engine, repoID int64) error { + _, err := e.Where( + builder.In("id", + builder.Select("topic_id").From("repo_topic").Where(builder.Eq{"repo_id": repoID}), + ), + ).Cols("repo_count").SetExpr("repo_count", "repo_count-1").Update(&Topic{}) + if err != nil { + return err + } + + if _, err = e.Delete(&RepoTopic{RepoID: repoID}); err != nil { + return err + } + + return nil +} + // FindTopicOptions represents the options when fdin topics type FindTopicOptions struct { RepoID int64 @@ -217,7 +235,7 @@ func DeleteTopic(repoID int64, topicName string) (*Topic, error) { return nil, nil } - err = removeTopicFromRepo(repoID, topic, x) + err = removeTopicFromRepo(x, repoID, topic) return topic, err } @@ -278,7 +296,7 @@ func SaveTopics(repoID int64, topicNames ...string) error { } for _, topic := range removeTopics { - err := removeTopicFromRepo(repoID, topic, sess) + err := removeTopicFromRepo(sess, repoID, topic) if err != nil { return err }