2
0
Fork 0
mirror of https://github.com/ethauvin/bld.git synced 2025-04-26 08:37:11 -07:00
This commit is contained in:
Geert Bevin 2024-07-22 22:13:39 -04:00
parent 586aec0eae
commit ad8a866dc3
4 changed files with 116 additions and 107 deletions

View file

@ -1593,7 +1593,7 @@ public class BaseProject extends BuildExecutor {
private void performAutoDownloadPurge() { private void performAutoDownloadPurge() {
var resolution = new VersionResolution(properties()); var resolution = new VersionResolution(properties());
var cache = new BldCache(libBldDirectory(), resolution); var cache = new BldCache(libBldDirectory(), resolution);
cache.fingerprintDependencies(repositories(), dependencies()); cache.cacheDependenciesHash(repositories(), dependencies());
if (cache.isDependenciesCacheValid(downloadSources(), downloadJavadoc())) { if (cache.isDependenciesCacheValid(downloadSources(), downloadJavadoc())) {
return; return;
} }

View file

@ -61,6 +61,7 @@ public class BldCache {
private String extensionsHash_; private String extensionsHash_;
private Boolean extensionsDownloadSources_; private Boolean extensionsDownloadSources_;
private Boolean extensionsDownloadJavadocs_; private Boolean extensionsDownloadJavadocs_;
private List<File> extensionsLocalArtifacts_;
private String extensionsDependencyTree_; private String extensionsDependencyTree_;
private String dependenciesHash_; private String dependenciesHash_;
private Boolean dependenciesDownloadSources_; private Boolean dependenciesDownloadSources_;
@ -70,6 +71,13 @@ public class BldCache {
private String dependenciesRuntimeDependencyTree_; private String dependenciesRuntimeDependencyTree_;
private String dependenciesTestDependencyTree_; private String dependenciesTestDependencyTree_;
/**
* Creates a new {@code BldCache} instance.
*
* @param bldLibDir the library directory where the bld cache file is stored
* @param resolution the version resolution that should be used when needed during the cache operations
* @since 2.0
*/
public BldCache(File bldLibDir, VersionResolution resolution) { public BldCache(File bldLibDir, VersionResolution resolution) {
bldLibDir_ = bldLibDir; bldLibDir_ = bldLibDir;
resolution_ = resolution; resolution_ = resolution;
@ -78,7 +86,7 @@ public class BldCache {
new File(bldLibDir, BLD_BUILD_HASH).delete(); new File(bldLibDir, BLD_BUILD_HASH).delete();
} }
public void fingerprintExtensions(Collection<String> repositories, Collection<String> extensions) { public void cacheExtensionsHash(Collection<String> repositories, Collection<String> extensions) {
try { try {
var overrides_fp = String.join("\n", resolution_.versionOverrides().entrySet().stream().map(e -> e.getKey() + ":" + e.getValue()).toList()); var overrides_fp = String.join("\n", resolution_.versionOverrides().entrySet().stream().map(e -> e.getKey() + ":" + e.getValue()).toList());
var repositories_fp = String.join("\n", repositories); var repositories_fp = String.join("\n", repositories);
@ -94,84 +102,6 @@ public class BldCache {
} }
} }
public void cacheExtensionsDownloads(boolean downloadSources, boolean downloadJavadoc) {
extensionsDownloadSources_ = downloadSources;
extensionsDownloadJavadocs_ = downloadJavadoc;
}
public void cacheExtensionsDependencyTree(String dependencyTree) {
extensionsDependencyTree_ = dependencyTree;
}
public String getCachedExtensionsDependencyTree() {
return hashProperties().getProperty(PROPERTY_EXTENSIONS_DEPENDENCY_TREE);
}
public void fingerprintDependencies(List<Repository> repositories, DependencyScopes dependencies) {
var finger_print = new StringBuilder();
finger_print.append(String.join("\n", resolution_.versionOverrides().entrySet().stream().map(e -> e.getKey() + ":" + e.getValue()).toList()));
for (var repository : repositories) {
finger_print.append(repository.toString());
finger_print.append('\n');
}
for (var entry : dependencies.entrySet()) {
finger_print.append(entry.getKey());
finger_print.append('\n');
if (entry.getValue() != null) {
for (var dependency : entry.getValue()) {
finger_print.append(dependency.toString());
finger_print.append('\n');
}
}
}
try {
var digest = MessageDigest.getInstance("SHA-1");
digest.update(finger_print.toString().getBytes(StandardCharsets.UTF_8));
dependenciesHash_ = StringUtils.encodeHexLower(digest.digest());
} catch (NoSuchAlgorithmException e) {
// should not happen
throw new RuntimeException(e);
}
}
public void cacheDependenciesDownloads(boolean downloadSources, boolean downloadJavadoc) {
dependenciesDownloadSources_ = downloadSources;
dependenciesDownloadJavadocs_ = downloadJavadoc;
}
public void cacheDependenciesCompileDependencyTree(String compileTree) {
dependenciesCompileDependencyTree_ = compileTree;
}
public String getCachedDependenciesCompileDependencyTree() {
return hashProperties().getProperty(PROPERTY_DEPENDENCIES_COMPILE_DEPENDENCY_TREE);
}
public void cacheDependenciesProvidedDependencyTree(String providedTree) {
dependenciesProvidedDependencyTree_ = providedTree;
}
public String getCachedDependenciesProvidedDependencyTree() {
return hashProperties().getProperty(PROPERTY_DEPENDENCIES_PROVIDED_DEPENDENCY_TREE);
}
public void cacheDependenciesRuntimeDependencyTree(String runtimeTree) {
dependenciesRuntimeDependencyTree_ = runtimeTree;
}
public String getCachedDependenciesRuntimeDependencyTree() {
return hashProperties().getProperty(PROPERTY_DEPENDENCIES_RUNTIME_DEPENDENCY_TREE);
}
public void cacheDependenciesTestDependencyTree(String testTree) {
dependenciesTestDependencyTree_ = testTree;
}
public String getCachedDependenciesTestDependencyTree() {
return hashProperties().getProperty(PROPERTY_DEPENDENCIES_TEST_DEPENDENCY_TREE);
}
public boolean isExtensionHashValid() { public boolean isExtensionHashValid() {
return validateExtensionsHash(extensionsHash_); return validateExtensionsHash(extensionsHash_);
} }
@ -193,24 +123,6 @@ public class BldCache {
return validateExtensionsHash(extensionsHash_); return validateExtensionsHash(extensionsHash_);
} }
private File getCacheFile() {
return new File(bldLibDir_, BLD_CACHE);
}
private Properties hashProperties() {
var properties = new Properties();
if (getCacheFile().exists()) {
try {
try (var reader = new BufferedReader(new FileReader(getCacheFile()))) {
properties.load(reader);
}
} catch (IOException e) {
// no-op, we'll store a new properties file when we're writing the cache
}
}
return properties;
}
private boolean validateExtensionsHash(String hash) { private boolean validateExtensionsHash(String hash) {
var properties = hashProperties(); var properties = hashProperties();
if (properties.isEmpty()) { if (properties.isEmpty()) {
@ -250,6 +162,51 @@ public class BldCache {
return true; return true;
} }
public void cacheExtensionsDownloads(boolean downloadSources, boolean downloadJavadoc) {
extensionsDownloadSources_ = downloadSources;
extensionsDownloadJavadocs_ = downloadJavadoc;
}
public void cacheExtensionsDependencyTree(String dependencyTree) {
extensionsDependencyTree_ = dependencyTree;
}
public String getCachedExtensionsDependencyTree() {
return hashProperties().getProperty(PROPERTY_EXTENSIONS_DEPENDENCY_TREE);
}
public void cacheExtensionsLocalArtifacts(List<File> extensionsLocalArtifacts) {
extensionsLocalArtifacts_ = extensionsLocalArtifacts;
}
public void cacheDependenciesHash(List<Repository> repositories, DependencyScopes dependencies) {
var finger_print = new StringBuilder();
finger_print.append(String.join("\n", resolution_.versionOverrides().entrySet().stream().map(e -> e.getKey() + ":" + e.getValue()).toList()));
for (var repository : repositories) {
finger_print.append(repository.toString());
finger_print.append('\n');
}
for (var entry : dependencies.entrySet()) {
finger_print.append(entry.getKey());
finger_print.append('\n');
if (entry.getValue() != null) {
for (var dependency : entry.getValue()) {
finger_print.append(dependency.toString());
finger_print.append('\n');
}
}
}
try {
var digest = MessageDigest.getInstance("SHA-1");
digest.update(finger_print.toString().getBytes(StandardCharsets.UTF_8));
dependenciesHash_ = StringUtils.encodeHexLower(digest.digest());
} catch (NoSuchAlgorithmException e) {
// should not happen
throw new RuntimeException(e);
}
}
public boolean isDependenciesHashValid() { public boolean isDependenciesHashValid() {
return validateDependenciesHash(dependenciesHash_); return validateDependenciesHash(dependenciesHash_);
} }
@ -280,11 +237,62 @@ public class BldCache {
return hash.equals(properties.getProperty(PROPERTY_DEPENDENCIES_HASH)); return hash.equals(properties.getProperty(PROPERTY_DEPENDENCIES_HASH));
} }
public void writeCache() { public void cacheDependenciesDownloads(boolean downloadSources, boolean downloadJavadoc) {
writeCache(null); dependenciesDownloadSources_ = downloadSources;
dependenciesDownloadJavadocs_ = downloadJavadoc;
} }
public void writeCache(List<File> extensionsLocalArtifacts) { public void cacheDependenciesCompileDependencyTree(String compileTree) {
dependenciesCompileDependencyTree_ = compileTree;
}
public String getCachedDependenciesCompileDependencyTree() {
return hashProperties().getProperty(PROPERTY_DEPENDENCIES_COMPILE_DEPENDENCY_TREE);
}
public void cacheDependenciesProvidedDependencyTree(String providedTree) {
dependenciesProvidedDependencyTree_ = providedTree;
}
public String getCachedDependenciesProvidedDependencyTree() {
return hashProperties().getProperty(PROPERTY_DEPENDENCIES_PROVIDED_DEPENDENCY_TREE);
}
public void cacheDependenciesRuntimeDependencyTree(String runtimeTree) {
dependenciesRuntimeDependencyTree_ = runtimeTree;
}
public String getCachedDependenciesRuntimeDependencyTree() {
return hashProperties().getProperty(PROPERTY_DEPENDENCIES_RUNTIME_DEPENDENCY_TREE);
}
public void cacheDependenciesTestDependencyTree(String testTree) {
dependenciesTestDependencyTree_ = testTree;
}
public String getCachedDependenciesTestDependencyTree() {
return hashProperties().getProperty(PROPERTY_DEPENDENCIES_TEST_DEPENDENCY_TREE);
}
private File getCacheFile() {
return new File(bldLibDir_, BLD_CACHE);
}
private Properties hashProperties() {
var properties = new Properties();
if (getCacheFile().exists()) {
try {
try (var reader = new BufferedReader(new FileReader(getCacheFile()))) {
properties.load(reader);
}
} catch (IOException e) {
// no-op, we'll store a new properties file when we're writing the cache
}
}
return properties;
}
public void writeCache() {
var properties = hashProperties(); var properties = hashProperties();
try { try {
@ -307,9 +315,9 @@ public class BldCache {
properties.put(PROPERTY_EXTENSIONS_DOWNLOAD_JAVADOC, String.valueOf(extensionsDownloadJavadocs_)); properties.put(PROPERTY_EXTENSIONS_DOWNLOAD_JAVADOC, String.valueOf(extensionsDownloadJavadocs_));
} }
if (extensionsLocalArtifacts != null) { if (extensionsLocalArtifacts_ != null) {
var extensions_local = new StringBuilder(); var extensions_local = new StringBuilder();
for (var file : extensionsLocalArtifacts) { for (var file : extensionsLocalArtifacts_) {
if (file.exists() && file.canRead()) { if (file.exists() && file.canRead()) {
if (!extensions_local.isEmpty()) { if (!extensions_local.isEmpty()) {
extensions_local.append("\n"); extensions_local.append("\n");

View file

@ -55,7 +55,7 @@ public class DependencyTreeOperation extends AbstractOperation<DependencyTreeOpe
BldCache extensions_cache = null; BldCache extensions_cache = null;
if (libBldDir_ != null) { if (libBldDir_ != null) {
extensions_cache = new BldCache(libBldDir_, new VersionResolution(extensionProperties())); extensions_cache = new BldCache(libBldDir_, new VersionResolution(extensionProperties()));
extensions_cache.fingerprintExtensions( extensions_cache.cacheExtensionsHash(
extensionRepositories().stream().map(Repository::toString).toList(), extensionRepositories().stream().map(Repository::toString).toList(),
extensionDependencies().scope(compile).stream().map(Dependency::toString).toList()); extensionDependencies().scope(compile).stream().map(Dependency::toString).toList());
if (extensions_cache.isExtensionHashValid()) { if (extensions_cache.isExtensionHashValid()) {
@ -83,7 +83,7 @@ public class DependencyTreeOperation extends AbstractOperation<DependencyTreeOpe
BldCache dependencies_cache = null; BldCache dependencies_cache = null;
if (libBldDir_ != null) { if (libBldDir_ != null) {
dependencies_cache = new BldCache(libBldDir_, new VersionResolution(properties())); dependencies_cache = new BldCache(libBldDir_, new VersionResolution(properties()));
dependencies_cache.fingerprintDependencies(repositories(), dependencies()); dependencies_cache.cacheDependenciesHash(repositories(), dependencies());
if (dependencies_cache.isDependenciesHashValid()) { if (dependencies_cache.isDependenciesHashValid()) {
var cached_compile_tree = dependencies_cache.getCachedDependenciesCompileDependencyTree(); var cached_compile_tree = dependencies_cache.getCachedDependenciesCompileDependencyTree();
if (cached_compile_tree != null) { if (cached_compile_tree != null) {

View file

@ -62,7 +62,7 @@ public class WrapperExtensionResolver {
downloadSources_ = downloadSources; downloadSources_ = downloadSources;
downloadJavadoc_ = downloadJavadoc; downloadJavadoc_ = downloadJavadoc;
cache_.fingerprintExtensions( cache_.cacheExtensionsHash(
repositories_.stream().map(Objects::toString).toList(), repositories_.stream().map(Objects::toString).toList(),
dependencies_.stream().map(Objects::toString).toList()); dependencies_.stream().map(Objects::toString).toList());
} }
@ -81,7 +81,8 @@ public class WrapperExtensionResolver {
purgeExtensionDependencies(filenames); purgeExtensionDependencies(filenames);
cache_.cacheExtensionsDownloads(downloadSources_, downloadJavadoc_); cache_.cacheExtensionsDownloads(downloadSources_, downloadJavadoc_);
cache_.writeCache(localArtifacts_); cache_.cacheExtensionsLocalArtifacts(localArtifacts_);
cache_.writeCache();
if (headerPrinted_) { if (headerPrinted_) {
System.out.println(); System.out.println();