mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-08-27 12:30:13 +03:00
86 lines
2.4 KiB
Python
Executable File
86 lines
2.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
parser = argparse.ArgumentParser(
|
|
description=(
|
|
"Read gns3server/version.py, extract __version__, and create an annotated git tag."
|
|
)
|
|
)
|
|
parser.add_argument(
|
|
"--dry-run",
|
|
action="store_true",
|
|
help="Show the tag that would be created without creating it",
|
|
)
|
|
return parser.parse_args()
|
|
|
|
|
|
def run_git(args: list[str], repo_root: Path) -> subprocess.CompletedProcess[str]:
|
|
return subprocess.run(
|
|
["git", *args],
|
|
cwd=repo_root,
|
|
check=False,
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
|
|
|
|
def get_version(repo_root: Path) -> str:
|
|
version_file = repo_root / "gns3server" / "version.py"
|
|
content = version_file.read_text(encoding="utf-8")
|
|
match = re.search(r"^__version__\s*=\s*['\"]([^'\"]+)['\"]", content, re.MULTILINE)
|
|
if not match:
|
|
raise ValueError("Unable to find __version__ in gns3server/version.py")
|
|
return match.group(1)
|
|
|
|
|
|
def main() -> int:
|
|
args = parse_args()
|
|
repo_root = Path(__file__).resolve().parent.parent
|
|
|
|
inside_repo = run_git(["rev-parse", "--is-inside-work-tree"], repo_root)
|
|
if inside_repo.returncode != 0:
|
|
print(f"Error: {repo_root} is not a git repository.", file=sys.stderr)
|
|
return 1
|
|
|
|
try:
|
|
tag = 'v' + get_version(repo_root)
|
|
except (OSError, ValueError) as exc:
|
|
print(f"Error: {exc}", file=sys.stderr)
|
|
return 1
|
|
|
|
existing_tag = run_git(["rev-parse", tag], repo_root)
|
|
if existing_tag.returncode == 0:
|
|
print(f"Error: tag '{tag}' already exists.", file=sys.stderr)
|
|
return 1
|
|
|
|
if args.dry_run:
|
|
print(f"Dry run: would create tag '{tag}' from gns3server/version.py")
|
|
return 0
|
|
|
|
create_tag = run_git(["tag", "-a", tag, "-m", f"Release {tag}"], repo_root)
|
|
if create_tag.returncode != 0:
|
|
print(create_tag.stderr.strip() or "Error: failed to create tag", file=sys.stderr)
|
|
return 1
|
|
print(f"Created tag '{tag}'")
|
|
|
|
push_tag = run_git(["push", "origin", tag], repo_root)
|
|
if push_tag.returncode != 0:
|
|
print(push_tag.stderr.strip() or "Error: failed to push tag", file=sys.stderr)
|
|
return 1
|
|
print(f"Tag '{tag}' has been pushed to the remote repository.")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|
|
|
|
|