* 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:
parent
256102042b
commit
fe8767789a
|
@ -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;
|
||||||
|
try (Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8)) {
|
||||||
|
firstLine = lines
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElseThrow(() -> new IOException("file [" + path + "] is empty"));
|
.orElseThrow(() -> new IOException("file [" + path + "] is empty"));
|
||||||
}
|
}
|
||||||
|
return firstLine;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue