diff --git a/tool/report_static.py b/tool/report_static.py index 608173c0..dee4cf52 100644 --- a/tool/report_static.py +++ b/tool/report_static.py @@ -30,15 +30,26 @@ def load_data(filename): return json.load(f) -def get_printed_package_name(package_name, package_manager): +def get_package_url(package_name, package_manager): if package_manager == "maven": ga, v = package_name.split("@") g, a = ga.split(":") - return f"[{package_name}](https://central.sonatype.com/artifact/{g}/{a}/{v})" + return f"https://central.sonatype.com/artifact/{g}/{a}/{v}" elif package_manager in ["npm", "yarn-berry", "yarn-classic", "pnpm"]: name_in_url = "/v/".join(package_name.rsplit("@", 1)) # replaces last occurrence of @ for /v/ - return f"[{package_name}](https://npmjs.com/package/{name_in_url})" - return package_name + return f"https://npmjs.com/package/{name_in_url}" + raise ValueError("Package Manager not supported for acquiring package URL.") + + +def get_registry_url(package_name, package_manager): + if package_manager == "maven": + ga, v = package_name.split("@") + g, a = ga.split(":") + return f"https://central.sonatype.com/artifact/{g}/{a}/{v}" + elif package_manager in ["npm", "yarn-berry", "yarn-classic", "pnpm"]: + name_in_url = "/".join(package_name.rsplit("@", 1)) # replaces last occurrence of @ for /v/ + return f"https://registry.npmjs.com/{name_in_url}" + raise ValueError("Package Manager not supported for acquiring registry URL.") def create_dataframe(data, deps_list, package_manager): @@ -54,11 +65,29 @@ def create_dataframe(data, deps_list, package_manager): for package_name, package_data in data.items(): source_code_data = package_data.get("source_code", {}) or {} match_data = package_data.get("match_info", {}) or {} - sha_exists_info = source_code_data.get("source_code_version", {}) or {} + sc_version_info = source_code_data.get("source_code_version", {}) or {} aliased_package_name = aliased_packages.get(package_name, None) # Create a row for each package - printed_package_name = get_printed_package_name(package_name, package_manager) + package_url = get_package_url(package_name, package_manager) + registry_url = get_registry_url(package_name, package_manager) + printed_package_name = f"[{package_name}]({package_url})" + + printed_sha_info, printed_tag_info = "", "" + if not sc_version_info.get("is_sha"): + # When package manager does not have a field for commit SHA + printed_sha_info = f"[Commit SHA not directly available]({registry_url})" + else: + if sc_version_info.get("sha_status_code") == 404: + printed_sha_info = f"[Commit SHA present but not found in repo]({sc_version_info.get('sha_url')})" + else: + printed_sha_info = f"[Commit SHA present in repo]({sc_version_info.get('sha_url')})" + printed_tag_info = f"Not acquired due to SHA presence" + if not printed_tag_info: + if not sc_version_info.get("exists"): + printed_tag_info = f"[Release tag not found in repo]({sc_version_info.get('tag_url')})" + else: + printed_tag_info = f"[Release tag found in repo]({sc_version_info.get('tag_url')})" row = { "package_name": printed_package_name, "deprecated_in_version": package_data.get("package_info", {}).get("deprecated_in_version"), @@ -79,13 +108,9 @@ def create_dataframe(data, deps_list, package_manager): "is_aliased": aliased_package_name is not None, "aliased_package_name": f"`{aliased_package_name}`" if aliased_package_name else "-", "is_match": match_data.get("match", None), - "sha_exists": sha_exists_info.get("exists", "-"), - "tag_version": f"`{sha_exists_info.get("tag_version", "-")}`", - "is_sha": sha_exists_info.get("is_sha", "-"), - "sha": sha_exists_info.get("sha", "-"), - "tag_url": sha_exists_info.get("url", "-"), - "message": sha_exists_info.get("message", "-"), - "status_code_for_sha": sha_exists_info.get("status_code", "-"), + "sha_exists": sc_version_info.get("exists", False), + "sha_info": printed_sha_info, + "tag_info": printed_tag_info, } rows.append(row) @@ -343,13 +368,8 @@ def write_summary( (df["sha_exists"] == False) & (df["github_exists"] == True), ( [ - "sha_exists", - "tag_version", - "is_sha", - "sha", - "tag_url", - "message", - "status_code_for_sha", + "sha_info", + "tag_info", ] + (["parent"] if package_manager in SHOW_PARENTS else []) + (["command"] if package_manager == "maven" else []) diff --git a/tool/static_analysis.py b/tool/static_analysis.py index 219125c6..c5f00f1f 100644 --- a/tool/static_analysis.py +++ b/tool/static_analysis.py @@ -51,11 +51,14 @@ "source_code_version": { "exists": None, "tag_version": "", + "tag_format": None, "is_sha": None, "sha": "", - "url": "", + "tag_url": None, + "sha_url": None, "message": "", - "status_code": 404, + "tag_status_code": 404, + "sha_status_code": 404, }, "parent_repo_link": "", "open_issues_count": 0, @@ -341,11 +344,13 @@ def check_git_head_presence(package_name, version): source_code_info = { "exists": False, "tag_version": version, + "tag_format": None, "is_sha": False, - "sha": None, - "url": None, + "tag_url": None, + "sha_url": None, "message": "No tags found in the repo", - "status_code": 404, + "tag_status_code": 404, + "sha_status_code": 404, } if package_manager in ["yarn-berry", "yarn-classic", "pnpm", "npm"]: if git_head := check_git_head_presence(package_name, version): @@ -356,22 +361,28 @@ def check_git_head_presence(package_name, version): return { "exists": True, "tag_version": version, + "tag_format": None, "is_sha": True, "sha": git_head, - "url": None, + "tag_url": None, + "sha_url": f"{repo_api}/commits/{git_head}", "message": "gitHead found in package metadata", - "status_code": 200, + "tag_status_code": 404, + "sha_status_code": 200, } else: logging.warning(f"gitHead {git_head} not found in {repo_link}, checking tags") source_code_info = { "exists": False, "tag_version": version, + "tag_format": None, "is_sha": True, "sha": git_head, - "url": None, + "tag_url": None, + "sha_url": f"{repo_api}/commits/{git_head}", "message": f"gitHead {git_head} not found in {repo_link}", - "status_code": 404, + "tag_status_code": 404, + "sha_status_code": 404, } except Exception as e: logging.error(f"Error checking gitHead in repo: {str(e)}") @@ -390,9 +401,10 @@ def check_git_head_presence(package_name, version): release_tag_exists = False if len(have_no_tags_data) == 0: logging.warning(f"No tags found for {package_name} in {repo_api}") - release_tag_url = None + release_tag_url = f"{repo_api}/tags" message = "No tags found in the repo" status_code_release_tag = have_no_tags_response_status_code + existing_tag_format = None else: tag_possible_formats = construct_tag_format(version, package_name, repo_name=simplified_path) existing_tag_format = find_existing_tags_batch(tag_possible_formats, simplified_path) @@ -405,7 +417,7 @@ def check_git_head_presence(package_name, version): status_code_release_tag = 200 else: logging.warning(f"Tag {version} not found in {repo_api}") - release_tag_url = None + release_tag_url = f"{repo_api}/tags" message = f"Tag {version} not found in the repo" status_code_release_tag = 404 @@ -413,9 +425,10 @@ def check_git_head_presence(package_name, version): { "exists": release_tag_exists, "tag_version": version, - "url": release_tag_url, + "tag_format": existing_tag_format, + "tag_url": release_tag_url, "message": message, - "status_code": status_code_release_tag, + "tag_status_code": status_code_release_tag, } )