@@ -177,75 +177,97 @@ func getAndUpdateDependency(ctx context.Context, client *github.Client, dependen
177177}
178178
179179func getVersionAndCommit (ctx context.Context , client * github.Client , dependencies Dependencies , dependencyType string ) (string , string , VersionUpdateInfo , error ) {
180- var version * github.RepositoryRelease
180+ var selectedTag * github.RepositoryTag
181181 var commit string
182182 var diffUrl string
183183 var updatedDependency VersionUpdateInfo
184- foundPrefixVersion := false
185184 options := & github.ListOptions {Page : 1 }
185+ currentTag := dependencies [dependencyType ].Tag
186+ tagPrefix := dependencies [dependencyType ].TagPrefix
187+
186188 if dependencies [dependencyType ].Tracking == "tag" {
189+ // Collect all valid tags across all pages, then find the max version
190+ var validTags []* github.RepositoryTag
191+
187192 for {
188- releases , resp , err := client .Repositories .ListReleases (
193+ tags , resp , err := client .Repositories .ListTags (
189194 ctx ,
190195 dependencies [dependencyType ].Owner ,
191196 dependencies [dependencyType ].Repo ,
192197 options )
193198
194199 if err != nil {
195- return "" , "" , VersionUpdateInfo {}, fmt .Errorf ("error getting releases : %s" , err )
200+ return "" , "" , VersionUpdateInfo {}, fmt .Errorf ("error getting tags : %s" , err )
196201 }
197202
198- if dependencies [dependencyType ].TagPrefix == "" {
199- version = releases [0 ]
200- if * version .TagName != dependencies [dependencyType ].Tag {
201- diffUrl = generateGithubRepoUrl (dependencies , dependencyType ) + "/compare/" +
202- dependencies [dependencyType ].Tag + "..." + * version .TagName
203- }
204- break
205- } else if dependencies [dependencyType ].TagPrefix != "" {
206- for release := range releases {
207- if strings .HasPrefix (* releases [release ].TagName , dependencies [dependencyType ].TagPrefix ) {
208- version = releases [release ]
209- foundPrefixVersion = true
210- if * version .TagName != dependencies [dependencyType ].Tag {
211- diffUrl = generateGithubRepoUrl (dependencies , dependencyType ) + "/compare/" +
212- dependencies [dependencyType ].Tag + "..." + * version .TagName
213- }
214- break
215- }
203+ for _ , tag := range tags {
204+ // Skip if tagPrefix is set and doesn't match
205+ if tagPrefix != "" && ! strings .HasPrefix (* tag .Name , tagPrefix ) {
206+ continue
216207 }
217- if foundPrefixVersion {
218- break
208+
209+ // Check if this is a valid upgrade (not a downgrade)
210+ if err := ValidateVersionUpgrade (currentTag , * tag .Name , tagPrefix ); err != nil {
211+ continue
219212 }
220- options .Page = resp .NextPage
221- } else if resp .NextPage == 0 {
213+
214+ validTags = append (validTags , tag )
215+ }
216+
217+ if resp .NextPage == 0 {
222218 break
223219 }
220+ options .Page = resp .NextPage
224221 }
222+
223+ // Find the maximum version among valid tags
224+ for _ , tag := range validTags {
225+ // Skip if this tag can't be parsed
226+ if _ , err := ParseVersion (* tag .Name , tagPrefix ); err != nil {
227+ log .Printf ("Skipping unparseable tag %s: %v" , * tag .Name , err )
228+ continue
229+ }
230+
231+ if selectedTag == nil {
232+ selectedTag = tag
233+ continue
234+ }
235+
236+ cmp , err := CompareVersions (* tag .Name , * selectedTag .Name , tagPrefix )
237+ if err != nil {
238+ log .Printf ("Error comparing versions %s and %s: %v" , * tag .Name , * selectedTag .Name , err )
239+ continue
240+ }
241+ if cmp > 0 {
242+ selectedTag = tag
243+ }
244+ }
245+
246+ // If no valid version found, keep current version
247+ if selectedTag == nil {
248+ log .Printf ("No valid upgrade found for %s, keeping %s" , dependencyType , currentTag )
249+ return currentTag , dependencies [dependencyType ].Commit , VersionUpdateInfo {}, nil
250+ }
251+
252+ if * selectedTag .Name != currentTag {
253+ diffUrl = generateGithubRepoUrl (dependencies , dependencyType ) + "/compare/" +
254+ currentTag + "..." + * selectedTag .Name
255+ }
256+
257+ // Get commit SHA from the tag
258+ commit = * selectedTag .Commit .SHA
225259 }
226260
227261 if diffUrl != "" {
228262 updatedDependency = VersionUpdateInfo {
229263 dependencies [dependencyType ].Repo ,
230264 dependencies [dependencyType ].Tag ,
231- * version . TagName ,
265+ * selectedTag . Name ,
232266 diffUrl ,
233267 }
234268 }
235269
236- if dependencies [dependencyType ].Tracking == "tag" {
237- versionCommit , _ , err := client .Repositories .GetCommit (
238- ctx ,
239- dependencies [dependencyType ].Owner ,
240- dependencies [dependencyType ].Repo ,
241- "refs/tags/" + * version .TagName ,
242- & github.ListOptions {})
243- if err != nil {
244- return "" , "" , VersionUpdateInfo {}, fmt .Errorf ("error getting commit for " + dependencyType + ": %s" , err )
245- }
246- commit = * versionCommit .SHA
247-
248- } else if dependencies [dependencyType ].Tracking == "branch" {
270+ if dependencies [dependencyType ].Tracking == "branch" {
249271 branchCommit , _ , err := client .Repositories .ListCommits (
250272 ctx ,
251273 dependencies [dependencyType ].Owner ,
@@ -270,8 +292,8 @@ func getVersionAndCommit(ctx context.Context, client *github.Client, dependencie
270292 }
271293 }
272294
273- if version != nil {
274- return * version . TagName , commit , updatedDependency , nil
295+ if selectedTag != nil {
296+ return * selectedTag . Name , commit , updatedDependency , nil
275297 }
276298
277299 return "" , commit , updatedDependency , nil
0 commit comments