From 7a51ae6944b78e12d553c6a577369b9a419d622e Mon Sep 17 00:00:00 2001 From: bmalinowsky Date: Sat, 27 Jul 2024 13:33:18 +0200 Subject: [PATCH] Put build info into manifest --- build.gradle | 13 ++++- src/io/calimero/Settings.java | 11 ++-- src/io/calimero/internal/Manifest.java | 72 ++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 src/io/calimero/internal/Manifest.java diff --git a/build.gradle b/build.gradle index 7e483ab0..3f04d224 100644 --- a/build.gradle +++ b/build.gradle @@ -80,9 +80,20 @@ tasks.withType(Javadoc).configureEach { options.addStringOption("Xdoclint:-missing", '-quiet') } + +def gitHash = 'git rev-parse --verify --short HEAD'.execute().text.trim() +def buildDate = java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z") + .withZone(ZoneId.of("UTC")) + .format(Instant.now()) + jar { manifest { - attributes 'Main-Class': application.mainClass + attributes( + 'Main-Class': application.mainClass, + 'Implementation-Version': project.version, + 'Revision': "${gitHash}", + 'Build-Date': "${buildDate}" + ) } } diff --git a/src/io/calimero/Settings.java b/src/io/calimero/Settings.java index a2b32df9..90f6516c 100644 --- a/src/io/calimero/Settings.java +++ b/src/io/calimero/Settings.java @@ -1,6 +1,6 @@ /* Calimero 2 - A library for KNX network access - Copyright (c) 2006, 2023 B. Malinowsky + Copyright (c) 2006, 2024 B. Malinowsky This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -36,6 +36,8 @@ package io.calimero; +import io.calimero.internal.Manifest; + /** * General settings used in Calimero as well as library user information. * @@ -49,7 +51,7 @@ public final class Settings private static final String tuwien = "Vienna University of Technology"; private static final String group = "Automation Systems Group"; - private static final String copyright = "Copyright © 2006-2023"; + private static final String copyright = "Copyright © 2006-2024"; // just use newline, it's easier to deal with private static final String sep = "\n"; @@ -67,6 +69,7 @@ private Settings() {} */ public static String getLibraryVersion() { + // don't use Manifest version here, it's the fallback value return version; } @@ -85,8 +88,8 @@ public static String getLibraryVersion() public static String getLibraryHeader(final boolean verbose) { if (!verbose) - return library + " " + version; - return library + " version " + version + " - " + desc + sep + return library + " " + Manifest.buildInfo(Settings.class); + return library + " " + Manifest.buildInfo(Settings.class) + " - " + desc + sep + group + ", " + tuwien + sep + copyright; } diff --git a/src/io/calimero/internal/Manifest.java b/src/io/calimero/internal/Manifest.java new file mode 100644 index 00000000..df6100e4 --- /dev/null +++ b/src/io/calimero/internal/Manifest.java @@ -0,0 +1,72 @@ +/* + Calimero 2 - A library for KNX network access + Copyright (c) 2024, 2024 B. Malinowsky + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under terms + of your choice, provided that you also meet, for each linked independent + module, the terms and conditions of the license of that module. An + independent module is a module which is not derived from or based on + this library. If you modify this library, you may extend this exception + to your version of the library, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from your + version. +*/ + +package io.calimero.internal; + +import java.io.IOException; +import java.util.Optional; +import java.util.jar.Attributes.Name; + +import io.calimero.Settings; + +public final class Manifest { + + public record BuildInfo(String version, Optional revision, Optional buildDate) { + @Override + public String toString() { + return version + revision.map(r -> " (" + r + ")").orElse(""); + } + } + + private Manifest() {} + + public static BuildInfo buildInfo(final Class lookup) { + String version = Settings.getLibraryVersion(); + String revision = null; + String buildDate = null; + try (final var metaInf = lookup.getResourceAsStream("/META-INF/MANIFEST.MF")) { + if (metaInf != null) { + final var manifest = new java.util.jar.Manifest(metaInf); + final var attributes = manifest.getMainAttributes(); + version = attributes.getValue(Name.IMPLEMENTATION_VERSION); + revision = attributes.getValue("Revision"); + buildDate = attributes.getValue("Build-Date"); + } + } + catch (IOException | RuntimeException ignore) {} + return new BuildInfo(version, Optional.ofNullable(revision), Optional.ofNullable(buildDate)); + } +}