diff --git a/src/main/java/com/google/devtools/build/lib/util/DependencySet.java b/src/main/java/com/google/devtools/build/lib/util/DependencySet.java index 8c39bdb8d38a4f..df87304e5584be 100644 --- a/src/main/java/com/google/devtools/build/lib/util/DependencySet.java +++ b/src/main/java/com/google/devtools/build/lib/util/DependencySet.java @@ -26,6 +26,8 @@ import java.util.Collection; import java.util.Collections; import java.util.concurrent.atomic.AtomicReference; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.annotation.Nullable; /** @@ -104,7 +106,7 @@ private String translatePath(String path) { if (OS.getCurrent() != OS.WINDOWS) { return path; } - return WindowsPath.translateWindowsPath(path); + return WindowsPath.removeWorkspace(WindowsPath.translateWindowsPath(path)); } /** Reads a dotd file into this DependencySet instance. */ @@ -251,6 +253,17 @@ public int hashCode() { private static final class WindowsPath { private static final AtomicReference UNIX_ROOT = new AtomicReference<>(null); + private static final Pattern EXECROOT_BASE_HEADER_PATTERN = + Pattern.compile(".*execroot[\\\\/](?.*)"); + + private static String removeWorkspace(String path) { + Matcher m = EXECROOT_BASE_HEADER_PATTERN.matcher(path); + if (m.matches()) { + path = "../" + m.group("headerPath"); + } + return path; + } + private static String translateWindowsPath(String path) { int n = path.length(); if (n == 0 || path.charAt(0) != '/') {