GlobalBuildInfo plugin should search packed references for commit IDs (#47464) (#47936)

* GlobalBuildInfo plugin searches packed references

In recent versions of Git, references may be packed in a packed-refs
file. If this happens, Gradle will need to look in that file to find
build information.
This commit is contained in:
William Brafford 2019-10-11 14:47:34 -04:00 committed by GitHub
parent 256102042b
commit fe8767789a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 27 additions and 4 deletions

View File

@ -28,7 +28,10 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
public class GlobalBuildInfoPlugin implements Plugin<Project> { public class GlobalBuildInfoPlugin implements Plugin<Project> {
private static final String GLOBAL_INFO_EXTENSION_NAME = "globalInfo"; private static final String GLOBAL_INFO_EXTENSION_NAME = "globalInfo";
@ -261,7 +264,23 @@ public class GlobalBuildInfoPlugin implements Plugin<Project> {
} }
final String ref = readFirstLine(head); final String ref = readFirstLine(head);
if (ref.startsWith("ref:")) { if (ref.startsWith("ref:")) {
revision = readFirstLine(gitDir.resolve(ref.substring("ref:".length()).trim())); String refName = ref.substring("ref:".length()).trim();
Path refFile = gitDir.resolve(refName);
if (Files.exists(refFile)) {
revision = readFirstLine(refFile);
} else if (Files.exists(dotGit.resolve("packed-refs"))) {
// Check packed references for commit ID
Pattern p = Pattern.compile("^([a-f0-9]{40}) " + refName + "$");
try (Stream<String> lines = Files.lines(dotGit.resolve("packed-refs"))) {
revision = lines.map(p::matcher)
.filter(Matcher::matches)
.map(m -> m.group(1))
.findFirst()
.orElseThrow(() -> new IOException("Packed reference not found for refName " + refName));
}
} else {
throw new GradleException("Can't find revision for refName " + refName);
}
} else { } else {
// we are in detached HEAD state // we are in detached HEAD state
revision = ref; revision = ref;
@ -274,8 +293,12 @@ public class GlobalBuildInfoPlugin implements Plugin<Project> {
} }
private static String readFirstLine(final Path path) throws IOException { private static String readFirstLine(final Path path) throws IOException {
return Files.lines(path, StandardCharsets.UTF_8) String firstLine;
.findFirst() try (Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8)) {
.orElseThrow(() -> new IOException("file [" + path + "] is empty")); firstLine = lines
.findFirst()
.orElseThrow(() -> new IOException("file [" + path + "] is empty"));
}
return firstLine;
} }
} }