)]}'
{
  "commit": "60611a91a941dd79ab08c66d706b1a44610dfe1e",
  "tree": "bdadb3fa2180fc6c31de9259e77594618802a53e",
  "parents": [
    "2c8e8ac3d0d23294cd666c6eeaea7770a721768f"
  ],
  "author": {
    "name": "JonathanPerry651",
    "email": "jonathan.perry@gs.com",
    "time": "Fri Jul 10 12:14:03 2026 +0100"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Jul 10 12:14:03 2026 +0100"
  },
  "message": "feat: Support pluggable dependency download and metadata caching SPIs (#1589)\n\nProvides pluggable SPIs for rules_jvm_external\u0027s dependency resolution, allowing custom download/caching and authentication implementations (such as integrating with Bazel\u0027s remote fetcher/downloader APIs) to be registered via classpath plugins.\n\nKey Changes:\n1. Public API Targets \u0026 SPIs:\n   - Created public interfaces for MetadataService, DependencyMetadata, and DownloadService.\n   - Added a generic SpiLoader utility to load classpath SPI service implementations (ensuring at most one implementation is loaded per SPI).\n   - Exposed custom classpath library loading via the new resolver_extra_dependencies attribute.\n   - Decomposed the API targets into fine-grained libraries: :api_core, :download_service, :metadata_service, and :spi_loader.\n   - Relocated the build definition closer to the sources in //resolver/src/main/java/com/github/bazelbuild/rules_jvm_external/resolver/BUILD.\n   - Flattened public SPI classes into a single package (com.github.bazelbuild.rules_jvm_external.resolver) to prevent split-package issues and avoid spanning multiple packages.\n\n2. Aether \u0026 Downloader SPI Integration:\n   - Replaced Aether\u0027s default HTTP transport with a custom HttpDownloaderTransporterFactory, routing all POM, BOM, and metadata lookups through the pluggable DownloadService SPI.\n   - Extracted HttpDownloaderTransporter into its own top-level package-private class.\n   - Renamed DownloadService.download to get to match HTTP verb naming conventions and align with head.\n   - Implemented null-safe defensive copying of collections in DependencyMetadata constructor using Set.copyOf/Map.copyOf.\n\n3. Inline URL Credentials Handling:\n   - Aether downloads are now routed through the pluggable DownloadService SPI backed by HttpDownloader without inline credentials support (making both resolution and downloading fail consistently). Users must configure credentials via .netrc instead.\n   - Deleted the shouldDownloadOverHttpWithAuthenticationPassedInOnRepoUrl test from ResolverTestBase.java since that flow does not work and is explicitly unsupported.\n\n4. Cleanup \u0026 Optimization:\n   - Removed final modifier from SpiLoader class and refactored joining logic to use Guava Joiner.\n   - Removed redundant metadata caches and unused resolver binaries.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "eb4c1801b9cf82d5c144be8cd3b8ea6f359aa74d",
      "old_mode": 33188,
      "old_path": "MODULE.bazel",
      "new_id": "1ffd2ffdfe0fc07408b3775137c24b042929e093",
      "new_mode": 33188,
      "new_path": "MODULE.bazel"
    },
    {
      "type": "modify",
      "old_id": "7b6adc443098d2d07cd276bc040baca973380cf6",
      "old_mode": 33188,
      "old_path": "private/extensions/maven.bzl",
      "new_id": "a9a148b6cfca6418eb0a777db662f57a49018d97",
      "new_mode": 33188,
      "new_path": "private/extensions/maven.bzl"
    },
    {
      "type": "modify",
      "old_id": "8ba3beed89744de826c4868d5820f9024018bc95",
      "old_mode": 33188,
      "old_path": "private/rules/coursier.bzl",
      "new_id": "b852de704d0166426b634ec2788d886128240c36",
      "new_mode": 33188,
      "new_path": "private/rules/coursier.bzl"
    },
    {
      "type": "modify",
      "old_id": "757c803cb75f7dbc6a465872c36662fe0ee31ad6",
      "old_mode": 33188,
      "old_path": "private/rules/maven_install.bzl",
      "new_id": "f4d742fceb1ebf3805231a91ee6a61c9f27e8e6f",
      "new_mode": 33188,
      "new_path": "private/rules/maven_install.bzl"
    },
    {
      "type": "modify",
      "old_id": "c670236f62c346a9a0978aab169711ae55b9d430",
      "old_mode": 33188,
      "old_path": "private/rules/pin_dependencies.bzl",
      "new_id": "50d2e728d8917f0041b8b1849ff224bfc2ee21bd",
      "new_mode": 33188,
      "new_path": "private/rules/pin_dependencies.bzl"
    },
    {
      "type": "modify",
      "old_id": "f1794744d7b26e1bbf822825e4ec8a2e3e5a2eac",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/BUILD",
      "new_id": "02211f32c922f50c9760926e5252a973e75804e8",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/BUILD"
    },
    {
      "type": "modify",
      "old_id": "c83d5214bc09d0b6b21022627517e2f9c3e7cc67",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/BUILD",
      "new_id": "de5ba86f808ec74824713c82405ceb34cb58b41d",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/jar/BUILD"
    },
    {
      "type": "modify",
      "old_id": "450dfedd83d714ed13c32307220d117a84e760ea",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/BUILD",
      "new_id": "0d776a8df657e916a0336dcb0f3f5e6a20b8f5b9",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/BUILD"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "61aaead2719d97302f0b34be59d2f6b3afc1ab4a",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/SpiLoader.java"
    },
    {
      "type": "modify",
      "old_id": "5097e16706315e41e3dea76dba8c3e6381139f7b",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/AbstractMain.java",
      "new_id": "54fe67385bc17bf22335f1e834ce8b999508f8bf",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/AbstractMain.java"
    },
    {
      "type": "modify",
      "old_id": "a9689fe5f5bb896c502c9b820dff02835770d756",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/BUILD",
      "new_id": "4a89da6b59185fa583503e30f75942c24d2fec9c",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/cmd/BUILD"
    },
    {
      "type": "modify",
      "old_id": "a4c14d0d9aa04203ea49318d89a9ad2bff02581f",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/gradle/BUILD",
      "new_id": "8a603e70c4f3ffa1aff1c7153d49df947cf3e58b",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/gradle/BUILD"
    },
    {
      "type": "modify",
      "old_id": "d200069ecbdc2160a2233b88f7f161027aa6c238",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/lockfile/V3LockFile.java",
      "new_id": "356f29c1eee5353c30ca8e30526573ea3af4afbc",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/lockfile/V3LockFile.java"
    },
    {
      "type": "modify",
      "old_id": "045917dd840f4bed750186ddad53443f0bd2c971",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/maven/BUILD",
      "new_id": "152658b1938da9d3f1d4a9aab3ba78a0f5488193",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/maven/BUILD"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f9ce086e12ef5f5a164a546f989a94beb510968e",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/maven/HttpDownloaderTransporter.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "085a7a0e8925a2792121ce615ade8b0f1ab62d06",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/maven/HttpDownloaderTransporterFactory.java"
    },
    {
      "type": "modify",
      "old_id": "d5c660451ba950e740f91e7315a182264cd7bd4f",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/maven/MavenResolver.java",
      "new_id": "7d7150dcee21d2000dc27a022e0c150581ce0fd9",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/maven/MavenResolver.java"
    },
    {
      "type": "modify",
      "old_id": "5074f1c309da68d3265548814e759538e7630a1e",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/remote/BUILD",
      "new_id": "40fd2442f37e5c885dbea4bf8ab44b4a1be5d3e4",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/remote/BUILD"
    },
    {
      "type": "modify",
      "old_id": "5e707a28d3150e7d6fbff2d962bff28702c75376",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/remote/Downloader.java",
      "new_id": "38d5e3bf77bee11cb1fe89c197e22505325c7845",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/remote/Downloader.java"
    },
    {
      "type": "modify",
      "old_id": "9768965fc37be3ba351b3cf796cb244b25e2eec7",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/remote/HttpDownloader.java",
      "new_id": "836ddefbffb83b709de614656357a14e1ba31b4b",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/remote/HttpDownloader.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "a15ae03e5def6fc8943a921e9f612709220df28a",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/remote/LocalMetadataService.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "47db5c2ba31e9859570849999bc01d484e69bf37",
      "new_mode": 33188,
      "new_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/remote/META-INF/services/com.github.bazelbuild.rules_jvm_external.resolver.remote.MetadataService"
    },
    {
      "type": "modify",
      "old_id": "ef4445990ce0e92c54b4041b33b6e8bcbaa1547d",
      "old_mode": 33261,
      "old_path": "private/tools/prebuilt/lock_file_converter_deploy.jar",
      "new_id": "994a35abb397ccd2712e60a410a5a9c469f5b42f",
      "new_mode": 33261,
      "new_path": "private/tools/prebuilt/lock_file_converter_deploy.jar"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "dea7cddeb1487595783054936796ef65fbd8c030",
      "new_mode": 33188,
      "new_path": "resolver/BUILD"
    },
    {
      "type": "rename",
      "old_id": "92babce1410f57701b93dc3113a2a6893d28570d",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/Artifact.java",
      "new_id": "92babce1410f57701b93dc3113a2a6893d28570d",
      "new_mode": 33188,
      "new_path": "resolver/src/main/java/com/github/bazelbuild/rules_jvm_external/resolver/Artifact.java",
      "score": 100
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "814ff66c357ece56e03710b3f38c138eaae6501b",
      "new_mode": 33188,
      "new_path": "resolver/src/main/java/com/github/bazelbuild/rules_jvm_external/resolver/DependencyMetadata.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c083ade4975db8e62cc81cf0d53513d7c53f5ec7",
      "new_mode": 33188,
      "new_path": "resolver/src/main/java/com/github/bazelbuild/rules_jvm_external/resolver/DownloadService.java"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "8307fbf2b5d10457358dcc1618b981883db744ec",
      "new_mode": 33188,
      "new_path": "resolver/src/main/java/com/github/bazelbuild/rules_jvm_external/resolver/MetadataService.java"
    },
    {
      "type": "rename",
      "old_id": "3c51bd10545f84ec6a8f6eeb4eca16f296098bb4",
      "old_mode": 33188,
      "old_path": "private/tools/java/com/github/bazelbuild/rules_jvm_external/resolver/ResolutionRequest.java",
      "new_id": "3c51bd10545f84ec6a8f6eeb4eca16f296098bb4",
      "new_mode": 33188,
      "new_path": "resolver/src/main/java/com/github/bazelbuild/rules_jvm_external/resolver/ResolutionRequest.java",
      "score": 100
    },
    {
      "type": "modify",
      "old_id": "f399e5311a5818baf1dc56052c45f7d51b53e951",
      "old_mode": 33188,
      "old_path": "tests/com/github/bazelbuild/rules_jvm_external/resolver/BUILD",
      "new_id": "aebb79081b3ef1acf7fd59978ec1cac1c70c8ac2",
      "new_mode": 33188,
      "new_path": "tests/com/github/bazelbuild/rules_jvm_external/resolver/BUILD"
    },
    {
      "type": "modify",
      "old_id": "52498d2f68f97c067cd3a2915c1c9aa235129681",
      "old_mode": 33188,
      "old_path": "tests/com/github/bazelbuild/rules_jvm_external/resolver/ResolverTestBase.java",
      "new_id": "11b628169e9a2a3b2310e7d8888108b3992fada8",
      "new_mode": 33188,
      "new_path": "tests/com/github/bazelbuild/rules_jvm_external/resolver/ResolverTestBase.java"
    },
    {
      "type": "modify",
      "old_id": "7f86a4d6c5f569326f737d55640b2efc7dcb55b4",
      "old_mode": 33188,
      "old_path": "tests/unit/BUILD",
      "new_id": "7ca05abff3e224184f2cba3d0a53282747416382",
      "new_mode": 33188,
      "new_path": "tests/unit/BUILD"
    }
  ]
}
