diff --git a/crate_universe/private/crates_repository.bzl b/crate_universe/private/crates_repository.bzl
index 0a3de518da..7924711372 100644
--- a/crate_universe/private/crates_repository.bzl
+++ b/crate_universe/private/crates_repository.bzl
@@ -50,6 +50,7 @@ def _crates_repository_impl(repository_ctx):
splicing_manifest = splicing_manifest,
cargo = cargo_path,
rustc = rustc_path,
+ repin_instructions = repository_ctx.attr.repin_instructions,
)
# If re-pinning is enabled, gather additional inputs for the generator
@@ -281,6 +282,9 @@ CARGO_BAZEL_REPIN=1 CARGO_BAZEL_REPIN_ONLY=crate_index bazel sync --only=crate_i
"generate the value for this field. If unset, the defaults defined there will be used."
),
),
+ "repin_instructions": attr.string(
+ doc = "Instructions to re-pin the repository if required. Many people have wrapper scripts for keeping dependencies up to date, and would like to point users to that instead of the default.",
+ ),
"rust_toolchain_cargo_template": attr.string(
doc = (
"The template to use for finding the host `cargo` binary. `{version}` (eg. '1.53.0'), " +
diff --git a/crate_universe/private/generate_utils.bzl b/crate_universe/private/generate_utils.bzl
index a6c88dd81b..94dcdd2360 100644
--- a/crate_universe/private/generate_utils.bzl
+++ b/crate_universe/private/generate_utils.bzl
@@ -336,7 +336,7 @@ def get_lockfiles(repository_ctx):
bazel = repository_ctx.path(repository_ctx.attr.lockfile) if repository_ctx.attr.lockfile else None,
)
-def determine_repin(repository_ctx, generator, lockfile_path, config, splicing_manifest, cargo, rustc):
+def determine_repin(repository_ctx, generator, lockfile_path, config, splicing_manifest, cargo, rustc, repin_instructions = None):
"""Use the `cargo-bazel` binary to determine whether or not dpeendencies need to be re-pinned
Args:
@@ -347,6 +347,7 @@ def determine_repin(repository_ctx, generator, lockfile_path, config, splicing_m
lockfile_path (path): The path to a "lock" file for reproducible outputs.
cargo (path): The path to a Cargo binary.
rustc (path): The path to a Rustc binary.
+ repin_instructions (optional string): Instructions to re-pin dependencies in your repository. Will be shown when re-pinning is required.
Returns:
bool: True if dependencies need to be re-pinned
@@ -403,14 +404,22 @@ def determine_repin(repository_ctx, generator, lockfile_path, config, splicing_m
# flag indicating repinning was requested, an error is raised
# since repinning should be an explicit action
if result.return_code:
- fail(("\n".join([
- result.stderr,
- (
- "The current `lockfile` is out of date for '{}'. Please re-run " +
- "bazel using `CARGO_BAZEL_REPIN=true` if this is expected " +
- "and the lockfile should be updated."
- ).format(repository_ctx.name),
- ])))
+ if repin_instructions:
+ msg = ("\n".join([
+ result.stderr,
+ "The current `lockfile` is out of date for '{}'.".format(repository_ctx.name),
+ repin_instructions,
+ ]))
+ else:
+ msg = ("\n".join([
+ result.stderr,
+ (
+ "The current `lockfile` is out of date for '{}'. Please re-run " +
+ "bazel using `CARGO_BAZEL_REPIN=true` if this is expected " +
+ "and the lockfile should be updated."
+ ).format(repository_ctx.name),
+ ]))
+ fail(msg)
return False
diff --git a/docs/crate_universe.md b/docs/crate_universe.md
index 806ef9041e..11588b4971 100644
--- a/docs/crate_universe.md
+++ b/docs/crate_universe.md
@@ -752,7 +752,7 @@ str: A json encoded string of the parameters provided
crates_repository(name, annotations, cargo_config, cargo_lockfile, generate_binaries,
generate_build_scripts, generate_target_compatible_with, generator,
generator_sha256s, generator_urls, isolated, lockfile, manifests, packages, quiet,
- render_config, repo_mapping, rust_toolchain_cargo_template,
+ render_config, repin_instructions, repo_mapping, rust_toolchain_cargo_template,
rust_toolchain_rustc_template, rust_version, splicing_config,
supported_platform_triples)
@@ -867,6 +867,7 @@ CARGO_BAZEL_REPIN=1 CARGO_BAZEL_REPIN_ONLY=crate_index bazel sync --only=crate_i
| packages | A set of crates (packages) specifications to depend on. See [crate.spec](#crate.spec). | Dictionary: String -> String | optional | `{}` |
| quiet | If stdout and stderr should not be printed to the terminal. | Boolean | optional | `True` |
| render_config | The configuration flags to use for rendering. Use `//crate_universe:defs.bzl\%render_config` to generate the value for this field. If unset, the defaults defined there will be used. | String | optional | `""` |
+| repin_instructions | Instructions to re-pin the repository if required. Many people have wrapper scripts for keeping dependencies up to date, and would like to point users to that instead of the default. | String | optional | `""` |
| repo_mapping | In `WORKSPACE` context only: a dictionary from local repository name to global repository name. This allows controls over workspace dependency resolution for dependencies of this repository.
For example, an entry `"@foo": "@bar"` declares that, for any time this repository depends on `@foo` (such as a dependency on `@foo//some:target`, it should actually resolve that dependency within globally-declared `@bar` (`@bar//some:target`).
This attribute is _not_ supported in `MODULE.bazel` context (when invoking a repository rule inside a module extension's implementation function). | Dictionary: String -> String | optional | |
| rust_toolchain_cargo_template | The template to use for finding the host `cargo` binary. `{version}` (eg. '1.53.0'), `{triple}` (eg. 'x86_64-unknown-linux-gnu'), `{arch}` (eg. 'aarch64'), `{vendor}` (eg. 'unknown'), `{system}` (eg. 'darwin'), `{cfg}` (eg. 'exec'), `{channel}` (eg. 'stable'), and `{tool}` (eg. 'rustc.exe') will be replaced in the string if present. | String | optional | `"@rust_{system}_{arch}__{triple}__{channel}_tools//:bin/{tool}"` |
| rust_toolchain_rustc_template | The template to use for finding the host `rustc` binary. `{version}` (eg. '1.53.0'), `{triple}` (eg. 'x86_64-unknown-linux-gnu'), `{arch}` (eg. 'aarch64'), `{vendor}` (eg. 'unknown'), `{system}` (eg. 'darwin'), `{cfg}` (eg. 'exec'), `{channel}` (eg. 'stable'), and `{tool}` (eg. 'cargo.exe') will be replaced in the string if present. | String | optional | `"@rust_{system}_{arch}__{triple}__{channel}_tools//:bin/{tool}"` |