From 9ab36c55fa141d2787ab61819f207715d6eb31ac Mon Sep 17 00:00:00 2001 From: Norwin Date: Tue, 29 Mar 2022 06:37:13 +0800 Subject: [PATCH] Return RFC3339 UTC timestamps for machine-readable output (#470) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### ⚠️ breaking changes ⚠️ - unset timestamps will not be printed as `"0001-01-01 00:00"`, but as empty value `""` - output formats `csv`, `tsv`, `yaml` output timestamps in UTC instead of local time, and adhere to [RFC3339](https://datatracker.ietf.org/doc/html/rfc3339) Co-authored-by: Norwin Co-authored-by: 6543 <6543@obermui.de> Reviewed-on: https://gitea.com/gitea/tea/pulls/470 Reviewed-by: 6543 <6543@obermui.de> Reviewed-by: John Olheiser Co-authored-by: Norwin Co-committed-by: Norwin --- modules/print/comment.go | 4 ++-- modules/print/formatters.go | 14 ++++++++++++-- modules/print/issue.go | 8 ++++---- modules/print/milestone.go | 4 ++-- modules/print/pull.go | 8 ++++---- modules/print/release.go | 2 +- modules/print/repo.go | 2 +- modules/print/times.go | 2 +- 8 files changed, 27 insertions(+), 17 deletions(-) diff --git a/modules/print/comment.go b/modules/print/comment.go index 3fbe5f1..64947d1 100644 --- a/modules/print/comment.go +++ b/modules/print/comment.go @@ -38,12 +38,12 @@ func Comment(c *gitea.Comment) { func formatComment(c *gitea.Comment) string { edited := "" if c.Updated.After(c.Created) { - edited = fmt.Sprintf(" *(edited on %s)*", FormatTime(c.Updated)) + edited = fmt.Sprintf(" *(edited on %s)*", FormatTime(c.Updated, false)) } return fmt.Sprintf( "---\n\n**@%s** wrote on %s%s:\n\n%s\n", c.Poster.UserName, - FormatTime(c.Created), + FormatTime(c.Created, false), edited, c.Body, ) diff --git a/modules/print/formatters.go b/modules/print/formatters.go index fc33151..d9f9797 100644 --- a/modules/print/formatters.go +++ b/modules/print/formatters.go @@ -36,8 +36,18 @@ func formatSize(kb int64) string { return fmt.Sprintf("%d Tb", gb/1024) } -// FormatTime give a date-time in local timezone if available -func FormatTime(t time.Time) string { +// FormatTime provides a string for the given time value. +// If machineReadable is set, a UTC RFC3339 string is returned, +// otherwise a simplified string in local time is used. +func FormatTime(t time.Time, machineReadable bool) string { + if t.IsZero() { + return "" + } + + if machineReadable { + return t.UTC().Format(time.RFC3339) + } + location, err := time.LoadLocation("Local") if err != nil { return t.Format("2006-01-02 15:04 UTC") diff --git a/modules/print/issue.go b/modules/print/issue.go index 8f2fb5f..ec1c892 100644 --- a/modules/print/issue.go +++ b/modules/print/issue.go @@ -20,7 +20,7 @@ func IssueDetails(issue *gitea.Issue, reactions []*gitea.Reaction) { issue.Title, issue.State, issue.Poster.UserName, - FormatTime(issue.Created), + FormatTime(issue.Created, false), issue.Body, ) @@ -119,14 +119,14 @@ func (x printableIssue) FormatField(field string, machineReadable bool) string { case "body": return x.Body case "created": - return FormatTime(x.Created) + return FormatTime(x.Created, machineReadable) case "updated": - return FormatTime(x.Updated) + return FormatTime(x.Updated, machineReadable) case "deadline": if x.Deadline == nil { return "" } - return FormatTime(*x.Deadline) + return FormatTime(*x.Deadline, machineReadable) case "milestone": if x.Milestone != nil { return x.Milestone.Title diff --git a/modules/print/milestone.go b/modules/print/milestone.go index 269862d..2997e22 100644 --- a/modules/print/milestone.go +++ b/modules/print/milestone.go @@ -19,7 +19,7 @@ func MilestoneDetails(milestone *gitea.Milestone) { fmt.Printf("\n%s\n", milestone.Description) } if milestone.Deadline != nil && !milestone.Deadline.IsZero() { - fmt.Printf("\nDeadline: %s\n", FormatTime(*milestone.Deadline)) + fmt.Printf("\nDeadline: %s\n", FormatTime(*milestone.Deadline, false)) } } @@ -42,7 +42,7 @@ func MilestonesList(miles []*gitea.Milestone, output string, state gitea.StateTy var deadline = "" if m.Deadline != nil && !m.Deadline.IsZero() { - deadline = FormatTime(*m.Deadline) + deadline = FormatTime(*m.Deadline, isMachineReadable(output)) } item := []string{ diff --git a/modules/print/pull.go b/modules/print/pull.go index 2bc14b5..d3f11a3 100644 --- a/modules/print/pull.go +++ b/modules/print/pull.go @@ -31,7 +31,7 @@ func PullDetails(pr *gitea.PullRequest, reviews []*gitea.PullReview, ciStatus *g pr.Title, state, pr.Poster.UserName, - FormatTime(*pr.Created), + FormatTime(*pr.Created, false), base, head, pr.Body, @@ -195,14 +195,14 @@ func (x printablePull) FormatField(field string, machineReadable bool) string { case "body": return x.Body case "created": - return FormatTime(*x.Created) + return FormatTime(*x.Created, machineReadable) case "updated": - return FormatTime(*x.Updated) + return FormatTime(*x.Updated, machineReadable) case "deadline": if x.Deadline == nil { return "" } - return FormatTime(*x.Deadline) + return FormatTime(*x.Deadline, machineReadable) case "milestone": if x.Milestone != nil { return x.Milestone.Title diff --git a/modules/print/release.go b/modules/print/release.go index da5acf1..59b9c3b 100644 --- a/modules/print/release.go +++ b/modules/print/release.go @@ -28,7 +28,7 @@ func ReleasesList(releases []*gitea.Release, output string) { t.addRow( release.TagName, release.Title, - FormatTime(release.PublishedAt), + FormatTime(release.PublishedAt, isMachineReadable(output)), status, release.TarURL, ) diff --git a/modules/print/repo.go b/modules/print/repo.go index dbe193a..e7c3962 100644 --- a/modules/print/repo.go +++ b/modules/print/repo.go @@ -124,7 +124,7 @@ func (x printableRepo) FormatField(field string, machineReadable bool) string { case "ssh": return x.SSHURL case "updated": - return FormatTime(x.Updated) + return FormatTime(x.Updated, machineReadable) case "url": return x.HTMLURL case "permission": diff --git a/modules/print/times.go b/modules/print/times.go index deb04e1..5157666 100644 --- a/modules/print/times.go +++ b/modules/print/times.go @@ -50,7 +50,7 @@ func (t printableTrackedTime) FormatField(field string, machineReadable bool) st case "id": return fmt.Sprintf("%d", t.ID) case "created": - return FormatTime(t.Created) + return FormatTime(t.Created, machineReadable) case "repo": return t.Issue.Repository.FullName case "issue":