Merge pull request #28843 from taosdata/fix/main/TD-32945

fix:handling the issue of 'git remote prune origin' failing due to re…
This commit is contained in:
WANG Xu 2024-12-08 18:33:30 +08:00 committed by GitHub
commit 2907f6a5a8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 46 additions and 25 deletions

View File

@ -1,59 +1,80 @@
import subprocess import subprocess
import re import re
# 执行 git fetch 命令并捕获输出
def git_fetch(): def git_fetch():
result = subprocess.run(['git', 'fetch'], capture_output=True, text=True) result = subprocess.run(['git', 'fetch'], capture_output=True, text=True)
return result return result
# 解析分支名称 def git_prune():
# git remote prune origin
print("git remote prune origin")
result = subprocess.run(['git', 'remote', 'prune', 'origin'], capture_output=True, text=True)
return result
def parse_branch_name_type1(error_output): def parse_branch_name_type1(error_output):
# 使用正则表达式匹配 'is at' 前的分支名称 # error: cannot lock ref 'refs/remotes/origin/fix/3.0/TD-32817': is at 7af5 but expected eaba
# match the branch name before is at with a regular expression
match = re.search(r"error: cannot lock ref '(refs/remotes/origin/[^']+)': is at", error_output) match = re.search(r"error: cannot lock ref '(refs/remotes/origin/[^']+)': is at", error_output)
if match: if match:
return match.group(1) return match.group(1)
return None return None
# 解析第二种错误中的分支名称
def parse_branch_name_type2(error_output): def parse_branch_name_type2(error_output):
# 使用正则表达式匹配 'exists' 前的第一个引号内的分支名称 # match the branch name before exists; cannot create with a regular expression
match = re.search(r"'(refs/remotes/origin/[^']+)' exists;", error_output) match = re.search(r"'(refs/remotes/origin/[^']+)' exists;", error_output)
if match: if match:
return match.group(1) return match.group(1)
return None return None
# 执行 git update-ref -d 命令 # parse branch name from error output of git remote prune origin
def parse_branch_name_type3(error_output):
# match the branch name before the first single quote before 'Unable to' with a regular expression
# git error: could not delete references: cannot lock ref 'refs/remotes/origin/test/3.0/TS-4893': Unable to create 'D:/workspace/main/TDinternal/community/.git/refs/remotes/origin/test/3.0/TS-4893.lock': File exists
match = re.search(r"references: cannot lock ref '(refs/remotes/origin/[^']+)': Unable to", error_output)
if match:
return match.group(1)
return None
# execute git update-ref -d <branch_name> to delete the ref
def git_update_ref(branch_name): def git_update_ref(branch_name):
if branch_name: if branch_name:
subprocess.run(['git', 'update-ref', '-d', f'{branch_name}'], check=True) subprocess.run(['git', 'update-ref', '-d', f'{branch_name}'], check=True)
# 解析错误类型并执行相应的修复操作 # parse error type and execute corresponding repair operation
def handle_error(error_output): def handle_error(error_output):
# 错误类型1本地引用的提交ID与远程不一致 error_types = [
if "is at" in error_output and "but expected" in error_output: ("is at", "but expected", parse_branch_name_type1, "type 1"),
branch_name = parse_branch_name_type1(error_output) ("exists; cannot create", None, parse_branch_name_type2, "type 2"),
if branch_name: ("Unable to create", "File exists", parse_branch_name_type3, "type 3")
print(f"Detected error type 1, attempting to delete ref for branch: {branch_name}") ]
git_update_ref(branch_name)
else: for error_type in error_types:
print("Error parsing branch name for type 1.") if error_type[0] in error_output and (error_type[1] is None or error_type[1] in error_output):
# 错误类型2尝试创建新的远程引用时本地已经存在同名的引用 branch_name = error_type[2](error_output)
elif "exists; cannot create" in error_output: if branch_name:
branch_name = parse_branch_name_type2(error_output) print(f"Detected error {error_type[3]}, attempting to delete ref for branch: {branch_name}")
if branch_name: git_update_ref(branch_name)
print(f"Detected error type 2, attempting to delete ref for branch: {branch_name}") else:
git_update_ref(branch_name) print(f"Error parsing branch name for {error_type[3]}.")
else: break
print("Error parsing branch name for type 2.")
# 主函数
def main(): def main():
fetch_result = git_fetch() fetch_result = git_fetch()
if fetch_result.returncode != 0: # 如果 git fetch 命令失败 if fetch_result.returncode != 0:
error_output = fetch_result.stderr error_output = fetch_result.stderr
handle_error(error_output) handle_error(error_output)
else: else:
print("Git fetch successful.") print("Git fetch successful.")
prune_result = git_prune()
print(prune_result.returncode)
if prune_result.returncode != 0:
error_output = prune_result.stderr
print(error_output)
handle_error(error_output)
else:
print("Git prune successful.")
if __name__ == "__main__": if __name__ == "__main__":
main() main()