From 88226069c076336733e3975f777742ddb172bf06 Mon Sep 17 00:00:00 2001 From: Farid Zakaria Date: Mon, 24 Feb 2025 13:41:40 -0800 Subject: [PATCH 1/3] Do not warn on duplicate entries if force_version set fixes #1333 --- private/rules/coursier.bzl | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/private/rules/coursier.bzl b/private/rules/coursier.bzl index 9f877a927..da72ca7ed 100644 --- a/private/rules/coursier.bzl +++ b/private/rules/coursier.bzl @@ -726,27 +726,45 @@ def infer_artifact_path_from_primary_and_repos(primary_url, repository_urls): break return primary_artifact_path +def _artifact_to_coordinate(artifact): + """ + Convert an artifact to a maven coordinate string. + """ + + return artifact["group"] + ":" + artifact["artifact"] + (":%s" % artifact["classifier"] if artifact.get("classifier") != None else "") + def _check_artifacts_are_unique(artifacts, duplicate_version_warning): if duplicate_version_warning == "none": return seen_artifacts = {} duplicate_artifacts = {} for artifact in artifacts: - artifact_coordinate = artifact["group"] + ":" + artifact["artifact"] + (":%s" % artifact["classifier"] if artifact.get("classifier") != None else "") + artifact_coordinate = _artifact_to_coordinate(artifact) if artifact_coordinate in seen_artifacts: # Don't warn if the same version is in the list multiple times - if seen_artifacts[artifact_coordinate] != artifact["version"]: + if seen_artifacts[artifact_coordinate]["version"] != artifact["version"]: if artifact_coordinate in duplicate_artifacts: - duplicate_artifacts[artifact_coordinate].append(artifact["version"]) + duplicate_artifacts[artifact_coordinate].append(artifact) else: - duplicate_artifacts[artifact_coordinate] = [artifact["version"]] + duplicate_artifacts[artifact_coordinate] = [seen_artifacts[artifact_coordinate], artifact] else: - seen_artifacts[artifact_coordinate] = artifact["version"] + seen_artifacts[artifact_coordinate] = artifact + + # go through the duplicate_artifacts and if the list of artifacts contains exactly one with force_version set to True + # remove it from teh duplicate_artifacts entry + duplicate_artifacts_to_remove = [] + for duplicate in duplicate_artifacts: + forced_versions = [artifact for artifact in duplicate_artifacts[duplicate] if artifact.get("force_version", False)] + if len(forced_versions) == 1: + duplicate_artifacts_to_remove.append(duplicate) + for duplicate in duplicate_artifacts_to_remove: + duplicate_artifacts.pop(duplicate) if duplicate_artifacts: msg_parts = ["Found duplicate artifact versions"] for duplicate in duplicate_artifacts: - msg_parts.append(" {} has multiple versions {}".format(duplicate, ", ".join([seen_artifacts[duplicate]] + duplicate_artifacts[duplicate]))) + versions = [artifact["version"] for artifact in duplicate_artifacts[duplicate]] + msg_parts.append(" {} has multiple versions {}".format(duplicate, ", ".join(versions))) msg_parts.append("Please remove duplicate artifacts from the artifact list so you do not get unexpected artifact versions") if duplicate_version_warning == "error": fail("\n".join(msg_parts)) From ba688540ba710ab18a3b0f09b87acdb2bf6ad497 Mon Sep 17 00:00:00 2001 From: Farid Zakaria Date: Tue, 11 Mar 2025 09:10:13 -0700 Subject: [PATCH 2/3] Addressed feedback --- private/rules/coursier.bzl | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/private/rules/coursier.bzl b/private/rules/coursier.bzl index da72ca7ed..2176cdd79 100644 --- a/private/rules/coursier.bzl +++ b/private/rules/coursier.bzl @@ -29,6 +29,7 @@ load( "COURSIER_CLI_GITHUB_ASSET_URL", "COURSIER_CLI_SHA256", ) +load("//private/lib:coordinates.bzl", "to_external_form") load("//private/lib:urls.bzl", "remove_auth_from_url") load("//private/rules:v1_lock_file.bzl", "v1_lock_file") load("//private/rules:v2_lock_file.bzl", "v2_lock_file") @@ -726,20 +727,13 @@ def infer_artifact_path_from_primary_and_repos(primary_url, repository_urls): break return primary_artifact_path -def _artifact_to_coordinate(artifact): - """ - Convert an artifact to a maven coordinate string. - """ - - return artifact["group"] + ":" + artifact["artifact"] + (":%s" % artifact["classifier"] if artifact.get("classifier") != None else "") - def _check_artifacts_are_unique(artifacts, duplicate_version_warning): if duplicate_version_warning == "none": return seen_artifacts = {} duplicate_artifacts = {} for artifact in artifacts: - artifact_coordinate = _artifact_to_coordinate(artifact) + artifact_coordinate = to_external_form(artifact) if artifact_coordinate in seen_artifacts: # Don't warn if the same version is in the list multiple times if seen_artifacts[artifact_coordinate]["version"] != artifact["version"]: @@ -751,7 +745,7 @@ def _check_artifacts_are_unique(artifacts, duplicate_version_warning): seen_artifacts[artifact_coordinate] = artifact # go through the duplicate_artifacts and if the list of artifacts contains exactly one with force_version set to True - # remove it from teh duplicate_artifacts entry + # remove it from the duplicate_artifacts entry duplicate_artifacts_to_remove = [] for duplicate in duplicate_artifacts: forced_versions = [artifact for artifact in duplicate_artifacts[duplicate] if artifact.get("force_version", False)] From 88c0fbb0a8099cbe8b632bb69d1e0cdf088ecd15 Mon Sep 17 00:00:00 2001 From: Farid Zakaria Date: Thu, 13 Mar 2025 12:00:48 -0700 Subject: [PATCH 3/3] Handle dict type artifact in to_external_form --- private/lib/coordinates.bzl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/private/lib/coordinates.bzl b/private/lib/coordinates.bzl index cad6efedd..2542fdb78 100644 --- a/private/lib/coordinates.bzl +++ b/private/lib/coordinates.bzl @@ -101,6 +101,16 @@ def to_external_form(coords): if type(coords) == "string": unpacked = unpack_coordinates(coords) + elif type(coords) == "struct": + unpacked = coords + elif type(coords) == "dict": + unpacked = struct( + group = coords["group"], + artifact = coords["artifact"], + version = coords["version"], + packaging = coords.get("packaging"), + classifier = coords.get("classifier"), + ) else: unpacked = coords