From 46c839abd5a76ec2ab732c592ad17726d14ffaec Mon Sep 17 00:00:00 2001 From: Kaloyan Raev Date: Wed, 9 Oct 2013 22:40:48 +0300 Subject: [PATCH] CLI version command falls back to Bundle-Version If the version command cannot read the Implementation-Version of the containing JAR fall back to read the Bundle-Version header in MANIFEST.MF. This makes the command working also from the org.eclipse.jgit.pgm bundle and during development in a host IDE. Bug: 419087 Change-Id: I4269d1cbd9bf9fd8be6fb4463aecc1c434aa387b Signed-off-by: Kaloyan Raev Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/pgm/Version.java | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Version.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Version.java index 2dce535d9..6bed9c602 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Version.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Version.java @@ -43,7 +43,13 @@ package org.eclipse.jgit.pgm; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLClassLoader; import java.text.MessageFormat; +import java.util.jar.JarFile; +import java.util.jar.Manifest; import org.eclipse.jgit.pgm.internal.CLIText; @@ -51,15 +57,54 @@ import org.eclipse.jgit.pgm.internal.CLIText; class Version extends TextBuiltin { @Override protected void run() throws Exception { - final Package pkg = getClass().getPackage(); - if (pkg == null || pkg.getImplementationVersion() == null) + // read the Implementation-Version from Manifest + String version = getImplementationVersion(); + + // if Implementation-Version is not available then try reading + // Bundle-Version + if (version == null) + version = getBundleVersion(); + + // if both Implementation-Version and Bundle-Version are not available + // then throw an exception + if (version == null) throw die(CLIText.get().cannotReadPackageInformation); - outw.println(MessageFormat.format(CLIText.get().jgitVersion, pkg.getImplementationVersion())); + outw.println(MessageFormat.format(CLIText.get().jgitVersion, version)); } @Override protected final boolean requiresRepository() { return false; } + + private String getImplementationVersion() { + Package pkg = getClass().getPackage(); + return (pkg == null) ? null : pkg.getImplementationVersion(); + } + + private String getBundleVersion() { + ClassLoader cl = getClass().getClassLoader(); + if (cl instanceof URLClassLoader) { + URL url = ((URLClassLoader) cl).findResource(JarFile.MANIFEST_NAME); + if (url != null) + return getBundleVersion(url); + } + return null; + } + + private static String getBundleVersion(URL url) { + try { + InputStream is = url.openStream(); + try { + Manifest manifest = new Manifest(is); + return manifest.getMainAttributes().getValue("Bundle-Version"); //$NON-NLS-1$ + } finally { + is.close(); + } + } catch (IOException e) { + // do nothing - will return null + } + return null; + } }