-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathcanary.py
146 lines (117 loc) · 5.14 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
import argparse
import re
import subprocess
SDKINFO_FILE = "sora-android-sdk/src/main/kotlin/jp/shiguredo/sora/sdk/util/SDKInfo.kt"
def update_sdkinfo_version(packageinfo_content):
"""
SDKInfo.ktファイルの内容からバージョンを更新する
Args:
packageinfo_content (list): SDKInfo.ktファイルの各行を要素とするリスト
Returns:
tuple: (更新後のファイル内容のリスト, 新しいバージョン文字列)
Raises:
ValueError: バージョン指定が見つからない場合
"""
updated_content = []
sdk_version_updated = False
new_version = None
for line in packageinfo_content:
line = line.rstrip() # 末尾の改行のみを削除
if "const val version" in line:
# バージョン行のパターンマッチング
version_match = re.match(
r'\s*const\s+val\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}"
# SDKInfoのバージョン行を更新
updated_content.append(f' const val 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 SDKInfo.kt 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 SDKInfo.kt version to {new_version}"
if dry_run:
# dry-run時は実行されるコマンドを表示のみ
print(f"Dry run: Would execute git add {SDKINFO_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 {SDKINFO_FILE}")
subprocess.run(["git", "add", SDKINFO_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. SDKInfo.kt ファイルの読み込みと更新
3. Git操作の実行
"""
parser = argparse.ArgumentParser(
description="Update SDKInfo.kt 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()
# SDKInfo.kt を読み込んでバージョンを更新
with open(SDKINFO_FILE, "r") as file:
packageinfo_content = file.readlines()
updated_packageinfo_content, new_version = update_sdkinfo_version(
packageinfo_content
)
write_file(SDKINFO_FILE, updated_packageinfo_content, args.dry_run)
# Git操作の実行
git_operations(new_version, args.dry_run)
if __name__ == "__main__":
main()