Merge pull request #170 from pb00068/unPackFix

Fix for #112, installing a newer JVM leaves parts of the old JVM
This commit is contained in:
Michael Bayne
2018-11-30 11:20:27 -08:00
committed by GitHub
3 changed files with 35 additions and 9 deletions
@@ -254,20 +254,21 @@ public class Resource implements Comparable<Resource>
/** /**
* Installs the {@code getLocalNew} version of this resource to {@code getLocal}. * Installs the {@code getLocalNew} version of this resource to {@code getLocal}.
*/ */
public void install () throws IOException { public void install (boolean cleanExistingDirs) throws IOException {
File source = getLocalNew(), dest = getLocal(); File source = getLocalNew(), dest = getLocal();
log.info("- " + source); log.info("- " + source);
if (!FileUtil.renameTo(source, dest)) { if (!FileUtil.renameTo(source, dest)) {
throw new IOException("Failed to rename " + source + " to " + dest); throw new IOException("Failed to rename " + source + " to " + dest);
} }
applyAttrs(); applyAttrs(cleanExistingDirs);
markAsValid(); markAsValid();
} }
/** /**
* Unpacks this resource file into the directory that contains it. * Unpacks this resource file into the directory that contains it.
*/ */
public void unpack () throws IOException public void unpack (boolean cleanExistingDirs) throws IOException
{ {
// sanity check // sanity check
if (!_isJar && !_isPacked200Jar) { if (!_isJar && !_isPacked200Jar) {
@@ -275,26 +276,35 @@ public class Resource implements Comparable<Resource>
} }
if (_isJar) { if (_isJar) {
try (JarFile jar = new JarFile(_local)) { try (JarFile jar = new JarFile(_local)) {
FileUtil.unpackJar(jar, _unpacked); FileUtil.unpackJar(jar, _unpacked, cleanExistingDirs);
} }
} else { } else {
FileUtil.unpackPacked200Jar(_local, _unpacked); FileUtil.unpackPacked200Jar(_local, _unpacked);
} }
} }
public void unpack () throws IOException
{
unpack(false);
}
/** /**
* Applies this resources special attributes: unpacks this resource if needed, marks it as * Applies this resources special attributes: unpacks this resource if needed, marks it as
* executable if needed. * executable if needed.
*/ */
public void applyAttrs () throws IOException { public void applyAttrs (boolean cleanExistingDirs) throws IOException {
if (shouldUnpack()) { if (shouldUnpack()) {
unpack(); unpack(cleanExistingDirs);
} }
if (_attrs.contains(Attr.EXEC)) { if (_attrs.contains(Attr.EXEC)) {
FileUtil.makeExecutable(_local); FileUtil.makeExecutable(_local);
} }
} }
public void applyAttrs () throws IOException {
applyAttrs(false);
}
/** /**
* Wipes this resource file along with any "validated" marker file that may be associated with * Wipes this resource file along with any "validated" marker file that may be associated with
* it. * it.
@@ -94,9 +94,25 @@ public class FileUtil
/** /**
* Unpacks the specified jar file into the specified target directory. * Unpacks the specified jar file into the specified target directory.
*/ */
public static void unpackJar (JarFile jar, File target) throws IOException public static void unpackJar (JarFile jar, File target, boolean cleanExistingDirs) throws IOException
{ {
Enumeration<?> entries = jar.entries(); Enumeration<?> entries = jar.entries();
if (cleanExistingDirs)
{
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry) entries.nextElement();
if (entry.isDirectory()) {
File efile = new File(target, entry.getName());
if (efile.exists()) {
for (File f : efile.listFiles()) {
if (!f.isDirectory())
f.delete();
}
}
}
}
}
entries = jar.entries();
while (entries.hasMoreElements()) { while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry)entries.nextElement(); JarEntry entry = (JarEntry)entries.nextElement();
File efile = new File(target, entry.getName()); File efile = new File(target, entry.getName());
@@ -116,7 +116,7 @@ public abstract class Getdown extends Thread
} else if (_readyToInstall) { } else if (_readyToInstall) {
log.info("Installing " + _toInstallResources.size() + " downloaded resources:"); log.info("Installing " + _toInstallResources.size() + " downloaded resources:");
for (Resource resource : _toInstallResources) { for (Resource resource : _toInstallResources) {
resource.install(); resource.install(false);
} }
_toInstallResources.clear(); _toInstallResources.clear();
_readyToInstall = false; _readyToInstall = false;
@@ -589,7 +589,7 @@ public abstract class Getdown extends Thread
reportTrackingEvent("jvm_unpack", -1); reportTrackingEvent("jvm_unpack", -1);
updateStatus("m.unpacking_java"); updateStatus("m.unpacking_java");
vmjar.install(); vmjar.install(true);
// these only run on non-Windows platforms, so we use Unix file separators // these only run on non-Windows platforms, so we use Unix file separators
String localJavaDir = LaunchUtil.LOCAL_JAVA_DIR + "/"; String localJavaDir = LaunchUtil.LOCAL_JAVA_DIR + "/";