feat: 实现功能3强制更新

- 新增 ForceUpdateCommand 类实现强制更新功能
- 添加 force-update CLI 命令支持
- 实现参数验证、配置对比、CDN缓存刷新
- 添加完整的测试用例和使用示例
- 更新文档和进度跟踪
- 支持模拟环境测试
- 添加警告提示和错误处理

主要文件:
- src/config_man/core/force_update_command.py (新增)
- src/config_man/cli/main.py (更新)
- examples/test_force_update.py (新增)
- examples/force_update_usage.py (新增)
- docs/progress-tracker.md (更新)
This commit is contained in:
2025-08-08 01:50:30 +08:00
parent 9eddb3133c
commit f534dc52cb
19 changed files with 2594 additions and 285 deletions

View File

@@ -1,6 +1,8 @@
import click
import os
from ..core.view_command import ViewCommand
from ..core.suggest_update_command import SuggestUpdateCommand
from ..core.force_update_command import ForceUpdateCommand
from ..utils.mock_rclone import patch_rclone
from ..utils.config import config
@@ -61,16 +63,40 @@ def view(version, json_format, storage_path, cdn_url, mock):
help='平台类型')
@click.option('--target-version', required=True, help='目标版本号')
@click.option('--update-version', required=True, help='更新版本号')
def suggest_update(platform, target_version, update_version):
@click.option('--storage-path', help='对象存储路径前缀(覆盖配置文件)')
@click.option('--cdn-url', help='CDN基础URL覆盖配置文件')
@click.option('--mock', is_flag=True, help='使用模拟环境进行测试')
def suggest_update(platform, target_version, update_version, storage_path, cdn_url, mock):
"""建议更新
在目标版本的配置文件中添加 Ver_New 属性,提示用户有新版本可用。
示例:
config-man suggest-update --platform android --target-version 0.29 --update-version 0.30
config-man suggest-update --platform ios --target-version 0.29 --update-version 0.30 --mock
"""
click.echo("建议更新功能尚未实现")
return 1
try:
# 如果使用模拟环境启用rclone模拟
if mock:
patch_rclone()
click.echo("使用模拟环境进行测试...")
else:
# 检查rclone是否可用
if not _check_rclone():
click.echo("错误: rclone 未安装或不可用。请先安装 rclone。")
return 1
# 创建建议更新命令处理器
suggest_cmd = SuggestUpdateCommand(storage_path, cdn_url)
# 执行建议更新命令
success = suggest_cmd.execute(platform, target_version, update_version)
return 0 if success else 1
except Exception as e:
click.echo(f"错误: {str(e)}")
return 1
@cli.command()
@@ -78,16 +104,40 @@ def suggest_update(platform, target_version, update_version):
help='平台类型')
@click.option('--target-version', required=True, help='目标版本号')
@click.option('--update-version', required=True, help='更新版本号')
def force_update(platform, target_version, update_version):
@click.option('--storage-path', help='对象存储路径前缀(覆盖配置文件)')
@click.option('--cdn-url', help='CDN基础URL覆盖配置文件')
@click.option('--mock', is_flag=True, help='使用模拟环境进行测试')
def force_update(platform, target_version, update_version, storage_path, cdn_url, mock):
"""强制更新
直接更新目标版本的 Ver 属性,强制用户升级到新版本。
示例:
config-man force-update --platform ios --target-version 0.29 --update-version 0.30
config-man force-update --platform android --target-version 0.29 --update-version 0.30 --mock
"""
click.echo("强制更新功能尚未实现")
return 1
try:
# 如果使用模拟环境启用rclone模拟
if mock:
patch_rclone()
click.echo("使用模拟环境进行测试...")
else:
# 检查rclone是否可用
if not _check_rclone():
click.echo("错误: rclone 未安装或不可用。请先安装 rclone。")
return 1
# 创建强制更新命令处理器
force_cmd = ForceUpdateCommand(storage_path, cdn_url)
# 执行强制更新命令
success = force_cmd.execute(platform, target_version, update_version)
return 0 if success else 1
except Exception as e:
click.echo(f"错误: {str(e)}")
return 1
@cli.command()
@@ -124,6 +174,33 @@ def show_config():
console.print(f"\n配置文件路径: {config.config_file}")
@cli.command()
@click.option('--api-token', required=True, help='Cloudflare API Token')
@click.option('--zone-id', required=True, help='Cloudflare Zone ID')
def setup_cloudflare(api_token, zone_id):
"""设置Cloudflare CDN配置
设置Cloudflare API Token和Zone ID。
示例:
config-man setup-cloudflare --api-token your_api_token --zone-id your_zone_id
"""
try:
# 设置Cloudflare配置
config.set('cdn.cloudflare.api_token', api_token)
config.set('cdn.cloudflare.zone_id', zone_id)
config.save()
click.echo("✅ Cloudflare配置已更新")
click.echo(f" API Token: {api_token[:10]}...")
click.echo(f" Zone ID: {zone_id}")
click.echo("\n💡 提示: 配置已保存到配置文件,无需重复设置环境变量")
except Exception as e:
click.echo(f"❌ 设置Cloudflare配置失败: {e}")
return 1
@cli.command()
@click.option('--key', required=True, help='配置键,如 storage.path')
@click.option('--value', required=True, help='配置值')
@@ -135,6 +212,8 @@ def set_config(key, value):
示例:
config-man set-config --key storage.path --value custom_path
config-man set-config --key cdn.base_url --value https://cdn.example.com
config-man set-config --key cdn.cloudflare.api_token --value your_api_token
config-man set-config --key cdn.cloudflare.zone_id --value your_zone_id
"""
try:
# 尝试转换数值类型