|
13 | 13 | NONE_SUPPORTED = "NONE_SUPPORTED_SPRING_CLOUD_VERSION" |
14 | 14 |
|
15 | 15 |
|
| 16 | +def version_key(version): |
| 17 | + match = re.match(r"^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:[-.]?([A-Za-z]+)(\d*)?)?$", version) |
| 18 | + if not match: |
| 19 | + return (0, 0, 0, 0, 0, version) |
| 20 | + |
| 21 | + major = int(match.group(1) or 0) |
| 22 | + minor = int(match.group(2) or 0) |
| 23 | + patch = int(match.group(3) or 0) |
| 24 | + qualifier = (match.group(4) or "").upper() |
| 25 | + qualifier_num = int(match.group(5) or 0) |
| 26 | + |
| 27 | + # Higher rank means newer release status for the same base version. |
| 28 | + if not qualifier: |
| 29 | + qualifier_rank = 3 # GA |
| 30 | + elif qualifier.startswith("RC"): |
| 31 | + qualifier_rank = 2 |
| 32 | + elif qualifier.startswith("M"): |
| 33 | + qualifier_rank = 1 |
| 34 | + elif qualifier.startswith("SNAPSHOT"): |
| 35 | + qualifier_rank = 0 |
| 36 | + else: |
| 37 | + qualifier_rank = 0 |
| 38 | + |
| 39 | + return (major, minor, patch, qualifier_rank, qualifier_num, qualifier) |
| 40 | + |
| 41 | + |
16 | 42 | def fetch_json(url): |
17 | 43 | req = urllib.request.Request(url, headers={"User-Agent": "spring-cloud-azure-tools-migration"}) |
18 | 44 | with urllib.request.urlopen(req, timeout=30) as resp: |
19 | 45 | return json.loads(resp.read().decode("utf-8")) |
20 | 46 |
|
21 | 47 |
|
22 | | -def tokenize_version(version): |
23 | | - tokens = [] |
24 | | - for part in re.split(r"[.\-]", version): |
25 | | - if part.isdigit(): |
26 | | - tokens.append((0, int(part))) |
27 | | - else: |
28 | | - upper = part.upper() |
29 | | - if upper.startswith("SNAPSHOT"): |
30 | | - tokens.append((1, -3)) |
31 | | - elif upper.startswith("M") and upper[1:].isdigit(): |
32 | | - tokens.append((1, -2, int(upper[1:]))) |
33 | | - elif upper.startswith("RC") and upper[2:].isdigit(): |
34 | | - tokens.append((1, -1, int(upper[2:]))) |
35 | | - else: |
36 | | - tokens.append((1, upper)) |
37 | | - return tokens |
38 | | - |
39 | | - |
40 | 48 | def compare_versions(a, b): |
41 | | - ta = tokenize_version(a) |
42 | | - tb = tokenize_version(b) |
43 | | - max_len = max(len(ta), len(tb)) |
44 | | - for i in range(max_len): |
45 | | - va = ta[i] if i < len(ta) else (0, 0) |
46 | | - vb = tb[i] if i < len(tb) else (0, 0) |
47 | | - if va == vb: |
48 | | - continue |
49 | | - return -1 if va < vb else 1 |
50 | | - return 0 |
| 49 | + ka = version_key(a) |
| 50 | + kb = version_key(b) |
| 51 | + if ka == kb: |
| 52 | + return 0 |
| 53 | + if ka < kb: |
| 54 | + return -1 |
| 55 | + return 1 |
51 | 56 |
|
52 | 57 |
|
53 | 58 | def parse_range_expression(expr): |
@@ -174,7 +179,7 @@ def main(): |
174 | 179 | snapshot_items.append(cloned) |
175 | 180 |
|
176 | 181 | result = current_items + snapshot_items |
177 | | - result.sort(key=lambda item: tokenize_version(item.get("spring-boot-version", "0")), reverse=True) |
| 182 | + result.sort(key=lambda item: version_key(item.get("spring-boot-version", "0")), reverse=True) |
178 | 183 |
|
179 | 184 | os.makedirs(os.path.dirname(SUPPORT_FILE), exist_ok=True) |
180 | 185 | with open(SUPPORT_FILE, "w", encoding="utf-8") as f: |
|
0 commit comments