blob: 8b15311328caa7fcaf1e8efd08133acfc92601e0 [file] [log] [blame]
import requests, subprocess, os, re, pprint
from vars import headers, token, gh_cli_repo_name, input_data, gh_cli_repo_url
def get_release_prs(release_branch):
page_param = 1
params = {
"state": "open",
"base": release_branch,
"per_page": 100,
"page": page_param
}
pr_list = []
response_pr = requests.get(f"https://api.github.com/repos/{gh_cli_repo_name}/pulls", headers=headers, params=params).json()
pr_list.extend(response_pr)
while len(response_pr) == 100:
page_param += 1
response_pr = requests.get(f"https://api.github.com/repos/{gh_cli_repo_name}/pulls", headers=headers, params=params).json()
pr_list.extend(response_pr)
return list(filter(lambda n: n["user"]["login"] == input_data["user_name"], pr_list))
def get_files_for_pr(pr_number):
page_param = 1
params = {
"per_page": 100,
"page": page_param,
}
files_list = []
response_pr_files = requests.get(f"https://api.github.com/repos/{gh_cli_repo_name}/pulls/{pr_number}/files", headers=headers, params=params).json()
files_list.extend(response_pr_files)
while len(response_pr_files) == 100:
page_param += 1
response_pr_files = requests.get(f"https://api.github.com/repos/{gh_cli_repo_name}/pulls/{pr_number}/files", headers=headers, params=params).json()
files_list.extend(response_pr_files)
return files_list
def clone_repo():
subprocess.run(['git', 'clone', f"https://{input_data['user_name']}:{token}@github.com/{gh_cli_repo_name}.git"])
subprocess.run(['git', 'config', '--global', 'user.name', input_data["user_name"]])
subprocess.run(['git', 'config', '--global', 'user.email', input_data["email"]])
os.chdir("bazel")
subprocess.run(['git', 'remote', 'add', 'origin', gh_cli_repo_url])
subprocess.run(['git', 'remote', '-v'])
def checkout_branch(head_branch, release_branch):
subprocess.run(['git', 'fetch', '--all'])
subprocess.run(['git', 'checkout', release_branch])
subprocess.run(['git', 'pull'])
status_checkout_release = subprocess.run(['git', 'checkout', head_branch])
return status_checkout_release
def push_to_branch():
push_status = subprocess.run(['git', 'push', '-f'])
if push_status.returncode != 0: raise Exception(f"Cherry-pick was attempted, but failed to push.\ncc: @bazelbuild/triage")
def update_lockfiles(lockfiles, head_branch, release_branch, lockfile_names):
if checkout_branch(head_branch, release_branch).returncode != 0:
print(f"{input_data['user_name']} does not have the branch: {head_branch}...")
return
std_out_bazel_version = subprocess.Popen(["../bazelisk-linux-amd64", "--version"], stdout=subprocess.PIPE)
bazel_version_std_out = std_out_bazel_version.communicate()[0].decode()
major_version_digit = int(re.findall(r"\d.\d.\d", bazel_version_std_out)[0].split(".")[0])
if major_version_digit < 7:
print("Warning: The .bazelversion is less than 7. Therefore, the lockfiles will not be updated...")
return
rebase_status = subprocess.run(["git", "rebase", f"origin/{release_branch}"])
if rebase_status.returncode != 0:
unmerged_all_files = str(subprocess.Popen(["git", "diff", "--name-only", "--diff-filter=U"], stdout=subprocess.PIPE).communicate()[0].decode()).split("\n")
unmerged_rest = [j for i, j in enumerate(unmerged_all_files) if j not in lockfile_names and j != ""]
if len(unmerged_rest) != 0:
print("Could not rebase because of conflicts with files other than the lockfiles")
else:
print("There was conflicts with lockfiles only...")
allowed_rebase_continue_attempts = 2
while allowed_rebase_continue_attempts > 0:
for f in lockfile_names:
subprocess.run(["git", "checkout", "--ours", f])
subprocess.run(["git", "add", "."])
rebase_continue_status = subprocess.run(["git", "-c", "core.editor=true", "rebase", "--continue"])
if rebase_continue_status.returncode == 0:
if "src/test/tools/bzlmod/MODULE.bazel.lock" in lockfiles:
subprocess.run(["../bazelisk-linux-amd64", "run", "//src/test/tools/bzlmod:update_default_lock_file"])
subprocess.run(["../bazelisk-linux-amd64", "mod", "deps", "--lockfile_mode=update"])
subprocess.run(["git", "add", "."])
subprocess.run(["git", "commit", "-m", "Update lockfile(s)"])
push_to_branch()
return
allowed_rebase_continue_attempts -= 1
subprocess.run(['git', 'rebase', '--abort'])
else:
if "src/test/tools/bzlmod/MODULE.bazel.lock" in lockfiles:
subprocess.run(["../bazelisk-linux-amd64", "run", "//src/test/tools/bzlmod:update_default_lock_file"])
subprocess.run(["../bazelisk-linux-amd64", "mod", "deps", "--lockfile_mode=update"])
subprocess.run(["git", "add", "."])
subprocess.run(["git", "commit", "-m", "Update lockfile(s)"])
push_to_branch()