def main(): client = github.GitHubClient() for repository in client.get_repositories(): subscribed = False subscribers_url = repository.get('subscribers_url') subscribers = client.call(subscribers_url) for subscriber in subscribers: if subscriber.get('login') == client.username: subscribed = True break if not subscribed: print(repository.get('full_name'))
def open_pr( work_dir, fork_repo, upstream_repo, gh_username, bundle_source_dir, new_version, prev_version, update_channels, hold, dry_run, ): dir_name = fork_repo.split("/")[1][:-4] dest_github_org = upstream_repo.split(":")[1].split("/")[0] dest_github_reponame = dir_name os.chdir(work_dir) print() print() print("Cloning %s" % fork_repo) repo_full_path = os.path.join(work_dir, dir_name) # clone git repo try: git.Repo.clone_from(fork_repo, repo_full_path) except: print("Failed to clone repo {} to {}".format(fork_repo, repo_full_path)) raise # get to the right place on the filesystem print("Working in %s" % repo_full_path) os.chdir(repo_full_path) repo = git.Repo(repo_full_path) try: repo.create_remote("upstream", upstream_repo) except: print("Failed to create upstream remote") raise print("Fetching latest upstream") try: repo.remotes.upstream.fetch() except: print("Failed to fetch upstream") raise # Starting branch print("Checkout latest upstream/main") try: repo.git.checkout("upstream/main") except: print("Failed to checkout upstream/main") raise branch_name = "update-hive-{}".format(new_version) print("Create branch {}".format(branch_name)) try: repo.git.checkout("-b", branch_name) except: print("Failed to checkout branch {}".format(branch_name)) raise # copy bundle directory print("Copying bundle directory") bundle_files = os.path.join(bundle_source_dir, new_version) hive_dir = os.path.join(repo_full_path, HIVE_SUB_DIR, new_version) shutil.copytree(bundle_files, hive_dir) # update bundle manifest print("Updating bundle manfiest") bundle_manifests_file = os.path.join( repo_full_path, HIVE_SUB_DIR, "hive.package.yaml" ) bundle = {} with open(bundle_manifests_file, "r") as a_file: bundle = yaml.load(a_file, Loader=yaml.SafeLoader) found = False for channel in bundle["channels"]: if channel["name"] in update_channels: found = True channel["currentCSV"] = "hive-operator.v{}".format(new_version) if prev_version is None: # New channel! Sanity check a couple things. if found: print("Unexpectedly got prev_version==None but found at least one of the following channels: {}".format(update_channels)) sys.exit(1) if len(update_channels) != 1: print("Expected exactly one channel name (got [{}])!".format(update_channels)) sys.exit(1) # All good. print("Adding new channel {}".format(update_channels[0])) # TODO: sort? bundle["channels"].append({ "name": update_channels[0], "currentCSV": "hive-operator.v{}".format(new_version), }) pr_title = "Create channel {} for Hive community operator at {}".format(update_channels[0], new_version) else: if not found: print("did not find a CSV channel to update") sys.exit(1) pr_title = "Update Hive community operator channel(s) [{}] to {}".format(update_channels, new_version) with open(bundle_manifests_file, "w") as outfile: yaml.dump(bundle, outfile, default_flow_style=False) print("\nUpdated bundle package:\n\n") cmd = ("cat %s" % bundle_manifests_file).split() subprocess.run(cmd) print() # commit files print("Adding file") repo.git.add(HIVE_SUB_DIR) print("Committing {}".format(pr_title)) try: repo.git.commit("--signoff", "--message={}".format(pr_title)) except: print("Failed to commit") raise print() if not dry_run: print("Pushing branch {}".format(branch_name)) origin = repo.remotes.origin try: origin.push(branch_name, None, force=True) except: print("failed to push branch to origin") raise # open PR client = gh.GitHubClient(dest_github_org, dest_github_reponame, "") from_branch = "{}:{}".format(gh_username, branch_name) to_branch = "main" body = pr_title if hold: body = "%s\n\n/hold" % body resp = client.create_pr(from_branch, to_branch, pr_title, body) if resp.status_code != 201: # 201 == Created print(resp.text) sys.exit(1) json_content = json.loads(resp.content.decode("utf-8")) print("PR opened: {}".format(json_content["html_url"])) else: print("Skipping branch push due to dry-run") print()