]> source.dussan.org Git - jgit.git/commitdiff
CLI version command falls back to Bundle-Version 37/17237/4
authorKaloyan Raev <kaloyan.r@zend.com>
Wed, 9 Oct 2013 19:40:48 +0000 (22:40 +0300)
committerMatthias Sohn <matthias.sohn@sap.com>
Sat, 12 Oct 2013 20:45:27 +0000 (22:45 +0200)
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>
org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Version.java

index 2dce535d9ffbaa84fbe377d1167cfa5cae33dc30..6bed9c602525d3182398e6ef298e629ba93b4778 100644 (file)
 
 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;
+       }
 }