diff --git a/core/src/main/java/com/threerings/getdown/data/Resource.java b/core/src/main/java/com/threerings/getdown/data/Resource.java index 6d222e74..a7601caa 100644 --- a/core/src/main/java/com/threerings/getdown/data/Resource.java +++ b/core/src/main/java/com/threerings/getdown/data/Resource.java @@ -254,20 +254,21 @@ public void clearMarker () /** * 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(); log.info("- " + source); if (!FileUtil.renameTo(source, dest)) { throw new IOException("Failed to rename " + source + " to " + dest); } - applyAttrs(); + applyAttrs(cleanExistingDirs); markAsValid(); } + /** * Unpacks this resource file into the directory that contains it. */ - public void unpack () throws IOException + public void unpack (boolean cleanExistingDirs) throws IOException { // sanity check if (!_isJar && !_isPacked200Jar) { @@ -275,26 +276,35 @@ public void unpack () throws IOException } if (_isJar) { try (JarFile jar = new JarFile(_local)) { - FileUtil.unpackJar(jar, _unpacked); + FileUtil.unpackJar(jar, _unpacked, cleanExistingDirs); } } else { FileUtil.unpackPacked200Jar(_local, _unpacked); } } + + public void unpack () throws IOException + { + unpack(false); + } /** * Applies this resources special attributes: unpacks this resource if needed, marks it as * executable if needed. */ - public void applyAttrs () throws IOException { + public void applyAttrs (boolean cleanExistingDirs) throws IOException { if (shouldUnpack()) { - unpack(); + unpack(cleanExistingDirs); } if (_attrs.contains(Attr.EXEC)) { 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 * it. diff --git a/core/src/main/java/com/threerings/getdown/util/FileUtil.java b/core/src/main/java/com/threerings/getdown/util/FileUtil.java index d381bf35..0008a4fa 100644 --- a/core/src/main/java/com/threerings/getdown/util/FileUtil.java +++ b/core/src/main/java/com/threerings/getdown/util/FileUtil.java @@ -94,9 +94,25 @@ public static List readLines (Reader in) /** * 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(); + 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()) { JarEntry entry = (JarEntry)entries.nextElement(); File efile = new File(target, entry.getName()); diff --git a/launcher/src/main/java/com/threerings/getdown/launcher/Getdown.java b/launcher/src/main/java/com/threerings/getdown/launcher/Getdown.java index 17368b1f..a970c010 100644 --- a/launcher/src/main/java/com/threerings/getdown/launcher/Getdown.java +++ b/launcher/src/main/java/com/threerings/getdown/launcher/Getdown.java @@ -116,7 +116,7 @@ public void install () throws IOException } else if (_readyToInstall) { log.info("Installing " + _toInstallResources.size() + " downloaded resources:"); for (Resource resource : _toInstallResources) { - resource.install(); + resource.install(false); } _toInstallResources.clear(); _readyToInstall = false; @@ -589,7 +589,7 @@ protected void updateJava () reportTrackingEvent("jvm_unpack", -1); updateStatus("m.unpacking_java"); - vmjar.install(); + vmjar.install(true); // these only run on non-Windows platforms, so we use Unix file separators String localJavaDir = LaunchUtil.LOCAL_JAVA_DIR + "/";