From d904fd22b71408ea52cf14f9b341519156aeb655 Mon Sep 17 00:00:00 2001 From: Geert Bevin Date: Wed, 17 Jul 2024 20:59:38 -0400 Subject: [PATCH] Better error reporting when internet is not accessible, added support for offline mode that will not access the internet for any reason. --- lib/bld/bld-wrapper.jar | Bin 29686 -> 29818 bytes src/main/java/rife/bld/BaseProject.java | 24 +++- src/main/java/rife/bld/BuildExecutor.java | 20 ++- src/main/java/rife/bld/Project.java | 7 +- .../rife/bld/operations/HelpOperation.java | 1 + src/main/java/rife/bld/wrapper/Wrapper.java | 119 ++++++++++-------- 6 files changed, 112 insertions(+), 59 deletions(-) diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar index a9a8defa2b82b1428d775b3ba27f0b10fb248b4c..4b55ca26170e8125425bfb6b6e99cf35887dc2e4 100644 GIT binary patch delta 15210 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 Se{h(8)#cx;*Z*J;kpBf)ev(Q6 delta 15025 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 O64YIYpluxg%l#i&4TnAe diff --git a/src/main/java/rife/bld/BaseProject.java b/src/main/java/rife/bld/BaseProject.java index 98f23c3..fb495e3 100644 --- a/src/main/java/rife/bld/BaseProject.java +++ b/src/main/java/rife/bld/BaseProject.java @@ -485,7 +485,12 @@ public class BaseProject extends BuildExecutor { @BuildCommand(value = "dependency-tree", help = DependencyTreeHelp.class) public void dependencyTree() throws Exception { - dependencyTreeOperation().executeOnce(() -> dependencyTreeOperation().fromProject(this)); + if (isOffline()) { + System.out.println("Offline mode: dependency-tree is disabled"); + } + else { + dependencyTreeOperation().executeOnce(() -> dependencyTreeOperation().fromProject(this)); + } } /** @@ -496,7 +501,12 @@ public class BaseProject extends BuildExecutor { @BuildCommand(help = DownloadHelp.class) public void download() throws Exception { - downloadOperation().executeOnce(() -> downloadOperation().fromProject(this)); + if (isOffline()) { + System.out.println("Offline mode: download is disabled"); + } + else { + downloadOperation().executeOnce(() -> downloadOperation().fromProject(this)); + } } /** @@ -507,7 +517,12 @@ public class BaseProject extends BuildExecutor { @BuildCommand(help = PurgeHelp.class) public void purge() throws Exception { - purgeOperation().executeOnce(() -> purgeOperation().fromProject(this)); + if (isOffline()) { + System.out.println("Offline mode: purge is disabled"); + } + else { + purgeOperation().executeOnce(() -> purgeOperation().fromProject(this)); + } } /** @@ -1674,7 +1689,8 @@ public class BaseProject extends BuildExecutor { @Override public int execute(String[] arguments) { - if (autoDownloadPurge()) { + if (!isOffline() && + autoDownloadPurge()) { performAutoDownloadPurge(); } diff --git a/src/main/java/rife/bld/BuildExecutor.java b/src/main/java/rife/bld/BuildExecutor.java index 17eceb6..9e402b5 100644 --- a/src/main/java/rife/bld/BuildExecutor.java +++ b/src/main/java/rife/bld/BuildExecutor.java @@ -34,6 +34,7 @@ public class BuildExecutor { public static final String BLD_PROPERTIES = "bld.properties"; public static final String LOCAL_PROPERTIES = "local.properties"; + private static final String ARG_OFFLINE = "--offline"; private static final String ARG_HELP1 = "--help"; private static final String ARG_HELP2 = "-h"; private static final String ARG_HELP3 = "-?"; @@ -42,6 +43,7 @@ public class BuildExecutor { private final HierarchicalProperties properties_; private List arguments_ = Collections.emptyList(); + private boolean offline_ = false; private Map buildCommands_ = null; private Map buildAliases_ = null; private final AtomicReference currentCommandName_ = new AtomicReference<>(); @@ -126,7 +128,18 @@ public class BuildExecutor { } /** - * Returns the properties uses by this conversation. + * Returns whether the bld execution is intended to be offline. + * + * @return {@code true} if the execution is intended to be offline; + * or {@code false} otherwise + * @since 2.0 + */ + public boolean isOffline() { + return offline_; + } + + /** + * Returns the properties uses for bld execution. * * @return the instance of {@code HierarchicalProperties} that is used * by this build executor @@ -275,6 +288,11 @@ public class BuildExecutor { * @since 1.5.1 */ public void start(String[] arguments) { + if (arguments.length > 0 && arguments[0].equals(ARG_OFFLINE)) { + offline_ = true; + arguments = Arrays.copyOfRange(arguments, 1, arguments.length); + } + System.exit(execute(arguments)); } diff --git a/src/main/java/rife/bld/Project.java b/src/main/java/rife/bld/Project.java index 5fdd0e7..f664a38 100644 --- a/src/main/java/rife/bld/Project.java +++ b/src/main/java/rife/bld/Project.java @@ -191,7 +191,12 @@ public class Project extends BaseProject { jar(); jarSources(); jarJavadoc(); - publishOperation().executeOnce(() -> publishOperation().fromProject(this)); + if (isOffline()) { + System.out.println("Offline mode: publish is disabled"); + } + else { + publishOperation().executeOnce(() -> publishOperation().fromProject(this)); + } } /** diff --git a/src/main/java/rife/bld/operations/HelpOperation.java b/src/main/java/rife/bld/operations/HelpOperation.java index cd0d642..a00bcb8 100644 --- a/src/main/java/rife/bld/operations/HelpOperation.java +++ b/src/main/java/rife/bld/operations/HelpOperation.java @@ -155,6 +155,7 @@ public class HelpOperation { System.err.println(""" + --offline Work without internet (only as first argument) --json Output help in JSON format -?, -h, --help Shows this help message -D= Set a JVM system property diff --git a/src/main/java/rife/bld/wrapper/Wrapper.java b/src/main/java/rife/bld/wrapper/Wrapper.java index 90850cd..bda2868 100644 --- a/src/main/java/rife/bld/wrapper/Wrapper.java +++ b/src/main/java/rife/bld/wrapper/Wrapper.java @@ -41,6 +41,7 @@ public class Wrapper { public static final String BUILD_ARGUMENT = "--build"; public static final String JSON_ARGUMENT = "--json"; + public static final String OFFLINE_ARGUMENT = "--offline"; public static final String HELP_COMMAND = "help"; static final String MAVEN_CENTRAL = "https://repo1.maven.org/maven2/"; @@ -79,6 +80,7 @@ public class Wrapper { private File currentDir_ = new File(System.getProperty("user.dir")); private LaunchMode launchMode_ = LaunchMode.Cli; + private boolean offline_ = false; private final Properties jvmProperties_ = new Properties(); private final Properties wrapperProperties_ = new Properties(); @@ -389,6 +391,15 @@ public class Wrapper { arguments.remove(0); } + // first argument after the --build argument is the main build file + // arguments.get(0) + + // check if the next argument enables offline mode + if (arguments.size() >= 2 && + OFFLINE_ARGUMENT.equals(arguments.get(1))) { + offline_ = true; + } + var help_index = arguments.indexOf(HELP_COMMAND); if (help_index != -1) { try { @@ -405,12 +416,7 @@ public class Wrapper { try { extractJvmProperties(arguments); initWrapperProperties(getVersion()); - File distribution; - try { - distribution = installDistribution(); - } catch (IOException e) { - return -1; - } + var distribution = installDistribution(); return launchMain(distribution, arguments); } catch (Exception e) { throw new RuntimeException(e); @@ -513,25 +519,29 @@ public class Wrapper { var download_version = version; var is_snapshot = isSnapshot(version); var is_local = false; - if (is_snapshot) { - var meta_data = ""; - try { - meta_data = readString(version, new URL(downloadUrl(version, "maven-metadata.xml"))); - } - catch (IOException e) { + if (offline_) { + System.out.println("Offline mode: no artifacts will be checked nor downloaded"); + System.out.flush(); + } + else { + if (is_snapshot) { + var meta_data = ""; try { - meta_data = readString(version, new URL(downloadUrl(version, "maven-metadata-local.xml"))); + meta_data = readString(version, new URL(downloadUrl(version, "maven-metadata.xml"))); + } catch (IOException e) { + try { + meta_data = readString(version, new URL(downloadUrl(version, "maven-metadata-local.xml"))); + } catch (IOException e2) { + throw e; + } } - catch (IOException e2) { - throw e; - } - } - var local_matcher = META_DATA_LOCAL_COPY.matcher(meta_data); - is_local = local_matcher.find(); - if (!is_local) { - var version_matcher = META_DATA_SNAPSHOT_VERSION.matcher(meta_data); - if (version_matcher.find()) { - download_version = version_matcher.group(1); + var local_matcher = META_DATA_LOCAL_COPY.matcher(meta_data); + is_local = local_matcher.find(); + if (!is_local) { + var version_matcher = META_DATA_SNAPSHOT_VERSION.matcher(meta_data); + if (version_matcher.find()) { + download_version = version_matcher.group(1); + } } } } @@ -539,40 +549,42 @@ public class Wrapper { var distribution_file = new File(DISTRIBUTIONS_DIR, bldFileName(version)); var distribution_sources_file = new File(DISTRIBUTIONS_DIR, bldSourcesFileName(version)); - // if this is a snapshot and the distribution file exists, - // ensure that it's the latest by comparing hashes - if (is_snapshot && distribution_file.exists()) { - boolean delete_distribution_files = is_local; - if (!delete_distribution_files) { - var download_md5 = readString(version, new URL(downloadUrl(version, bldFileName(download_version)) + ".md5")); - try { - var digest = MessageDigest.getInstance("MD5"); - digest.update(FileUtils.readBytes(distribution_file)); - if (!download_md5.equals(encodeHexLower(digest.digest()))) { - delete_distribution_files = true; + if (!offline_) { + // if this is a snapshot and the distribution file exists, + // ensure that it's the latest by comparing hashes + if (is_snapshot && distribution_file.exists()) { + boolean delete_distribution_files = is_local; + if (!delete_distribution_files) { + var download_md5 = readString(version, new URL(downloadUrl(version, bldFileName(download_version)) + ".md5")); + try { + var digest = MessageDigest.getInstance("MD5"); + digest.update(FileUtils.readBytes(distribution_file)); + if (!download_md5.equals(encodeHexLower(digest.digest()))) { + delete_distribution_files = true; + } + } catch (NoSuchAlgorithmException ignore) { } - } catch (NoSuchAlgorithmException ignore) { } + + if (delete_distribution_files) { + distribution_file.delete(); + if (distribution_sources_file.exists()) { + distribution_sources_file.delete(); + } + } + } - if (delete_distribution_files) { - distribution_file.delete(); - if (distribution_sources_file.exists()) { - distribution_sources_file.delete(); - } + // download distribution jars if necessary + if (!distribution_file.exists()) { + downloadDistribution(distribution_file, downloadUrl(version, bldFileName(download_version))); } - - } - - // download distribution jars if necessary - if (!distribution_file.exists()) { - downloadDistribution(distribution_file, downloadUrl(version, bldFileName(download_version))); - } - if (!distribution_sources_file.exists()) { - try { - downloadDistribution(distribution_sources_file, downloadUrl(version, bldSourcesFileName(download_version))); - } catch (IOException e) { - // this is not critical, ignore + if (!distribution_sources_file.exists()) { + try { + downloadDistribution(distribution_sources_file, downloadUrl(version, bldSourcesFileName(download_version))); + } catch (IOException e) { + // this is not critical, ignore + } } } @@ -618,7 +630,8 @@ public class Wrapper { private void resolveExtensions() { if (null == classloader_ || - null == wrapperPropertiesFile_) { + null == wrapperPropertiesFile_ || + offline_) { return; }