@@ -7,26 +7,57 @@ import (
7
7
"regexp"
8
8
"strconv"
9
9
"strings"
10
+ "time"
11
+
12
+ "github.com/golang-module/carbon/v2"
13
+ "github.com/stackup-app/stackup/lib/cache"
10
14
)
11
15
12
16
type Release struct {
13
- Name string `json:"name"`
14
- TagName string `json:"tag_name"`
15
- Prerelease bool `json:"prerelease"`
17
+ Name string `json:"name"`
18
+ TagName string `json:"tag_name"`
19
+ Prerelease bool `json:"prerelease"`
20
+ PublishedAt string `json:"published_at"`
21
+
22
+ DaysSinceRelease int
23
+ HoursSinceRelease int
24
+ TimeSinceRelease string
16
25
}
17
26
18
27
func GetUpdateCheckUrlFormat () string {
19
28
return "https://api.github.com/repos/%s/%s/releases/latest"
20
29
}
21
30
22
31
// Example: IsLatestApplicationReleaseNewerThanCurrent("v0.0.1", "permafrost-dev/stackup")
23
- func IsLatestApplicationReleaseNewerThanCurrent (currentVersion string , githubRepository string ) bool {
32
+ func IsLatestApplicationReleaseNewerThanCurrent (c * cache.Cache , currentVersion string , githubRepository string ) (bool , * Release ) {
33
+ if c .Has ("latest-release:" + githubRepository ) && ! c .IsExpired ("latest-release:" + githubRepository ) {
34
+ var release = Release {}
35
+ releaseJson , found := c .Get ("latest-release:" + githubRepository )
36
+ if found {
37
+ json .Unmarshal ([]byte (releaseJson .Value ), & release )
38
+ latest := extractSemver (release .TagName )
39
+ current := extractSemver (currentVersion )
40
+
41
+ release .TimeSinceRelease = carbon .Parse (release .PublishedAt ).DiffForHumans ()
42
+ return isGreaterSemver (latest , current ), & release
43
+ }
44
+ }
45
+
24
46
latestRelease := getLatestApplicationRelease (githubRepository )
25
47
48
+ latestRelease .TimeSinceRelease = carbon .Parse (latestRelease .PublishedAt ).DiffForHumans ()
49
+
50
+ //cache the response
51
+ latestReleaseJson , _ := json .Marshal (latestRelease )
52
+ expires := carbon .Now ().AddMinutes (60 )
53
+ updatedAt := carbon .Now ()
54
+ entry := cache .CreateCacheEntry ("latest-release" + githubRepository , string (latestReleaseJson ), & expires , "" , "" , & updatedAt )
55
+ c .Set ("latest-release:" + githubRepository , entry , 60 )
56
+
26
57
latest := extractSemver (latestRelease .TagName )
27
58
current := extractSemver (currentVersion )
28
59
29
- return isGreaterSemver (latest , current )
60
+ return isGreaterSemver (latest , current ), latestRelease
30
61
}
31
62
32
63
func getLatestApplicationRelease (repository string ) * Release {
@@ -37,12 +68,22 @@ func getLatestApplicationRelease(repository string) *Release {
37
68
release , err := getLatestReleaseForRepository (owner , repoName )
38
69
if err != nil {
39
70
return & Release {
40
- Name : "unknown" ,
41
- TagName : "v0.0.0" ,
42
- Prerelease : false ,
71
+ Name : "unknown" ,
72
+ TagName : "v0.0.0" ,
73
+ Prerelease : false ,
74
+ DaysSinceRelease : 0 ,
43
75
}
44
76
}
45
77
78
+ release .DaysSinceRelease , _ = daysSinceDate (release .PublishedAt )
79
+ release .HoursSinceRelease , _ = hoursSinceDate (release .PublishedAt )
80
+
81
+ if release .DaysSinceRelease == 0 {
82
+ release .TimeSinceRelease = fmt .Sprintf ("%d hours ago" , release .HoursSinceRelease )
83
+ } else {
84
+ release .TimeSinceRelease = fmt .Sprintf ("%d days ago" , release .DaysSinceRelease )
85
+ }
86
+
46
87
return release
47
88
}
48
89
@@ -94,3 +135,29 @@ func extractSemver(version string) string {
94
135
95
136
return version
96
137
}
138
+
139
+ func daysSinceDate (dateString string ) (int , error ) {
140
+ layout := "2006-01-02T15:04:05Z"
141
+ parsedDate , err := time .Parse (layout , dateString )
142
+ if err != nil {
143
+ return 0 , err
144
+ }
145
+
146
+ currentTime := time .Now ()
147
+ difference := currentTime .Sub (parsedDate )
148
+ days := int (difference .Hours () / 24 )
149
+ return days , nil
150
+ }
151
+
152
+ func hoursSinceDate (dateString string ) (int , error ) {
153
+ layout := "2006-01-02T15:04:05Z"
154
+ parsedDate , err := time .Parse (layout , dateString )
155
+ if err != nil {
156
+ return 0 , err
157
+ }
158
+
159
+ currentTime := time .Now ()
160
+ difference := currentTime .Sub (parsedDate )
161
+ hours := int (difference .Hours ())
162
+ return hours , nil
163
+ }
0 commit comments