diff options
-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; + } } |