|
1 | 1 | #!/usr/bin/env python3 |
2 | | -"""Extract ArcadeDB version from parent pom.xml""" |
| 2 | +"""Extract ArcadeDB version from parent pom.xml |
| 3 | +
|
| 4 | +Usage: |
| 5 | + python extract_version.py [pom_path] [--format=pep440|docker] |
| 6 | + |
| 7 | + --format=pep440 : Convert to PEP 440 for Python packaging (default) |
| 8 | + 25.10.1-SNAPSHOT -> 25.10.1.dev0 |
| 9 | + --format=docker : Raw Maven version for Docker tags |
| 10 | + 25.10.1-SNAPSHOT -> 25.10.1-SNAPSHOT |
| 11 | +""" |
3 | 12 | import re |
4 | 13 | import sys |
5 | 14 | from pathlib import Path |
6 | 15 |
|
7 | 16 | # Python-specific patch version (increment for Python-only releases) |
8 | 17 | PYTHON_PATCH = 0 # Change this to 2, 3, etc. for subsequent Python patches |
9 | 18 |
|
10 | | -def extract_version_from_pom(pom_path): |
11 | | - """Extract version from Maven pom.xml and convert to PEP 440 format""" |
12 | | - with open(pom_path, 'r') as f: |
| 19 | + |
| 20 | +def extract_raw_version_from_pom(pom_file): |
| 21 | + """Extract the raw version string from pom.xml (no conversion)""" |
| 22 | + with open(pom_file, 'r', encoding='utf-8') as f: |
13 | 23 | content = f.read() |
14 | 24 |
|
15 | 25 | # Find the first <version> tag after <artifactId>arcadedb-parent</artifactId> |
16 | 26 | pattern = r'<artifactId>arcadedb-parent</artifactId>.*?<version>(.*?)</version>' |
17 | 27 | match = re.search(pattern, content, re.DOTALL) |
18 | 28 |
|
19 | 29 | if match: |
20 | | - version = match.group(1).strip() |
21 | | - # Convert Maven version to PEP 440 compatible version |
22 | | - # Examples: |
23 | | - # 25.10.1-SNAPSHOT -> 25.10.1.dev0 |
24 | | - # 25.10.1-RC1 -> 25.10.1rc1 |
25 | | - # 25.10.1 -> 25.10.1 |
26 | | - |
27 | | - if '-SNAPSHOT' in version: |
28 | | - version = version.replace('-SNAPSHOT', '.dev0') |
29 | | - elif '-RC' in version: |
30 | | - version = version.replace('-RC', 'rc') |
31 | | - elif '-' in version: |
32 | | - # Generic replacement for other pre-release identifiers |
33 | | - version = version.replace('-', '') |
34 | | - |
35 | | - # Add Python patch version for Python-specific releases |
36 | | - # PYTHON_PATCH = 0 → 25.9.1 (matches Java version) |
37 | | - # PYTHON_PATCH = 1 → 25.9.1.1 (first Python-only patch) |
38 | | - # PYTHON_PATCH = 2 → 25.9.1.2 (second Python-only patch) |
39 | | - # Not applied to dev versions (e.g., 25.9.1.dev0) |
40 | | - if PYTHON_PATCH > 0 and '.dev' not in version and 'rc' not in version.lower(): |
41 | | - version = f"{version}.{PYTHON_PATCH}" |
42 | | - |
43 | | - return version |
| 30 | + return match.group(1).strip() |
44 | 31 |
|
45 | 32 | raise ValueError("Could not find version in pom.xml") |
46 | 33 |
|
47 | 34 |
|
| 35 | +def extract_version_from_pom(pom_file, fmt='pep440'): |
| 36 | + """Extract version from Maven pom.xml |
| 37 | + |
| 38 | + Args: |
| 39 | + pom_file: Path to pom.xml file |
| 40 | + fmt: 'pep440' for Python packaging, 'docker' for Docker tags |
| 41 | + """ |
| 42 | + ver = extract_raw_version_from_pom(pom_file) |
| 43 | + |
| 44 | + if fmt == 'docker': |
| 45 | + # Return raw Maven version for Docker tags |
| 46 | + return ver |
| 47 | + |
| 48 | + # Convert Maven version to PEP 440 compatible version |
| 49 | + # Examples: |
| 50 | + # 25.10.1-SNAPSHOT -> 25.10.1.dev0 |
| 51 | + # 25.10.1-RC1 -> 25.10.1rc1 |
| 52 | + # 25.10.1 -> 25.10.1 |
| 53 | + |
| 54 | + if '-SNAPSHOT' in ver: |
| 55 | + ver = ver.replace('-SNAPSHOT', '.dev0') |
| 56 | + elif '-RC' in ver: |
| 57 | + ver = ver.replace('-RC', 'rc') |
| 58 | + elif '-' in ver: |
| 59 | + # Generic replacement for other pre-release identifiers |
| 60 | + ver = ver.replace('-', '') |
| 61 | + |
| 62 | + # Add Python patch version for Python-specific releases |
| 63 | + # PYTHON_PATCH = 0 → 25.9.1 (matches Java version) |
| 64 | + # PYTHON_PATCH = 1 → 25.9.1.1 (first Python-only patch) |
| 65 | + # PYTHON_PATCH = 2 → 25.9.1.2 (second Python-only patch) |
| 66 | + # Not applied to dev versions (e.g., 25.9.1.dev0) |
| 67 | + if PYTHON_PATCH > 0 and '.dev' not in ver and 'rc' not in ver.lower(): |
| 68 | + ver = f"{ver}.{PYTHON_PATCH}" |
| 69 | + |
| 70 | + return ver |
| 71 | + |
| 72 | + |
48 | 73 | if __name__ == "__main__": |
49 | 74 | # Default to parent pom.xml (two levels up from bindings/python) |
50 | 75 | script_dir = Path(__file__).parent |
51 | 76 | pom_path = script_dir / "../../pom.xml" |
| 77 | + output_format = 'pep440' |
52 | 78 |
|
53 | | - if len(sys.argv) > 1: |
54 | | - pom_path = Path(sys.argv[1]) |
| 79 | + # Parse arguments |
| 80 | + for arg in sys.argv[1:]: |
| 81 | + if arg.startswith('--format='): |
| 82 | + output_format = arg.split('=', 1)[1] |
| 83 | + if output_format not in ['pep440', 'docker']: |
| 84 | + print("Error: Invalid format. Use 'pep440' or 'docker'", |
| 85 | + file=sys.stderr) |
| 86 | + sys.exit(1) |
| 87 | + elif not arg.startswith('--'): |
| 88 | + pom_path = Path(arg) |
55 | 89 |
|
56 | 90 | try: |
57 | | - version = extract_version_from_pom(pom_path) |
58 | | - print(version) |
59 | | - except Exception as e: |
| 91 | + ver = extract_version_from_pom(pom_path, output_format) |
| 92 | + print(ver) |
| 93 | + except (ValueError, FileNotFoundError, OSError) as e: |
60 | 94 | print(f"Error: {e}", file=sys.stderr) |
61 | 95 | sys.exit(1) |
0 commit comments