diff options
author | Lauris BH <lauris@nix.lv> | 2017-10-15 02:17:39 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-15 02:17:39 +0300 |
commit | f42dbdbae59600266d03357f9693c659adc9cab3 (patch) | |
tree | 90b42df32a5f064d9055fec37c909aa83c432dcc /models/repo_activity.go | |
parent | 8863e74f2aa7150605712eb21468b6f1305289f7 (diff) | |
download | gitea-f42dbdbae59600266d03357f9693c659adc9cab3.tar.gz gitea-f42dbdbae59600266d03357f9693c659adc9cab3.zip |
Add Activity page to repository (#2674)
* Add Activity page to repository
* Add request data for activity
* Add issue data for activity
* Add user unit right checks
* Add releases to activity
* Log repository unit loading error
Diffstat (limited to 'models/repo_activity.go')
-rw-r--r-- | models/repo_activity.go | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/models/repo_activity.go b/models/repo_activity.go new file mode 100644 index 0000000000..6f01bf20e4 --- /dev/null +++ b/models/repo_activity.go @@ -0,0 +1,242 @@ +// Copyright 2017 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 models + +import ( + "time" + + "github.com/go-xorm/xorm" +) + +// ActivityStats represets issue and pull request information. +type ActivityStats struct { + OpenedPRs PullRequestList + OpenedPRAuthorCount int64 + MergedPRs PullRequestList + MergedPRAuthorCount int64 + OpenedIssues IssueList + OpenedIssueAuthorCount int64 + ClosedIssues IssueList + ClosedIssueAuthorCount int64 + UnresolvedIssues IssueList + PublishedReleases []*Release + PublishedReleaseAuthorCount int64 +} + +// ActivePRCount returns total active pull request count +func (stats *ActivityStats) ActivePRCount() int { + return stats.OpenedPRCount() + stats.MergedPRCount() +} + +// OpenedPRCount returns opened pull request count +func (stats *ActivityStats) OpenedPRCount() int { + return len(stats.OpenedPRs) +} + +// OpenedPRPerc returns opened pull request percents from total active +func (stats *ActivityStats) OpenedPRPerc() int { + return int(float32(stats.OpenedPRCount()) / float32(stats.ActivePRCount()) * 100.0) +} + +// MergedPRCount returns merged pull request count +func (stats *ActivityStats) MergedPRCount() int { + return len(stats.MergedPRs) +} + +// MergedPRPerc returns merged pull request percent from total active +func (stats *ActivityStats) MergedPRPerc() int { + return int(float32(stats.MergedPRCount()) / float32(stats.ActivePRCount()) * 100.0) +} + +// ActiveIssueCount returns total active issue count +func (stats *ActivityStats) ActiveIssueCount() int { + return stats.OpenedIssueCount() + stats.ClosedIssueCount() +} + +// OpenedIssueCount returns open issue count +func (stats *ActivityStats) OpenedIssueCount() int { + return len(stats.OpenedIssues) +} + +// OpenedIssuePerc returns open issue count percent from total active +func (stats *ActivityStats) OpenedIssuePerc() int { + return int(float32(stats.OpenedIssueCount()) / float32(stats.ActiveIssueCount()) * 100.0) +} + +// ClosedIssueCount returns closed issue count +func (stats *ActivityStats) ClosedIssueCount() int { + return len(stats.ClosedIssues) +} + +// ClosedIssuePerc returns closed issue count percent from total active +func (stats *ActivityStats) ClosedIssuePerc() int { + return int(float32(stats.ClosedIssueCount()) / float32(stats.ActiveIssueCount()) * 100.0) +} + +// UnresolvedIssueCount returns unresolved issue and pull request count +func (stats *ActivityStats) UnresolvedIssueCount() int { + return len(stats.UnresolvedIssues) +} + +// PublishedReleaseCount returns published release count +func (stats *ActivityStats) PublishedReleaseCount() int { + return len(stats.PublishedReleases) +} + +// FillPullRequestsForActivity returns pull request information for activity page +func FillPullRequestsForActivity(stats *ActivityStats, baseRepoID int64, fromTime time.Time) error { + var err error + var count int64 + + // Merged pull requests + sess := pullRequestsForActivityStatement(baseRepoID, fromTime, true) + sess.OrderBy("pull_request.merged_unix DESC") + stats.MergedPRs = make(PullRequestList, 0) + if err = sess.Find(&stats.MergedPRs); err != nil { + return err + } + if err = stats.MergedPRs.LoadAttributes(); err != nil { + return err + } + + // Merged pull request authors + sess = pullRequestsForActivityStatement(baseRepoID, fromTime, true) + if _, err = sess.Select("count(distinct issue.poster_id) as `count`").Table("pull_request").Get(&count); err != nil { + return err + } + stats.MergedPRAuthorCount = count + + // Opened pull requests + sess = pullRequestsForActivityStatement(baseRepoID, fromTime, false) + sess.OrderBy("issue.created_unix ASC") + stats.OpenedPRs = make(PullRequestList, 0) + if err = sess.Find(&stats.OpenedPRs); err != nil { + return err + } + if err = stats.OpenedPRs.LoadAttributes(); err != nil { + return err + } + + // Opened pull request authors + sess = pullRequestsForActivityStatement(baseRepoID, fromTime, false) + if _, err = sess.Select("count(distinct issue.poster_id) as `count`").Table("pull_request").Get(&count); err != nil { + return err + } + stats.OpenedPRAuthorCount = count + + return nil +} + +func pullRequestsForActivityStatement(baseRepoID int64, fromTime time.Time, merged bool) *xorm.Session { + sess := x.Where("pull_request.base_repo_id=?", baseRepoID). + Join("INNER", "issue", "pull_request.issue_id = issue.id") + + if merged { + sess.And("pull_request.has_merged = ?", true) + sess.And("pull_request.merged_unix >= ?", fromTime.Unix()) + } else { + sess.And("issue.is_closed = ?", false) + sess.And("issue.created_unix >= ?", fromTime.Unix()) + } + + return sess +} + +// FillIssuesForActivity returns issue information for activity page +func FillIssuesForActivity(stats *ActivityStats, baseRepoID int64, fromTime time.Time) error { + var err error + var count int64 + + // Closed issues + sess := issuesForActivityStatement(baseRepoID, fromTime, true, false) + sess.OrderBy("issue.updated_unix DESC") + stats.ClosedIssues = make(IssueList, 0) + if err = sess.Find(&stats.ClosedIssues); err != nil { + return err + } + + // Closed issue authors + sess = issuesForActivityStatement(baseRepoID, fromTime, true, false) + if _, err = sess.Select("count(distinct issue.poster_id) as `count`").Table("issue").Get(&count); err != nil { + return err + } + stats.ClosedIssueAuthorCount = count + + // New issues + sess = issuesForActivityStatement(baseRepoID, fromTime, false, false) + sess.OrderBy("issue.created_unix ASC") + stats.OpenedIssues = make(IssueList, 0) + if err = sess.Find(&stats.OpenedIssues); err != nil { + return err + } + + // Opened issue authors + sess = issuesForActivityStatement(baseRepoID, fromTime, false, false) + if _, err = sess.Select("count(distinct issue.poster_id) as `count`").Table("issue").Get(&count); err != nil { + return err + } + stats.OpenedIssueAuthorCount = count + + return nil +} + +// FillUnresolvedIssuesForActivity returns unresolved issue and pull request information for activity page +func FillUnresolvedIssuesForActivity(stats *ActivityStats, baseRepoID int64, fromTime time.Time, issues, prs bool) error { + // Check if we need to select anything + if !issues && !prs { + return nil + } + sess := issuesForActivityStatement(baseRepoID, fromTime, false, true) + if !issues || !prs { + sess.And("issue.is_pull = ?", prs) + } + sess.OrderBy("issue.updated_unix DESC") + stats.UnresolvedIssues = make(IssueList, 0) + return sess.Find(&stats.UnresolvedIssues) +} + +func issuesForActivityStatement(baseRepoID int64, fromTime time.Time, closed, unresolved bool) *xorm.Session { + sess := x.Where("issue.repo_id = ?", baseRepoID). + And("issue.is_closed = ?", closed) + + if !unresolved { + sess.And("issue.is_pull = ?", false) + sess.And("issue.created_unix >= ?", fromTime.Unix()) + } else { + sess.And("issue.created_unix < ?", fromTime.Unix()) + sess.And("issue.updated_unix >= ?", fromTime.Unix()) + } + + return sess +} + +// FillReleasesForActivity returns release information for activity page +func FillReleasesForActivity(stats *ActivityStats, baseRepoID int64, fromTime time.Time) error { + var err error + var count int64 + + // Published releases list + sess := releasesForActivityStatement(baseRepoID, fromTime) + sess.OrderBy("release.created_unix DESC") + stats.PublishedReleases = make([]*Release, 0) + if err = sess.Find(&stats.PublishedReleases); err != nil { + return err + } + + // Published releases authors + sess = releasesForActivityStatement(baseRepoID, fromTime) + if _, err = sess.Select("count(distinct release.publisher_id) as `count`").Table("release").Get(&count); err != nil { + return err + } + stats.PublishedReleaseAuthorCount = count + + return nil +} + +func releasesForActivityStatement(baseRepoID int64, fromTime time.Time) *xorm.Session { + return x.Where("release.repo_id = ?", baseRepoID). + And("release.is_draft = ?", false). + And("release.created_unix >= ?", fromTime.Unix()) +} |