Convert to setuptools-scm for automatic version management
- Remove manual version management in favor of git tag-based versioning - Simplify __version__.py to import from generated _version.py - Add simplified release_simplified.py script - Add _version.py to .gitignore (auto-generated) 🚀 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,123 +1,16 @@
|
||||
"""
|
||||
Version information for MarkiTect.
|
||||
|
||||
This module provides version and release information for the MarkiTect package.
|
||||
Version information is sourced from pyproject.toml and git metadata when available.
|
||||
This module provides version information using setuptools-scm.
|
||||
Version is automatically derived from git tags.
|
||||
"""
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
try:
|
||||
from ._version import version as __version__
|
||||
except ImportError:
|
||||
# Fallback when _version.py is not available (e.g., during development without setuptools-scm)
|
||||
__version__ = "unknown"
|
||||
|
||||
# Base version from pyproject.toml
|
||||
__version__ = "0.5.0"
|
||||
|
||||
def get_git_commit_hash() -> Optional[str]:
|
||||
"""Get the current git commit hash if available."""
|
||||
try:
|
||||
result = subprocess.run(
|
||||
['git', 'rev-parse', '--short', 'HEAD'],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True,
|
||||
cwd=Path(__file__).parent.parent
|
||||
)
|
||||
return result.stdout.strip()
|
||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||
return None
|
||||
|
||||
def get_git_branch() -> Optional[str]:
|
||||
"""Get the current git branch if available."""
|
||||
try:
|
||||
result = subprocess.run(
|
||||
['git', 'branch', '--show-current'],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True,
|
||||
cwd=Path(__file__).parent.parent
|
||||
)
|
||||
return result.stdout.strip()
|
||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||
return None
|
||||
|
||||
def get_git_tag() -> Optional[str]:
|
||||
"""Get the current git tag if available."""
|
||||
try:
|
||||
result = subprocess.run(
|
||||
['git', 'describe', '--tags', '--exact-match'],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True,
|
||||
cwd=Path(__file__).parent.parent
|
||||
)
|
||||
return result.stdout.strip()
|
||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||
return None
|
||||
|
||||
def is_development_version() -> bool:
|
||||
"""Check if this is a development version (has uncommitted changes)."""
|
||||
try:
|
||||
result = subprocess.run(
|
||||
['git', 'status', '--porcelain'],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True,
|
||||
cwd=Path(__file__).parent.parent
|
||||
)
|
||||
return bool(result.stdout.strip())
|
||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||
return False
|
||||
|
||||
def get_version_info() -> dict:
|
||||
"""Get comprehensive version information."""
|
||||
git_commit = get_git_commit_hash()
|
||||
git_branch = get_git_branch()
|
||||
git_tag = get_git_tag()
|
||||
is_dev = is_development_version()
|
||||
|
||||
# Build version string
|
||||
version_parts = [__version__]
|
||||
|
||||
if git_tag and git_tag != f"v{__version__}":
|
||||
# If we have a different tag, use it
|
||||
version_parts = [git_tag.lstrip('v')]
|
||||
|
||||
if git_commit:
|
||||
if is_dev:
|
||||
version_parts.append(f"dev+{git_commit}")
|
||||
elif not git_tag:
|
||||
version_parts.append(f"+{git_commit}")
|
||||
|
||||
if is_dev and not git_commit:
|
||||
version_parts.append("dev")
|
||||
|
||||
full_version = ".".join(version_parts)
|
||||
|
||||
return {
|
||||
"version": __version__,
|
||||
"full_version": full_version,
|
||||
"git_commit": git_commit,
|
||||
"git_branch": git_branch,
|
||||
"git_tag": git_tag,
|
||||
"is_development": is_dev,
|
||||
"is_git_repo": git_commit is not None
|
||||
}
|
||||
|
||||
def get_release_info() -> dict:
|
||||
"""Get release information."""
|
||||
version_info = get_version_info()
|
||||
|
||||
release_type = "development" if version_info["is_development"] else "release"
|
||||
if version_info["git_tag"]:
|
||||
release_type = "tagged-release"
|
||||
elif version_info["git_commit"] and not version_info["is_development"]:
|
||||
release_type = "commit-build"
|
||||
|
||||
return {
|
||||
"release_type": release_type,
|
||||
"build_from": version_info["git_branch"] or "unknown",
|
||||
"commit": version_info["git_commit"] or "unknown",
|
||||
"clean_build": not version_info["is_development"],
|
||||
**version_info
|
||||
}
|
||||
def get_version():
|
||||
"""Get the current version string."""
|
||||
return __version__
|
||||
Reference in New Issue
Block a user