@@ -27,6 +27,7 @@ import (
2727 "io/ioutil"
2828 "net/http"
2929 "strconv"
30+ "strings"
3031)
3132
3233type RestHandler interface {
@@ -140,19 +141,30 @@ func (impl *RestHandlerImpl) GetReleases(w http.ResponseWriter, r *http.Request)
140141 if len (repo ) > 0 {
141142 repository = bean .Repository (repo )
142143 }
144+ serverVersion := r .URL .Query ().Get ("serverVersion" )
143145 //will fetch all the releases from cache and later apply size and offset filter
144146 response , err := impl .releaseNoteService .GetReleases (repository )
145147 if err != nil {
146148 impl .WriteJsonResp (w , err , nil , http .StatusInternalServerError )
147149 return
148150 }
149151
150- if size > 0 {
152+ if size > 0 && len ( serverVersion ) == 0 {
151153 if offset + size <= len (response ) {
152154 response = response [offset : offset + size ]
153155 } else {
154156 response = response [offset :]
155157 }
158+ } else if len (serverVersion ) > 0 {
159+ // get all releases of that version and above that version
160+ var filteredResponse []* common.Release
161+ for _ , release := range response {
162+ // Compare version strings - include matching version and newer versions
163+ if release .TagName == serverVersion || isVersionNewer (release .TagName , serverVersion ) {
164+ filteredResponse = append (filteredResponse , release )
165+ }
166+ }
167+ response = filteredResponse
156168 }
157169 if len (response ) == 0 {
158170 response = make ([]* common.Release , 0 )
@@ -230,3 +242,39 @@ func (impl *RestHandlerImpl) GetBuildpackMetadata(w http.ResponseWriter, r *http
230242 impl .WriteJsonResp (w , nil , buildpackMetadata , http .StatusOK )
231243 return
232244}
245+
246+ // isVersionNewer compares two version strings and returns true if v1 is newer than v2
247+ func isVersionNewer (v1 , v2 string ) bool {
248+ // Remove 'v' prefix if present
249+ v1 = strings .TrimPrefix (v1 , "v" )
250+ v2 = strings .TrimPrefix (v2 , "v" )
251+
252+ // Split versions into components
253+ v1Parts := strings .Split (v1 , "." )
254+ v2Parts := strings .Split (v2 , "." )
255+
256+ // Compare each component
257+ for i := 0 ; i < len (v1Parts ) && i < len (v2Parts ); i ++ {
258+ v1Num , err1 := strconv .Atoi (v1Parts [i ])
259+ v2Num , err2 := strconv .Atoi (v2Parts [i ])
260+
261+ // If parts aren't numeric, fall back to string comparison
262+ if err1 != nil || err2 != nil {
263+ if v1Parts [i ] > v2Parts [i ] {
264+ return true
265+ } else if v1Parts [i ] < v2Parts [i ] {
266+ return false
267+ }
268+ continue
269+ }
270+
271+ if v1Num > v2Num {
272+ return true
273+ } else if v1Num < v2Num {
274+ return false
275+ }
276+ }
277+
278+ // If all compared components are equal, the longer version is newer
279+ return len (v1Parts ) > len (v2Parts )
280+ }
0 commit comments