-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathcanary.py
208 lines (168 loc) · 7.7 KB
/
canary.py
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
import argparse
import re
import subprocess
# 更新対象のpodspecファイル
PODSPEC_FILE = "Sora.podspec"
# 更新対象のPackageInfoファイル
PACKAGEINFO_FILE = "Sora/PackageInfo.swift"
def update_sdk_version(podspec_content):
"""
Sora.podspecファイルの内容からバージョンを更新する
Args:
podspec_content (list): podspecファイルの各行を要素とするリスト
Returns:
tuple: (更新後のファイル内容のリスト, 新しいバージョン文字列)
Raises:
ValueError: バージョン指定が見つからない場合
"""
updated_content = []
sdk_version_updated = False
new_version = None
for line in podspec_content:
line = line.rstrip() # 末尾の改行のみを削除
if "s.version" in line:
# バージョン行のパターンマッチング
# 例: s.version = "1.0.0" や s.version = "1.0.0-canary.1" にマッチ
version_match = re.match(
r'\s*s\.version\s*=\s*[\'"](\d+\.\d+\.\d+)(-canary\.(\d+))?[\'"]', line
)
if version_match:
major_minor_patch = version_match.group(1) # 基本バージョン (例: 1.0.0)
canary_suffix = version_match.group(2) # canaryサフィックス部分
# canaryサフィックスが無い場合は.0から開始、ある場合は番号をインクリメント
if canary_suffix is None:
new_version = f"{major_minor_patch}-canary.0"
else:
canary_number = int(version_match.group(3))
new_version = f"{major_minor_patch}-canary.{canary_number + 1}"
# podspecのバージョン行を更新
updated_content.append(f' s.version = "{new_version}"')
sdk_version_updated = True
else:
updated_content.append(line)
else:
updated_content.append(line)
if not sdk_version_updated:
raise ValueError("Version specification not found in Sora.podspec file.")
return updated_content, new_version
def update_packageinfo_version(packageinfo_content):
"""
PackageInfo.swiftファイルの内容からバージョンを更新する
Args:
packageinfo_content (list): PackageInfo.swiftファイルの各行を要素とするリスト
Returns:
tuple: (更新後のファイル内容のリスト, 新しいバージョン文字列)
Raises:
ValueError: バージョン指定が見つからない場合
"""
updated_content = []
sdk_version_updated = False
new_version = None
for line in packageinfo_content:
line = line.rstrip() # 末尾の改行のみを削除
if "public static let version" in line:
# バージョン行のパターンマッチング
version_match = re.match(
r'\s*public\s+static\s+let\s+version\s*=\s*[\'"](\d+\.\d+\.\d+)(-canary\.(\d+))?[\'"]',
line,
)
if version_match:
major_minor_patch = version_match.group(1) # 基本バージョン (例: 1.0.0)
canary_suffix = version_match.group(2) # canaryサフィックス部分
# canaryサフィックスが無い場合は.0から開始、ある場合は番号をインクリメント
if canary_suffix is None:
new_version = f"{major_minor_patch}-canary.0"
else:
canary_number = int(version_match.group(3))
new_version = f"{major_minor_patch}-canary.{canary_number + 1}"
# PackageInfoのバージョン行を更新
updated_content.append(
f' public static let version = "{new_version}"'
)
sdk_version_updated = True
else:
updated_content.append(line)
else:
updated_content.append(line)
if not sdk_version_updated:
raise ValueError("Version specification not found in PackageInfo.swift file.")
return updated_content, new_version
def write_file(filename, updated_content, dry_run):
"""
更新後の内容をファイルに書き込む
Args:
filename (str): 書き込み対象のファイル名
updated_content (list): 更新後のファイル内容
dry_run (bool): True の場合は実際の書き込みを行わない
"""
if dry_run:
print(f"Dry run: The following changes would be written to {filename}:")
print("\n".join(updated_content))
else:
with open(filename, "w") as file:
file.write("\n".join(updated_content) + "\n")
print(f"{filename} updated.")
def git_operations(new_version, dry_run):
"""
Git操作(コミット、タグ付け、プッシュ)を実行
Args:
new_version (str): 新しいバージョン文字列(タグとして使用)
dry_run (bool): True の場合は実際のGit操作を行わない
"""
commit_message = (
f"[canary] Update Sora.podspec and PackageInfo.swift version to {new_version}"
)
if dry_run:
# dry-run時は実行されるコマンドを表示のみ
print(f"Dry run: Would execute git add {PODSPEC_FILE} {PACKAGEINFO_FILE}")
print(f"Dry run: Would execute git commit -m '{commit_message}'")
print(f"Dry run: Would execute git tag {new_version}")
print(f"Dry run: Would execute git push origin develop")
print(f"Dry run: Would execute git push origin {new_version}")
else:
# ファイルをステージング
print(f"Executing: git add {PODSPEC_FILE} {PACKAGEINFO_FILE}")
subprocess.run(["git", "add", PODSPEC_FILE, PACKAGEINFO_FILE], check=True)
# 変更をコミット
print(f"Executing: git commit -m '{commit_message}'")
subprocess.run(["git", "commit", "-m", commit_message], check=True)
# バージョンタグを作成
print(f"Executing: git tag {new_version}")
subprocess.run(["git", "tag", new_version], check=True)
# developブランチをプッシュ
print("Executing: git push origin develop")
subprocess.run(["git", "push", "origin", "develop"], check=True)
# タグをプッシュ
print(f"Executing: git push origin {new_version}")
subprocess.run(["git", "push", "origin", new_version], check=True)
def main():
"""
メイン処理:
1. コマンドライン引数の解析
2. Sora.podspec ファイルの読み込みと更新
3. PackageInfo.swiftファイルの読み込みと更新
4. Git操作の実行
"""
parser = argparse.ArgumentParser(
description="Update Sora.podspec & PackageInfo.swift version and push changes with git."
)
parser.add_argument(
"--dry-run",
action="store_true",
help="Perform a dry run without making any changes.",
)
args = parser.parse_args()
# podspecファイルを読み込んでバージョンを更新
with open(PODSPEC_FILE, "r") as file:
podspec_content = file.readlines()
updated_podspec_content, new_version = update_sdk_version(podspec_content)
write_file(PODSPEC_FILE, updated_podspec_content, args.dry_run)
# PackageInfoファイルを読み込んでバージョンを更新
with open(PACKAGEINFO_FILE, "r") as file:
packageinfo_content = file.readlines()
updated_packageinfo_content, _ = update_packageinfo_version(packageinfo_content)
write_file(PACKAGEINFO_FILE, updated_packageinfo_content, args.dry_run)
# Git操作の実行
git_operations(new_version, args.dry_run)
if __name__ == "__main__":
main()