Files
assist/version.py
2025-09-08 15:27:22 +08:00

200 lines
6.8 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
TSP智能助手版本管理模块
"""
import os
import json
import subprocess
from datetime import datetime
from typing import Dict, List, Optional
class VersionManager:
"""版本管理器"""
def __init__(self, version_file: str = "version.json"):
self.version_file = version_file
self.version_info = self._load_version()
def _load_version(self) -> Dict:
"""加载版本信息"""
if os.path.exists(self.version_file):
try:
with open(self.version_file, 'r', encoding='utf-8') as f:
return json.load(f)
except Exception as e:
print(f"加载版本文件失败: {e}")
# 默认版本信息
return {
"version": "1.0.0",
"build_number": 1,
"release_date": datetime.now().isoformat(),
"git_commit": self._get_git_commit(),
"deployment_status": "development",
"changelog": [],
"dependencies": self._get_dependencies()
}
def _get_git_commit(self) -> str:
"""获取Git提交哈希"""
try:
result = subprocess.run(['git', 'rev-parse', 'HEAD'],
capture_output=True, text=True)
return result.stdout.strip()[:8] if result.returncode == 0 else "unknown"
except:
return "unknown"
def _get_dependencies(self) -> Dict:
"""获取依赖包信息"""
try:
result = subprocess.run(['pip', 'freeze'],
capture_output=True, text=True)
if result.returncode == 0:
deps = {}
for line in result.stdout.strip().split('\n'):
if '==' in line:
name, version = line.split('==', 1)
deps[name] = version
return deps
except:
pass
return {}
def get_version(self) -> str:
"""获取当前版本号"""
return self.version_info["version"]
def get_build_number(self) -> int:
"""获取构建号"""
return self.version_info["build_number"]
def increment_version(self, version_type: str = "patch") -> str:
"""增加版本号"""
current_version = self.version_info["version"]
major, minor, patch = map(int, current_version.split('.'))
if version_type == "major":
major += 1
minor = 0
patch = 0
elif version_type == "minor":
minor += 1
patch = 0
else: # patch
patch += 1
new_version = f"{major}.{minor}.{patch}"
self.version_info["version"] = new_version
self.version_info["build_number"] += 1
self.version_info["release_date"] = datetime.now().isoformat()
self.version_info["git_commit"] = self._get_git_commit()
self.version_info["dependencies"] = self._get_dependencies()
self._save_version()
return new_version
def add_changelog_entry(self, entry: str, version: str = None):
"""添加变更日志条目"""
if version is None:
version = self.get_version()
changelog_entry = {
"version": version,
"date": datetime.now().isoformat(),
"description": entry
}
self.version_info["changelog"].insert(0, changelog_entry)
self._save_version()
def set_deployment_status(self, status: str):
"""设置部署状态"""
valid_statuses = ["development", "staging", "production", "maintenance"]
if status in valid_statuses:
self.version_info["deployment_status"] = status
self._save_version()
else:
raise ValueError(f"无效的部署状态: {status}")
def _save_version(self):
"""保存版本信息"""
try:
with open(self.version_file, 'w', encoding='utf-8') as f:
json.dump(self.version_info, f, indent=2, ensure_ascii=False)
except Exception as e:
print(f"保存版本文件失败: {e}")
def get_version_info(self) -> Dict:
"""获取完整版本信息"""
return self.version_info.copy()
def create_release_tag(self, tag_message: str = None):
"""创建Git标签"""
version = self.get_version()
tag_name = f"v{version}"
if tag_message is None:
tag_message = f"Release version {version}"
try:
# 创建标签
subprocess.run(['git', 'tag', '-a', tag_name, '-m', tag_message],
check=True)
print(f"已创建标签: {tag_name}")
return tag_name
except subprocess.CalledProcessError as e:
print(f"创建标签失败: {e}")
return None
def main():
"""命令行接口"""
import argparse
parser = argparse.ArgumentParser(description='TSP智能助手版本管理')
parser.add_argument('action', choices=['version', 'increment', 'status', 'changelog', 'tag'],
help='要执行的操作')
parser.add_argument('--type', choices=['major', 'minor', 'patch'],
default='patch', help='版本类型')
parser.add_argument('--status', choices=['development', 'staging', 'production', 'maintenance'],
help='部署状态')
parser.add_argument('--message', help='变更日志消息或标签消息')
args = parser.parse_args()
vm = VersionManager()
if args.action == 'version':
print(f"当前版本: {vm.get_version()}")
print(f"构建号: {vm.get_build_number()}")
print(f"部署状态: {vm.version_info['deployment_status']}")
elif args.action == 'increment':
new_version = vm.increment_version(args.type)
print(f"版本已更新为: {new_version}")
elif args.action == 'status':
if args.status:
vm.set_deployment_status(args.status)
print(f"部署状态已设置为: {args.status}")
else:
print(f"当前部署状态: {vm.version_info['deployment_status']}")
elif args.action == 'changelog':
if args.message:
vm.add_changelog_entry(args.message)
print(f"已添加变更日志: {args.message}")
else:
print("变更日志:")
for entry in vm.version_info['changelog'][:5]:
print(f" {entry['version']} - {entry['description']}")
elif args.action == 'tag':
tag_name = vm.create_release_tag(args.message)
if tag_name:
print(f"标签创建成功: {tag_name}")
if __name__ == "__main__":
main()