diff options
author | Kaloyan Raev <kaloyan.r@zend.com> | 2013-10-09 22:40:48 +0300 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2013-10-12 22:45:27 +0200 |
commit | 46c839abd5a76ec2ab732c592ad17726d14ffaec (patch) | |
tree | 2f8ef09542086ee460c35d10353918dbfaaa97b4 /org.eclipse.jgit.pgm/src | |
parent | f3d323e9fededbef0acbd9e316119419b8883516 (diff) | |
download | jgit-46c839abd5a76ec2ab732c592ad17726d14ffaec.tar.gz jgit-46c839abd5a76ec2ab732c592ad17726d14ffaec.zip |
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 <kaloyan.r@zend.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.jgit.pgm/src')
-rw-r--r-- | org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Version.java | 51 |
1 files 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 2dce535d9f..6bed9c6025 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; + } } |