-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcanary.py
More file actions
154 lines (124 loc) · 5.43 KB
/
canary.py
File metadata and controls
154 lines (124 loc) · 5.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import argparse
import re
import subprocess
from typing import Optional
# ファイルを読み込み、バージョンを更新
def update_version(file_path: str, dry_run: bool) -> Optional[str]:
with open(file_path, "r", encoding="utf-8") as f:
content: str = f.read()
# [package] セクション内のバージョンのみを取得
package_section_match = re.search(
r'\[package\].*?version\s*=\s*"([\d\.\w-]+)"', content, re.DOTALL
)
if not package_section_match:
raise ValueError("Version not found in [package] section of Cargo.toml")
current_version: str = package_section_match.group(1)
# [package] セクションの開始位置を見つける
package_start = content.find("[package]")
# 次のセクション ([dependencies] など) の開始位置を見つける
next_section = re.search(r"\n\[(?!package)", content[package_start:])
if next_section:
package_end = package_start + next_section.start()
package_content = content[package_start:package_end]
else:
package_content = content[package_start:]
# [package] セクション内のバージョンを更新
if "-canary." in current_version:
updated_package, count = re.subn(
r'(version\s*=\s*")(\d+\.\d+\.\d+-canary\.)(\d+)',
lambda m: f"{m.group(1)}{m.group(2)}{int(m.group(3)) + 1}",
package_content,
count=1, # 最初の1つだけを更新
)
else:
# -canary.X がない場合、次のマイナーバージョンにして -canary.0 を追加
updated_package, count = re.subn(
r'(version\s*=\s*")(\d+)\.(\d+)\.(\d+)',
lambda m: f"{m.group(1)}{m.group(2)}.{int(m.group(3)) + 1}.0-canary.0",
package_content,
count=1, # 最初の1つだけを更新
)
if count == 0:
raise ValueError("Version not found or incorrect format in [package] section")
# 元のコンテンツの [package] セクション部分を更新後の内容に置き換える
if next_section:
new_content = content[:package_start] + updated_package + content[package_end:]
else:
new_content = content[:package_start] + updated_package
# 新しいバージョンを確認 ([package] セクションから)
new_package_version_match = re.search(
r'\[package\].*?version\s*=\s*"([\d\.\w-]+)"', new_content, re.DOTALL
)
if not new_package_version_match:
raise ValueError("Failed to extract the new version after the update.")
new_version: str = new_package_version_match.group(1)
print(f"Current version: {current_version}")
print(f"New version: {new_version}")
confirmation: str = (
input("Do you want to update the version? (Y/n): ").strip().lower()
)
if confirmation != "y":
print("Version update canceled.")
return None
# Dry-run 時の動作
if dry_run:
print("Dry-run: Version would be updated to:")
print(new_content)
else:
with open(file_path, "w", encoding="utf-8") as f:
f.write(new_content)
print(f"Version updated in Cargo.toml to {new_version}")
return new_version
# cargo update shiguredo_http11 を実行
def run_cargo_update(dry_run: bool) -> None:
if dry_run:
print("Dry-run: Would run 'cargo update shiguredo_http11'")
else:
subprocess.run(["cargo", "update", "shiguredo_http11"], check=True)
print("cargo update shiguredo_http11 executed")
# git コミット、タグ、プッシュを実行
def git_commit_version(new_version: str, dry_run: bool) -> None:
if dry_run:
print("Dry-run: Would run 'git add Cargo.toml Cargo.lock'")
print(f"Dry-run: Would run '[canary] Bump version to {new_version}'")
else:
subprocess.run(["git", "add", "Cargo.toml", "Cargo.lock"], check=True)
subprocess.run(
["git", "commit", "-m", f"[canary] Bump version to {new_version}"],
check=True,
)
print(f"Version bumped and committed: {new_version}")
# git コミット、タグ、プッシュを実行
def git_operations_after_build(new_version: str, dry_run: bool) -> None:
if dry_run:
print(f"Dry-run: Would run 'git tag {new_version}'")
print("Dry-run: Would run 'git push'")
print(f"Dry-run: Would run 'git push origin {new_version}'")
else:
subprocess.run(["git", "tag", new_version], check=True)
subprocess.run(["git", "push"], check=True)
subprocess.run(["git", "push", "origin", new_version], check=True)
# メイン処理
def main() -> None:
parser = argparse.ArgumentParser(
description="Update Cargo.toml version and commit changes."
)
parser.add_argument(
"--dry-run",
action="store_true",
help="Run in dry-run mode without making actual changes",
)
args = parser.parse_args()
cargo_toml_path: str = "Cargo.toml"
# バージョン更新
new_version: Optional[str] = update_version(cargo_toml_path, args.dry_run)
if not new_version:
return # ユーザーが確認をキャンセルした場合、処理を中断
# cargo update shiguredo_http11 を実行
run_cargo_update(args.dry_run)
# バージョン更新後に git commit
git_commit_version(new_version, args.dry_run)
# git タグ付け、プッシュ
git_operations_after_build(new_version, args.dry_run)
if __name__ == "__main__":
main()