]> source.dussan.org Git - gitea.git/commitdiff
Repo Activity: count new issues that were closed (#31776)
authorTimon van der Berg <tmnvanderberg@gmail.com>
Sat, 21 Sep 2024 18:57:01 +0000 (20:57 +0200)
committerGitHub <noreply@github.com>
Sat, 21 Sep 2024 18:57:01 +0000 (18:57 +0000)
I'm new to go and contributing to gitea, your guidance is much
appreciated.

This is meant to solve https://github.com/go-gitea/gitea/issues/13309

Previously, closed issues would not be shown under new issues in the
activity tab, even if they were newly created.

changes:
* Split out newlyCreatedIssues from issuesForActivityStatement to count
  both currently open and closed issues.
* Use a seperate function to count active issues to prevent
double-counting issues after the above change.

Result is that new issues that have been closed are shown both under
"new" and "closed".

Signed-off-by: Timon van der Berg <tmnvanderberg@gmail.com>
models/activities/repo_activity.go

index ba5e4959f0df86cf7240a21b3e20e5069beab35e..3ffad035b7a04980186901bfbf21c281d67ca754 100644 (file)
@@ -34,6 +34,7 @@ type ActivityStats struct {
        OpenedPRAuthorCount         int64
        MergedPRs                   issues_model.PullRequestList
        MergedPRAuthorCount         int64
+       ActiveIssues                issues_model.IssueList
        OpenedIssues                issues_model.IssueList
        OpenedIssueAuthorCount      int64
        ClosedIssues                issues_model.IssueList
@@ -172,7 +173,7 @@ func (stats *ActivityStats) MergedPRPerc() int {
 
 // ActiveIssueCount returns total active issue count
 func (stats *ActivityStats) ActiveIssueCount() int {
-       return stats.OpenedIssueCount() + stats.ClosedIssueCount()
+       return len(stats.ActiveIssues)
 }
 
 // OpenedIssueCount returns open issue count
@@ -285,13 +286,21 @@ func (stats *ActivityStats) FillIssues(ctx context.Context, repoID int64, fromTi
        stats.ClosedIssueAuthorCount = count
 
        // New issues
-       sess = issuesForActivityStatement(ctx, repoID, fromTime, false, false)
+       sess = newlyCreatedIssues(ctx, repoID, fromTime)
        sess.OrderBy("issue.created_unix ASC")
        stats.OpenedIssues = make(issues_model.IssueList, 0)
        if err = sess.Find(&stats.OpenedIssues); err != nil {
                return err
        }
 
+       // Active issues
+       sess = activeIssues(ctx, repoID, fromTime)
+       sess.OrderBy("issue.created_unix ASC")
+       stats.ActiveIssues = make(issues_model.IssueList, 0)
+       if err = sess.Find(&stats.ActiveIssues); err != nil {
+               return err
+       }
+
        // Opened issue authors
        sess = issuesForActivityStatement(ctx, repoID, fromTime, false, false)
        if _, err = sess.Select("count(distinct issue.poster_id) as `count`").Table("issue").Get(&count); err != nil {
@@ -317,6 +326,23 @@ func (stats *ActivityStats) FillUnresolvedIssues(ctx context.Context, repoID int
        return sess.Find(&stats.UnresolvedIssues)
 }
 
+func newlyCreatedIssues(ctx context.Context, repoID int64, fromTime time.Time) *xorm.Session {
+       sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID).
+               And("issue.is_pull = ?", false).                // Retain the is_pull check to exclude pull requests
+               And("issue.created_unix >= ?", fromTime.Unix()) // Include all issues created after fromTime
+
+       return sess
+}
+
+func activeIssues(ctx context.Context, repoID int64, fromTime time.Time) *xorm.Session {
+       sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID).
+               And("issue.is_pull = ?", false).
+               And("issue.created_unix >= ?", fromTime.Unix()).
+               Or("issue.closed_unix >= ?", fromTime.Unix())
+
+       return sess
+}
+
 func issuesForActivityStatement(ctx context.Context, repoID int64, fromTime time.Time, closed, unresolved bool) *xorm.Session {
        sess := db.GetEngine(ctx).Where("issue.repo_id = ?", repoID).
                And("issue.is_closed = ?", closed)