migration/src/remap_cross_issue_links.py (84 lines of code) (raw):

# # Remap Jira key to GitHub issue number # Usage: # python src/remap_cross_issue_links.py --issues <github issue number list> # python src/remap_cross_issue_links.py # import argparse from pathlib import Path import sys import os import json from common import LOG_DIRNAME, MAPPINGS_DATA_DIRNAME, ISSUE_MAPPING_FILENAME, GITHUB_REMAPPED_DATA_DIRNAME, MaxRetryLimitExceedException, logging_setup, read_issue_id_map, retry_upto, github_remapped_issue_data_file, github_remapped_comment_data_file from github_issues_util import * from jira_util import create_issue_links_outside_projects, embed_gh_issue_link log_dir = Path(__file__).resolve().parent.parent.joinpath(LOG_DIRNAME) logger = logging_setup(log_dir, "remap_cross_issue_links") @retry_upto(3, 1.0, logger) def remap_issue_link_in_issue_body(issue_number: int, issue_id_map: dict[str, int], data_dir: Path, token: str, repo: str): body = get_issue_body(token, repo, issue_number, logger) if body: updated_body = embed_gh_issue_link(body, issue_id_map, issue_number) updated_body = create_issue_links_outside_projects(updated_body) if updated_body == body: logger.debug(f"Issue {issue_number} does not contain any cross-issue links; nothing to do.") return data = {"issue_number": issue_number, "body": updated_body} data_file = github_remapped_issue_data_file(data_dir, issue_number) with open(data_file, "w") as fp: json.dump(data, fp=fp, indent=2) logger.debug(f"Updated issue body for issue_number={issue_number} was saved to {data_file}.") @retry_upto(3, 1.0, logger) def remap_issue_link_in_comments(issue_number: int, issue_id_map: dict[str, int], data_dir: Path, token: str, repo: str): comments = get_issue_comments(token, repo, issue_number, logger) if not comments: return logger.debug(f"# comments in issue {issue_number} = {len(comments)}") for comment in comments: id = comment.id body = comment.body updated_body = embed_gh_issue_link(body, issue_id_map, issue_number) updated_body = create_issue_links_outside_projects(updated_body) if updated_body == body: logger.debug(f"Comment {id} does not contain any cross-issue links; nothing to do.") continue data = {"comment_id": id, "body": updated_body} data_file = github_remapped_comment_data_file(data_dir, id) with open(data_file, "w") as fp: json.dump(data, fp=fp, indent=2) logger.debug(f"Updated comment body for comment_id={id} was saved to {data_file}.") if __name__ == "__main__": github_token = os.getenv("GITHUB_PAT") if not github_token: print("Please set your GitHub token to GITHUB_PAT environment variable.") sys.exit(1) github_repo = os.getenv("GITHUB_REPO") if not github_repo: print("Please set GitHub repo location to GITHUB_REPO environment varialbe.") sys.exit(1) check_authentication(github_token) parser = argparse.ArgumentParser() mapping_data_dir = Path(__file__).resolve().parent.parent.joinpath(MAPPINGS_DATA_DIRNAME) issue_mapping_file = mapping_data_dir.joinpath(ISSUE_MAPPING_FILENAME) parser.add_argument('--issues', type=int, required=False, nargs='*', help=f'GitHub issue number list to be exported, else all GitHub issues in {issue_mapping_file.relative_to(Path.cwd())}') args = parser.parse_args() if not issue_mapping_file.exists(): logger.error(f"Jira-GitHub issue id mapping file not found. {issue_mapping_file}") sys.exit(1) issue_id_map = read_issue_id_map(issue_mapping_file) remapped_data_dir = Path(__file__).resolve().parent.parent.joinpath(GITHUB_REMAPPED_DATA_DIRNAME) if not remapped_data_dir.exists(): remapped_data_dir.mkdir() assert remapped_data_dir.exists() issues = [] if args.issues: issues = args.issues else: issues = list(issue_id_map.values()) logger.info(f"Remapping cross-issue links") for num in issues: try: remap_issue_link_in_issue_body(num, issue_id_map, remapped_data_dir, github_token, github_repo) except MaxRetryLimitExceedException: logger.error(f"Failed to export/convert issue body. Skipped issue {num}") continue try: remap_issue_link_in_comments(num, issue_id_map, remapped_data_dir, github_token, github_repo) except MaxRetryLimitExceedException: logger.error(f"Failed to export/convert issue comments. Skipped issue {num}") continue logger.info("Done.")