diff --git a/tests/e2e/regressions.rs b/tests/e2e/regressions.rs index c9097c3d..fb1e7e9f 100644 --- a/tests/e2e/regressions.rs +++ b/tests/e2e/regressions.rs @@ -213,6 +213,50 @@ fn wrapped_external_repo_change_reaches_main_consumer() { ); } +/// Reproducer for https://github.com/Tinder/bazel-diff/issues/510: like the +/// #197 case above, but the wrapper module (`middle`) is only declared by +/// `facade`, under a private apparent name, so it is not visible from the root. +#[test] +fn hidden_wrapper_external_repo_change_reaches_main_consumer_reproducer_for_issue_510() { + let first = copy_workspace("hidden_wrapper_external_repo"); + let second = copy_workspace("hidden_wrapper_external_repo"); + fs::write(second.path().join("leaf/value.txt"), "after\n").unwrap(); + let impacted = diff_workspaces( + first.path(), + second.path(), + &["--fineGrainedHashExternalRepos", "@leaf"], + ); + assert!( + impacted + .iter() + .any(|label| label == "//:consumer" || label == "@@//:consumer"), + "{impacted:?}" + ); + assert!(!impacted.contains("//:control"), "{impacted:?}"); +} + +/// Control for the issue 510 reproducer: naming every repository in the chain +/// already propagates the change, so the fixture's edges are real and the gap +/// is in discovering `@@middle+` from `@leaf` alone. +#[test] +fn hidden_wrapper_external_repo_change_propagates_with_explicit_chain() { + let first = copy_workspace("hidden_wrapper_external_repo"); + let second = copy_workspace("hidden_wrapper_external_repo"); + fs::write(second.path().join("leaf/value.txt"), "after\n").unwrap(); + let impacted = diff_workspaces( + first.path(), + second.path(), + &["--fineGrainedHashExternalRepos", "@leaf,@facade,@@middle+"], + ); + assert!( + impacted + .iter() + .any(|label| label == "//:consumer" || label == "@@//:consumer"), + "{impacted:?}" + ); + assert!(!impacted.contains("//:control"), "{impacted:?}"); +} + #[test] fn fine_grained_external_hashes_are_hermetic() { let first = copy_workspace("wrapped_external_repo"); diff --git a/tests/resources/workspaces/hidden_wrapper_external_repo/.bazelignore b/tests/resources/workspaces/hidden_wrapper_external_repo/.bazelignore new file mode 100644 index 00000000..991be891 --- /dev/null +++ b/tests/resources/workspaces/hidden_wrapper_external_repo/.bazelignore @@ -0,0 +1,3 @@ +facade +middle +leaf diff --git a/tests/resources/workspaces/hidden_wrapper_external_repo/BUILD b/tests/resources/workspaces/hidden_wrapper_external_repo/BUILD new file mode 100644 index 00000000..9c30b24f --- /dev/null +++ b/tests/resources/workspaces/hidden_wrapper_external_repo/BUILD @@ -0,0 +1,22 @@ +# Reproducer workspace for https://github.com/Tinder/bazel-diff/issues/510. +# +# Shape: +# //:consumer --> @facade//:export +# --> @@middle+//:wrapped (apparent name only inside facade) +# --> @leaf//:value +# --> @leaf//:value.txt +# +# Unlike wrapped_external_repo (#197), the root never declares `middle`: facade +# pulls it in under the private apparent name `private_wrapper`, so `@middle` +# and `@private_wrapper` are not valid from the root. When leaf/value.txt +# changes with --fineGrainedHashExternalRepos=@leaf, //:consumer should be +# impacted without the caller enumerating @facade and @@middle+ too. +filegroup( + name = "consumer", + srcs = ["@facade//:export"], +) + +filegroup( + name = "control", + srcs = ["control.txt"], +) diff --git a/tests/resources/workspaces/hidden_wrapper_external_repo/MODULE.bazel b/tests/resources/workspaces/hidden_wrapper_external_repo/MODULE.bazel new file mode 100644 index 00000000..81ca1352 --- /dev/null +++ b/tests/resources/workspaces/hidden_wrapper_external_repo/MODULE.bazel @@ -0,0 +1,22 @@ +module( + name = "hidden_wrapper_external_repo_test", + version = "0.0.0", +) + +bazel_dep(name = "facade", version = "1.0") +bazel_dep(name = "leaf", version = "1.0") + +local_path_override( + module_name = "facade", + path = "facade", +) + +local_path_override( + module_name = "middle", + path = "middle", +) + +local_path_override( + module_name = "leaf", + path = "leaf", +) diff --git a/tests/resources/workspaces/hidden_wrapper_external_repo/control.txt b/tests/resources/workspaces/hidden_wrapper_external_repo/control.txt new file mode 100644 index 00000000..4eea88a8 --- /dev/null +++ b/tests/resources/workspaces/hidden_wrapper_external_repo/control.txt @@ -0,0 +1 @@ +unchanged diff --git a/tests/resources/workspaces/hidden_wrapper_external_repo/facade/BUILD b/tests/resources/workspaces/hidden_wrapper_external_repo/facade/BUILD new file mode 100644 index 00000000..b2b9a6f2 --- /dev/null +++ b/tests/resources/workspaces/hidden_wrapper_external_repo/facade/BUILD @@ -0,0 +1,5 @@ +alias( + name = "export", + actual = "@private_wrapper//:wrapped", + visibility = ["//visibility:public"], +) diff --git a/tests/resources/workspaces/hidden_wrapper_external_repo/facade/MODULE.bazel b/tests/resources/workspaces/hidden_wrapper_external_repo/facade/MODULE.bazel new file mode 100644 index 00000000..1c6094c5 --- /dev/null +++ b/tests/resources/workspaces/hidden_wrapper_external_repo/facade/MODULE.bazel @@ -0,0 +1,6 @@ +module( + name = "facade", + version = "1.0", +) + +bazel_dep(name = "middle", version = "1.0", repo_name = "private_wrapper") diff --git a/tests/resources/workspaces/hidden_wrapper_external_repo/leaf/BUILD b/tests/resources/workspaces/hidden_wrapper_external_repo/leaf/BUILD new file mode 100644 index 00000000..6a3642f4 --- /dev/null +++ b/tests/resources/workspaces/hidden_wrapper_external_repo/leaf/BUILD @@ -0,0 +1,5 @@ +filegroup( + name = "value", + srcs = ["value.txt"], + visibility = ["//visibility:public"], +) diff --git a/tests/resources/workspaces/hidden_wrapper_external_repo/leaf/MODULE.bazel b/tests/resources/workspaces/hidden_wrapper_external_repo/leaf/MODULE.bazel new file mode 100644 index 00000000..ffeccad6 --- /dev/null +++ b/tests/resources/workspaces/hidden_wrapper_external_repo/leaf/MODULE.bazel @@ -0,0 +1,4 @@ +module( + name = "leaf", + version = "1.0", +) diff --git a/tests/resources/workspaces/hidden_wrapper_external_repo/leaf/value.txt b/tests/resources/workspaces/hidden_wrapper_external_repo/leaf/value.txt new file mode 100644 index 00000000..90be1f30 --- /dev/null +++ b/tests/resources/workspaces/hidden_wrapper_external_repo/leaf/value.txt @@ -0,0 +1 @@ +before diff --git a/tests/resources/workspaces/hidden_wrapper_external_repo/middle/BUILD b/tests/resources/workspaces/hidden_wrapper_external_repo/middle/BUILD new file mode 100644 index 00000000..705d16a5 --- /dev/null +++ b/tests/resources/workspaces/hidden_wrapper_external_repo/middle/BUILD @@ -0,0 +1,5 @@ +alias( + name = "wrapped", + actual = "@leaf//:value", + visibility = ["//visibility:public"], +) diff --git a/tests/resources/workspaces/hidden_wrapper_external_repo/middle/MODULE.bazel b/tests/resources/workspaces/hidden_wrapper_external_repo/middle/MODULE.bazel new file mode 100644 index 00000000..7c8526fb --- /dev/null +++ b/tests/resources/workspaces/hidden_wrapper_external_repo/middle/MODULE.bazel @@ -0,0 +1,6 @@ +module( + name = "middle", + version = "1.0", +) + +bazel_dep(name = "leaf", version = "1.0") diff --git a/tools/e2e/rust_e2e_cases.bzl b/tools/e2e/rust_e2e_cases.bzl index ec9e36b6..f9c92259 100644 --- a/tools/e2e/rust_e2e_cases.bzl +++ b/tools/e2e/rust_e2e_cases.bzl @@ -131,6 +131,14 @@ RUST_E2E_SUITES = [ "name": "regressions::hashes_are_hermetic_across_workspace_paths", "timeout": "moderate", }, + { + "name": "regressions::hidden_wrapper_external_repo_change_propagates_with_explicit_chain", + "timeout": "moderate", + }, + { + "name": "regressions::hidden_wrapper_external_repo_change_reaches_main_consumer_reproducer_for_issue_510", + "timeout": "moderate", + }, { "name": "regressions::local_path_override_works_for_query_and_cquery", "timeout": "moderate",