Refactor timeutil package (#28623)
1. make names more readable 2. remove unused FormatLong/FormatShort 3. use `FormatDate` instead of `Format "2006-01-02"`
This commit is contained in:
		
							parent
							
								
									f3999888c0
								
							
						
					
					
						commit
						e743570f65
					
				
					 9 changed files with 30 additions and 39 deletions
				
			
		| 
						 | 
					@ -59,8 +59,8 @@ func TestGetUserHeatmapDataByUser(t *testing.T) {
 | 
				
			||||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
						assert.NoError(t, unittest.PrepareTestDatabase())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Mock time
 | 
						// Mock time
 | 
				
			||||||
	timeutil.Set(time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC))
 | 
						timeutil.MockSet(time.Date(2021, 1, 1, 0, 0, 0, 0, time.UTC))
 | 
				
			||||||
	defer timeutil.Unset()
 | 
						defer timeutil.MockUnset()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, tc := range testCases {
 | 
						for _, tc := range testCases {
 | 
				
			||||||
		user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: tc.userID})
 | 
							user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: tc.userID})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,8 +107,9 @@ func VerifyGPGKey(ctx context.Context, ownerID int64, keyID, token, signature st
 | 
				
			||||||
// VerificationToken returns token for the user that will be valid in minutes (time)
 | 
					// VerificationToken returns token for the user that will be valid in minutes (time)
 | 
				
			||||||
func VerificationToken(user *user_model.User, minutes int) string {
 | 
					func VerificationToken(user *user_model.User, minutes int) string {
 | 
				
			||||||
	return base.EncodeSha256(
 | 
						return base.EncodeSha256(
 | 
				
			||||||
		time.Now().Truncate(1*time.Minute).Add(time.Duration(minutes)*time.Minute).Format(time.RFC1123Z) + ":" +
 | 
							time.Now().Truncate(1*time.Minute).Add(time.Duration(minutes)*time.Minute).Format(
 | 
				
			||||||
			user.CreatedUnix.FormatLong() + ":" +
 | 
								time.RFC1123Z) + ":" +
 | 
				
			||||||
 | 
								user.CreatedUnix.Format(time.RFC1123Z) + ":" +
 | 
				
			||||||
			user.Name + ":" +
 | 
								user.Name + ":" +
 | 
				
			||||||
			user.Email + ":" +
 | 
								user.Email + ":" +
 | 
				
			||||||
			strconv.FormatInt(user.ID, 10))
 | 
								strconv.FormatInt(user.ID, 10))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -899,15 +899,15 @@ func createDeadlineComment(ctx context.Context, doer *user_model.User, issue *Is
 | 
				
			||||||
	// newDeadline = 0 means deleting
 | 
						// newDeadline = 0 means deleting
 | 
				
			||||||
	if newDeadlineUnix == 0 {
 | 
						if newDeadlineUnix == 0 {
 | 
				
			||||||
		commentType = CommentTypeRemovedDeadline
 | 
							commentType = CommentTypeRemovedDeadline
 | 
				
			||||||
		content = issue.DeadlineUnix.Format("2006-01-02")
 | 
							content = issue.DeadlineUnix.FormatDate()
 | 
				
			||||||
	} else if issue.DeadlineUnix == 0 {
 | 
						} else if issue.DeadlineUnix == 0 {
 | 
				
			||||||
		// Check if the new date was added or modified
 | 
							// Check if the new date was added or modified
 | 
				
			||||||
		// If the actual deadline is 0 => deadline added
 | 
							// If the actual deadline is 0 => deadline added
 | 
				
			||||||
		commentType = CommentTypeAddedDeadline
 | 
							commentType = CommentTypeAddedDeadline
 | 
				
			||||||
		content = newDeadlineUnix.Format("2006-01-02")
 | 
							content = newDeadlineUnix.FormatDate()
 | 
				
			||||||
	} else { // Otherwise modified
 | 
						} else { // Otherwise modified
 | 
				
			||||||
		commentType = CommentTypeModifiedDeadline
 | 
							commentType = CommentTypeModifiedDeadline
 | 
				
			||||||
		content = newDeadlineUnix.Format("2006-01-02") + "|" + issue.DeadlineUnix.Format("2006-01-02")
 | 
							content = newDeadlineUnix.FormatDate() + "|" + issue.DeadlineUnix.FormatDate()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := issue.LoadRepo(ctx); err != nil {
 | 
						if err := issue.LoadRepo(ctx); err != nil {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,7 +86,7 @@ func (m *Milestone) AfterLoad() {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	m.DeadlineString = m.DeadlineUnix.Format("2006-01-02")
 | 
						m.DeadlineString = m.DeadlineUnix.FormatDate()
 | 
				
			||||||
	if m.IsClosed {
 | 
						if m.IsClosed {
 | 
				
			||||||
		m.IsOverdue = m.ClosedDateUnix >= m.DeadlineUnix
 | 
							m.IsOverdue = m.ClosedDateUnix >= m.DeadlineUnix
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,27 +13,27 @@ import (
 | 
				
			||||||
type TimeStamp int64
 | 
					type TimeStamp int64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	// mock is NOT concurrency-safe!!
 | 
						// mockNow is NOT concurrency-safe!!
 | 
				
			||||||
	mock time.Time
 | 
						mockNow time.Time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Used for IsZero, to check if timestamp is the zero time instant.
 | 
						// Used for IsZero, to check if timestamp is the zero time instant.
 | 
				
			||||||
	timeZeroUnix = time.Time{}.Unix()
 | 
						timeZeroUnix = time.Time{}.Unix()
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Set sets the time to a mocked time.Time
 | 
					// MockSet sets the time to a mocked time.Time
 | 
				
			||||||
func Set(now time.Time) {
 | 
					func MockSet(now time.Time) {
 | 
				
			||||||
	mock = now
 | 
						mockNow = now
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Unset will unset the mocked time.Time
 | 
					// MockUnset will unset the mocked time.Time
 | 
				
			||||||
func Unset() {
 | 
					func MockUnset() {
 | 
				
			||||||
	mock = time.Time{}
 | 
						mockNow = time.Time{}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TimeStampNow returns now int64
 | 
					// TimeStampNow returns now int64
 | 
				
			||||||
func TimeStampNow() TimeStamp {
 | 
					func TimeStampNow() TimeStamp {
 | 
				
			||||||
	if !mock.IsZero() {
 | 
						if !mockNow.IsZero() {
 | 
				
			||||||
		return TimeStamp(mock.Unix())
 | 
							return TimeStamp(mockNow.Unix())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return TimeStamp(time.Now().Unix())
 | 
						return TimeStamp(time.Now().Unix())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -89,19 +89,9 @@ func (ts TimeStamp) FormatInLocation(f string, loc *time.Location) string {
 | 
				
			||||||
	return ts.AsTimeInLocation(loc).Format(f)
 | 
						return ts.AsTimeInLocation(loc).Format(f)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FormatLong formats as RFC1123Z
 | 
					// FormatDate formats a date in YYYY-MM-DD
 | 
				
			||||||
func (ts TimeStamp) FormatLong() string {
 | 
					 | 
				
			||||||
	return ts.Format(time.RFC1123Z)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// FormatShort formats as short
 | 
					 | 
				
			||||||
func (ts TimeStamp) FormatShort() string {
 | 
					 | 
				
			||||||
	return ts.Format("Jan 02, 2006")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// FormatDate formats a date in YYYY-MM-DD server time zone
 | 
					 | 
				
			||||||
func (ts TimeStamp) FormatDate() string {
 | 
					func (ts TimeStamp) FormatDate() string {
 | 
				
			||||||
	return time.Unix(int64(ts), 0).String()[:10]
 | 
						return ts.Format("2006-01-02")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsZero is zero time
 | 
					// IsZero is zero time
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,14 +37,14 @@ func TestCheckAuthToken(t *testing.T) {
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	t.Run("Expired", func(t *testing.T) {
 | 
						t.Run("Expired", func(t *testing.T) {
 | 
				
			||||||
		timeutil.Set(time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC))
 | 
							timeutil.MockSet(time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		at, token, err := CreateAuthTokenForUserID(db.DefaultContext, 2)
 | 
							at, token, err := CreateAuthTokenForUserID(db.DefaultContext, 2)
 | 
				
			||||||
		assert.NoError(t, err)
 | 
							assert.NoError(t, err)
 | 
				
			||||||
		assert.NotNil(t, at)
 | 
							assert.NotNil(t, at)
 | 
				
			||||||
		assert.NotEmpty(t, token)
 | 
							assert.NotEmpty(t, token)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		timeutil.Unset()
 | 
							timeutil.MockUnset()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		at2, err := CheckAuthToken(db.DefaultContext, at.ID+":"+token)
 | 
							at2, err := CheckAuthToken(db.DefaultContext, at.ID+":"+token)
 | 
				
			||||||
		assert.ErrorIs(t, err, ErrAuthTokenExpired)
 | 
							assert.ErrorIs(t, err, ErrAuthTokenExpired)
 | 
				
			||||||
| 
						 | 
					@ -83,15 +83,15 @@ func TestCheckAuthToken(t *testing.T) {
 | 
				
			||||||
func TestRegenerateAuthToken(t *testing.T) {
 | 
					func TestRegenerateAuthToken(t *testing.T) {
 | 
				
			||||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
						assert.NoError(t, unittest.PrepareTestDatabase())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	timeutil.Set(time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC))
 | 
						timeutil.MockSet(time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC))
 | 
				
			||||||
	defer timeutil.Unset()
 | 
						defer timeutil.MockUnset()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	at, token, err := CreateAuthTokenForUserID(db.DefaultContext, 2)
 | 
						at, token, err := CreateAuthTokenForUserID(db.DefaultContext, 2)
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
	assert.NotNil(t, at)
 | 
						assert.NotNil(t, at)
 | 
				
			||||||
	assert.NotEmpty(t, token)
 | 
						assert.NotEmpty(t, token)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	timeutil.Set(time.Date(2023, 1, 1, 0, 0, 1, 0, time.UTC))
 | 
						timeutil.MockSet(time.Date(2023, 1, 1, 0, 0, 1, 0, time.UTC))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	at2, token2, err := RegenerateAuthToken(db.DefaultContext, at)
 | 
						at2, token2, err := RegenerateAuthToken(db.DefaultContext, at)
 | 
				
			||||||
	assert.NoError(t, err)
 | 
						assert.NoError(t, err)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -392,7 +392,7 @@
 | 
				
			||||||
			<div {{if ne .Issue.DeadlineUnix 0}} class="gt-hidden"{{end}} id="deadlineForm">
 | 
								<div {{if ne .Issue.DeadlineUnix 0}} class="gt-hidden"{{end}} id="deadlineForm">
 | 
				
			||||||
				<form class="ui fluid action input issue-due-form" action="{{AppSubUrl}}/{{PathEscape .Repository.Owner.Name}}/{{PathEscape .Repository.Name}}/issues/{{.Issue.Index}}/deadline" method="post" id="update-issue-deadline-form">
 | 
									<form class="ui fluid action input issue-due-form" action="{{AppSubUrl}}/{{PathEscape .Repository.Owner.Name}}/{{PathEscape .Repository.Name}}/issues/{{.Issue.Index}}/deadline" method="post" id="update-issue-deadline-form">
 | 
				
			||||||
					{{$.CsrfTokenHtml}}
 | 
										{{$.CsrfTokenHtml}}
 | 
				
			||||||
					<input required placeholder="{{ctx.Locale.Tr "repo.issues.due_date_form"}}" {{if gt .Issue.DeadlineUnix 0}}value="{{.Issue.DeadlineUnix.Format "2006-01-02"}}"{{end}} type="date" name="deadlineDate" id="deadlineDate">
 | 
										<input required placeholder="{{ctx.Locale.Tr "repo.issues.due_date_form"}}" {{if gt .Issue.DeadlineUnix 0}}value="{{.Issue.DeadlineUnix.FormatDate}}"{{end}} type="date" name="deadlineDate" id="deadlineDate">
 | 
				
			||||||
					<button class="ui icon button">
 | 
										<button class="ui icon button">
 | 
				
			||||||
						{{if ne .Issue.DeadlineUnix 0}}
 | 
											{{if ne .Issue.DeadlineUnix 0}}
 | 
				
			||||||
							{{svg "octicon-pencil"}}
 | 
												{{svg "octicon-pencil"}}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -114,7 +114,7 @@
 | 
				
			||||||
						<span class="due-date flex-text-inline" data-tooltip-content="{{ctx.Locale.Tr "repo.issues.due_date"}}">
 | 
											<span class="due-date flex-text-inline" data-tooltip-content="{{ctx.Locale.Tr "repo.issues.due_date"}}">
 | 
				
			||||||
							<span{{if .IsOverdue}} class="text red"{{end}}>
 | 
												<span{{if .IsOverdue}} class="text red"{{end}}>
 | 
				
			||||||
								{{svg "octicon-calendar" 14}}
 | 
													{{svg "octicon-calendar" 14}}
 | 
				
			||||||
								{{DateTime "short" (.DeadlineUnix.Format "2006-01-02")}}
 | 
													{{DateTime "short" (.DeadlineUnix.FormatDate)}}
 | 
				
			||||||
							</span>
 | 
												</span>
 | 
				
			||||||
						</span>
 | 
											</span>
 | 
				
			||||||
					{{end}}
 | 
										{{end}}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,8 +24,8 @@ func TestUserHeatmap(t *testing.T) {
 | 
				
			||||||
	token := getUserToken(t, adminUsername, auth_model.AccessTokenScopeReadUser)
 | 
						token := getUserToken(t, adminUsername, auth_model.AccessTokenScopeReadUser)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fakeNow := time.Date(2011, 10, 20, 0, 0, 0, 0, time.Local)
 | 
						fakeNow := time.Date(2011, 10, 20, 0, 0, 0, 0, time.Local)
 | 
				
			||||||
	timeutil.Set(fakeNow)
 | 
						timeutil.MockSet(fakeNow)
 | 
				
			||||||
	defer timeutil.Unset()
 | 
						defer timeutil.MockUnset()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/users/%s/heatmap", normalUsername)).
 | 
						req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/users/%s/heatmap", normalUsername)).
 | 
				
			||||||
		AddTokenAuth(token)
 | 
							AddTokenAuth(token)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue