Signed-off-by: Lauris Bukšis-Haberkorns <lauris@nix.lv>tags/v1.5.0-dev
@@ -49,6 +49,7 @@ type Issue struct { | |||
DeadlineUnix util.TimeStamp `xorm:"INDEX"` | |||
CreatedUnix util.TimeStamp `xorm:"INDEX created"` | |||
UpdatedUnix util.TimeStamp `xorm:"INDEX updated"` | |||
ClosedUnix util.TimeStamp `xorm:"INDEX"` | |||
Attachments []*Attachment `xorm:"-"` | |||
Comments []*Comment `xorm:"-"` | |||
@@ -612,8 +613,13 @@ func (issue *Issue) changeStatus(e *xorm.Session, doer *User, repo *Repository, | |||
return nil | |||
} | |||
issue.IsClosed = isClosed | |||
if isClosed { | |||
issue.ClosedUnix = util.TimeStampNow() | |||
} else { | |||
issue.ClosedUnix = 0 | |||
} | |||
if err = updateIssueCols(e, issue, "is_closed"); err != nil { | |||
if err = updateIssueCols(e, issue, "is_closed", "closed_unix"); err != nil { | |||
return err | |||
} | |||
@@ -214,13 +214,15 @@ func TestChangeMilestoneIssueStats(t *testing.T) { | |||
"is_closed=0").(*Issue) | |||
issue.IsClosed = true | |||
_, err := x.Cols("is_closed").Update(issue) | |||
issue.ClosedUnix = util.TimeStampNow() | |||
_, err := x.Cols("is_closed", "closed_unix").Update(issue) | |||
assert.NoError(t, err) | |||
assert.NoError(t, changeMilestoneIssueStats(x.NewSession(), issue)) | |||
CheckConsistencyFor(t, &Milestone{}) | |||
issue.IsClosed = false | |||
_, err = x.Cols("is_closed").Update(issue) | |||
issue.ClosedUnix = 0 | |||
_, err = x.Cols("is_closed", "closed_unix").Update(issue) | |||
assert.NoError(t, err) | |||
assert.NoError(t, changeMilestoneIssueStats(x.NewSession(), issue)) | |||
CheckConsistencyFor(t, &Milestone{}) |
@@ -166,6 +166,8 @@ var migrations = []Migration{ | |||
NewMigration("add writable deploy keys", addModeToDeploKeys), | |||
// v56 -> v57 | |||
NewMigration("remove is_owner, num_teams columns from org_user", removeIsOwnerColumnFromOrgUser), | |||
// v57 -> v58 | |||
NewMigration("add closed_unix column for issues", addIssueClosedTime), | |||
} | |||
// Migrate database to current version |
@@ -0,0 +1,30 @@ | |||
// 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 migrations | |||
import ( | |||
"fmt" | |||
"code.gitea.io/gitea/modules/util" | |||
"github.com/go-xorm/xorm" | |||
) | |||
func addIssueClosedTime(x *xorm.Engine) error { | |||
// Issue see models/issue.go | |||
type Issue struct { | |||
ClosedUnix util.TimeStamp `xorm:"INDEX"` | |||
} | |||
if err := x.Sync2(new(Issue)); err != nil { | |||
return fmt.Errorf("Sync2: %v", err) | |||
} | |||
if _, err := x.Exec("UPDATE `issue` SET `closed_unix` = `updated_unix` WHERE `is_closed` = ?", true); err != nil { | |||
return err | |||
} | |||
return nil | |||
} |
@@ -176,7 +176,7 @@ func (stats *ActivityStats) FillIssues(repoID int64, fromTime time.Time) error { | |||
// Closed issues | |||
sess := issuesForActivityStatement(repoID, fromTime, true, false) | |||
sess.OrderBy("issue.updated_unix DESC") | |||
sess.OrderBy("issue.closed_unix DESC") | |||
stats.ClosedIssues = make(IssueList, 0) | |||
if err = sess.Find(&stats.ClosedIssues); err != nil { | |||
return err | |||
@@ -228,7 +228,11 @@ func issuesForActivityStatement(repoID int64, fromTime time.Time, closed, unreso | |||
if !unresolved { | |||
sess.And("issue.is_pull = ?", false) | |||
sess.And("issue.created_unix >= ?", fromTime.Unix()) | |||
if closed { | |||
sess.And("issue.closed_unix >= ?", fromTime.Unix()) | |||
} else { | |||
sess.And("issue.created_unix >= ?", fromTime.Unix()) | |||
} | |||
} else { | |||
sess.And("issue.created_unix < ?", fromTime.Unix()) | |||
sess.And("issue.updated_unix >= ?", fromTime.Unix()) |
@@ -134,7 +134,7 @@ | |||
<p class="desc"> | |||
<div class="ui red label">{{$.i18n.Tr "repo.activity.closed_issue_label"}}</div> | |||
#{{.Index}} <a class="title has-emoji" href="{{$.Repository.HTMLURL}}/issues/{{.Index}}">{{.Title}}</a> | |||
{{TimeSinceUnix .UpdatedUnix $.Lang}} | |||
{{TimeSinceUnix .ClosedUnix $.Lang}} | |||
</p> | |||
{{end}} | |||
</div> |