From e63f3a85acf2b7d76b48bda6c2e12f74a0b8c9f9 Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Fri, 6 Feb 2026 23:05:12 +0100 Subject: [PATCH 1/3] Error on single_version_override patch with wrong patch_strip --- .../repository/decompressor/PatchUtil.java | 12 ++++++ .../bazel/bzlmod/ModuleFileFunctionTest.java | 41 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/decompressor/PatchUtil.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/decompressor/PatchUtil.java index d756ea1dc95a8b..a9753d3b6cd4ed 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/decompressor/PatchUtil.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/decompressor/PatchUtil.java @@ -447,6 +447,8 @@ private static void applyInternal( throw new PatchFailedException("Cannot find patch file: " + patchFile.getPathString()); } + String singleFileStr = + singleFile != null ? singleFile.relativeTo(outputDirectory).getPathString() : null; boolean isGitDiff = false; boolean hasRenameFrom = false; boolean hasRenameTo = false; @@ -594,6 +596,16 @@ private static void applyInternal( oldFile, newFile, oldFileStr, newFileStr, patchStartLocation); } } + if (singleFileStr != null + && strip == 0 + && ("a/" + singleFileStr).equals(oldFileStr) + && ("b/" + singleFileStr).equals(newFileStr)) { + throw new PatchFailedException( + String.format( + "error at line %d: the patch file contains a/b prefixes, did you forget to" + + " set patch_strip = 1?", + i + 1)); + } if (singleFile == null || (singleFile.equals(newFile) && singleFile.equals(oldFile))) { Patch patch = UnifiedDiffUtils.parseUnifiedDiff(patchContent); diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java index a9862288d75467..2a58ca55c7aff7 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java @@ -1875,6 +1875,47 @@ public void testSingleVersionOverridePatches() throws Exception { "ccc", InterimModule.DepSpec.fromModuleKey(new ModuleKey("ccc", Version.parse("2.0")))); } + @Test + public void testSingleVersionOverridePatches_defaultPatchStripForGitPatch() throws Exception { + FakeRegistry registry = registryFactory.newFakeRegistry("/foo"); + ModuleFileFunction.REGISTRIES.set(differencer, ImmutableSet.of(registry.getUrl())); + ModuleKey bbb = createModuleKey("bbb", "1.0"); + registry.addModule(bbb, "module(name='bbb',version='1.0')"); + + scratch.file("BUILD"); + scratch.file( + "patch.diff", + """ + diff --git a/MODULE.bazel b/MODULE.bazel + --- a/MODULE.bazel + +++ b/MODULE.bazel + @@ -1,1 +1,1 @@ + -module(name='bbb',version='1.0') + +module(name='bbb',version='1.0',bazel_compatibility=[">=7.0.0"]) + """); + scratch.overwriteFile( + rootDirectory.getRelative("MODULE.bazel").getPathString(), + """ + single_version_override( + module_name="bbb", + patches = [ + "//:patch.diff", + ], + ) + """); + + var moduleFileKey = ModuleFileValue.key(bbb); + EvaluationResult result = + evaluator.evaluate(ImmutableList.of(moduleFileKey), evaluationContext); + assertThat(result.hasError()).isTrue(); + assertThat(result.getError().getException()) + .hasMessageThat() + .isEqualTo( + "error applying single_version_override patch /workspace/patch.diff to module file:" + + " error at line 7: the patch file contains a/b prefixes, did you forget to set" + + " patch_strip = 1?"); + } + @Test public void testSingleVersionOverridePatches_failsOnRename() throws Exception { FakeRegistry registry = registryFactory.newFakeRegistry("/foo"); From 07bc783d92d1e233520fb509814c9786d2888a6e Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Fri, 6 Feb 2026 23:12:48 +0100 Subject: [PATCH 2/3] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../build/lib/bazel/repository/decompressor/PatchUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/decompressor/PatchUtil.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/decompressor/PatchUtil.java index a9753d3b6cd4ed..6793078dd7a44b 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/decompressor/PatchUtil.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/decompressor/PatchUtil.java @@ -604,7 +604,7 @@ private static void applyInternal( String.format( "error at line %d: the patch file contains a/b prefixes, did you forget to" + " set patch_strip = 1?", - i + 1)); + patchStartLocation)); } if (singleFile == null || (singleFile.equals(newFile) && singleFile.equals(oldFile))) { From d33012272803f9942a8abc680dfd2c2bbc87ca4b Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Fri, 6 Feb 2026 23:35:46 +0100 Subject: [PATCH 3/3] Update ModuleFileFunctionTest.java --- .../devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java index 2a58ca55c7aff7..88962dbb819a84 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunctionTest.java @@ -1912,7 +1912,7 @@ public void testSingleVersionOverridePatches_defaultPatchStripForGitPatch() thro .hasMessageThat() .isEqualTo( "error applying single_version_override patch /workspace/patch.diff to module file:" - + " error at line 7: the patch file contains a/b prefixes, did you forget to set" + + " error at line 2: the patch file contains a/b prefixes, did you forget to set" + " patch_strip = 1?"); }