Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions tests/e2e/regressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
facade
middle
leaf
22 changes: 22 additions & 0 deletions tests/resources/workspaces/hidden_wrapper_external_repo/BUILD
Original file line number Diff line number Diff line change
@@ -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"],
)
Original file line number Diff line number Diff line change
@@ -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",
)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
unchanged
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
alias(
name = "export",
actual = "@private_wrapper//:wrapped",
visibility = ["//visibility:public"],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module(
name = "facade",
version = "1.0",
)

bazel_dep(name = "middle", version = "1.0", repo_name = "private_wrapper")
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
filegroup(
name = "value",
srcs = ["value.txt"],
visibility = ["//visibility:public"],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module(
name = "leaf",
version = "1.0",
)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
before
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
alias(
name = "wrapped",
actual = "@leaf//:value",
visibility = ["//visibility:public"],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module(
name = "middle",
version = "1.0",
)

bazel_dep(name = "leaf", version = "1.0")
8 changes: 8 additions & 0 deletions tools/e2e/rust_e2e_cases.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Loading