@@ -134,10 +134,74 @@ func isPatch(wantVersion *semver.Version, currentVersion *semver.Version) bool {
134134 return currentVersion .Major () == wantVersion .Major () && currentVersion .Minor () == wantVersion .Minor ()
135135}
136136
137+ // getNextReleases returns the list of possible upgrade targets
138+ func getNextReleases (currentVersion string ) []string {
139+ var nextReleases []string
140+ var found bool
141+
142+ for _ , releaseVersion := range ReleaseMap {
143+ if found {
144+ nextReleases = append (nextReleases , releaseVersion .version )
145+ if releaseVersion .rType == Regular {
146+ break
147+ }
148+ }
149+ if releaseVersion .version == currentVersion {
150+ found = true
151+ }
152+ }
153+
154+ return nextReleases
155+ }
156+
157+ // getPreviousReleases returns the list of possible rollback targets
158+ func getPreviousReleases (currentVersion string ) []string {
159+ var prevReleases []string
160+ var found bool
161+
162+ for i := len (ReleaseMap ) - 1 ; i >= 0 ; i -- {
163+ releaseVersion := ReleaseMap [i ]
164+ if found {
165+ prevReleases = append (prevReleases , releaseVersion .version )
166+ if releaseVersion .rType == Regular {
167+ break
168+ }
169+ }
170+ if releaseVersion .version == currentVersion {
171+ found = true
172+ }
173+ }
174+
175+ return prevReleases
176+ }
177+
137178func isForwardOneMajorVersion (wantVersion * semver.Version , currentVersion * semver.Version ) bool {
138179 // Two cases:
139180 // 19.1 to 19.2 -> same year
140181 // 19.2 to 20.1 -> next year
182+
183+ // Since 2024, we have adopted a quarterly release cycle, with two of the four annual releases designated
184+ // as innovative releases. Users have the option to skip upgrading to an innovative release.
185+ if currentVersion .Major () >= 24 {
186+ // Four Cases:
187+ // 24.1 to 24.2 -> Same year without skipping innovative release
188+ // 24.1 to 24.3 -> Same year with skipping innovative release
189+ // 24.4 to 25.1 -> Next year without skipping innovative release
190+ // 24.3 to 25.1 -> Next year with skipping innovative release
191+ nextPossibleRelease := getNextReleases (fmt .Sprintf ("%d.%d" , currentVersion .Major (), currentVersion .Minor ()))
192+ for _ , version := range nextPossibleRelease {
193+ if version == fmt .Sprintf ("%d.%d" , wantVersion .Major (), wantVersion .Minor ()) {
194+ return true
195+ }
196+ }
197+
198+ // This condition allows user to upgrade one version at a time.
199+ // ReleaseMap needs to be maintained if we want to skip the Innovative upgrades else this condition
200+ // is enough to do forward one major version.
201+ return (currentVersion .Major () == wantVersion .Major () && currentVersion .Minor ()+ 1 == wantVersion .Minor ()) ||
202+ (currentVersion .Major ()+ 1 == wantVersion .Major () && currentVersion .Minor ()- 3 == wantVersion .Minor ())
203+ }
204+
141205 return (currentVersion .Major () == wantVersion .Major () && currentVersion .Minor ()+ 1 == wantVersion .Minor ()) ||
142206 (currentVersion .Major ()+ 1 == wantVersion .Major () && currentVersion .Minor ()- 1 == wantVersion .Minor ())
143207}
@@ -146,6 +210,24 @@ func isBackOneMajorVersion(wantVersion *semver.Version, currentVersion *semver.V
146210 // Two cases:
147211 // 19.2 to 19.1 -> same year
148212 // 20.1 to 19.2 -> previous year
213+
214+ // Since 2024, users have the option to skip rollback to an innovative release.
215+ if wantVersion .Major () >= 24 {
216+ // Four cases:
217+ // 24.2 -> 24.1 -> Same year without skipping innovative release
218+ // 24.3 -> 24.1 -> Same year with skipping innovative release
219+ // 25.1 -> 24.4 -> Previous year without skipping innovative release
220+ // 25.1 -> 24.3 -> Previous year with skipping innovative release
221+ rollbackReleases := getPreviousReleases (fmt .Sprintf ("%d.%d" , currentVersion .Major (), currentVersion .Minor ()))
222+ for _ , version := range rollbackReleases {
223+ if version == fmt .Sprintf ("%d.%d" , wantVersion .Major (), wantVersion .Minor ()) {
224+ return true
225+ }
226+ }
227+ return (currentVersion .Major () == wantVersion .Major () && currentVersion .Minor () == wantVersion .Minor ()+ 1 ) ||
228+ (currentVersion .Major () == wantVersion .Major ()+ 1 && currentVersion .Minor () == wantVersion .Minor ()- 3 )
229+ }
230+
149231 return (currentVersion .Major () == wantVersion .Major () && currentVersion .Minor () == wantVersion .Minor ()+ 1 ) ||
150232 (currentVersion .Major () == wantVersion .Major ()+ 1 && currentVersion .Minor () == wantVersion .Minor ()- 1 )
151233}
0 commit comments