diff --git a/pom.xml b/pom.xml index 2eacf655..ab663b8d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.rarchives.ripme ripme jar - 1.0.14 + 1.0.15 ripme http://rip.rarchives.com diff --git a/src/main/java/com/rarchives/ripme/App.java b/src/main/java/com/rarchives/ripme/App.java index d45f4c55..3a670365 100644 --- a/src/main/java/com/rarchives/ripme/App.java +++ b/src/main/java/com/rarchives/ripme/App.java @@ -28,7 +28,7 @@ public class App { System.setProperty("apple.laf.useScreenMenuBar", "true"); System.setProperty("com.apple.mrj.application.apple.menu.about.name", "RipMe"); logger.info("Initialized ripme v" + UpdateUtils.getThisJarVersion()); - UpdateUtils.moveUpdatedJar(); + if (args.length > 0) { CommandLine cl = handleArguments(args); diff --git a/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java b/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java index 5569106c..fe04a388 100644 --- a/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java +++ b/src/main/java/com/rarchives/ripme/ui/UpdateUtils.java @@ -1,14 +1,14 @@ package com.rarchives.ripme.ui; -import java.awt.Desktop; +import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; +import java.io.FileWriter; import java.io.IOException; import javax.swing.JLabel; import javax.swing.JOptionPane; -import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.json.JSONArray; import org.json.JSONObject; @@ -143,97 +143,58 @@ public class UpdateUtils { out.write(response.bodyAsBytes()); out.close(); logger.info("Download of new version complete; saved to " + updateFileName); + + // Setup updater script + final String batchFile, script; + final String[] batchExec; + String os = System.getProperty("os.name").toLowerCase(); + if (os.contains("win")) { + // Windows + batchFile = "update_ripme.bat"; + String batchPath = new File(batchFile).getAbsolutePath(); + script = "@echo off\r\n" + + "timeout 1" + "\r\n" + + "copy " + updateFileName + " " + mainFileName + "\r\n" + + "del " + updateFileName + "\r\n" + + "ripme.jar" + "\r\n" + + "del " + batchPath + "\r\n"; + batchExec = new String[] { batchPath }; + + } + else { + // Mac / Linux + batchFile = "update_ripme.sh"; + String batchPath = new File(batchFile).getAbsolutePath(); + script = "#!/bin/sh\n" + + "sleep 1" + "\n" + + "cd " + new File(mainFileName).getAbsoluteFile().getParent() + "\n" + + "cp -f " + updateFileName + " " + mainFileName + "\n" + + "rm -f " + updateFileName + "\n" + + "java -jar \"" + new File(mainFileName).getAbsolutePath() + "\" &\n" + + "sleep 1" + "\n" + + "rm -f " + batchPath + "\n"; + batchExec = new String[] { "sh", batchPath }; + } + // Create updater script + BufferedWriter bw = new BufferedWriter(new FileWriter(batchFile)); + bw.write(script); + bw.flush(); + bw.close(); + logger.info("Saved update script to " + batchFile); + // Run updater script on exit Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try { - logger.info("Executing: java -jar " + updateFileName); - Runtime.getRuntime().exec(new String[] {"java", "-jar", updateFileName}); + logger.info("Executing: " + batchFile); + Runtime.getRuntime().exec(batchExec); } catch (IOException e) { e.printStackTrace(); } } }); - logger.info("Exiting older version, should execute updated jar (" + updateFileName + ") during exit"); + logger.info("Exiting older version, should execute update script (" + batchFile + ") during exit"); System.exit(0); } - public static void moveUpdatedJar() { - // Copy the new file (ripme.jar.update) to original location (ripme.jar) - // Delete new file (update) on exit - // Exit - File newFile = new File(updateFileName); // ripme.jar.update - File oldFile = new File(mainFileName); // ripme.jar - if (!newFile.exists()) { - // Can't update without .update file - return; - } - - // Attempt to copy new .jar file over old jar file. - int retries = 3; - while (true) { - retries--; - try { - logger.info("Updated .jar file '" + newFile + "' exists, overwriting older version at " + oldFile + " ..."); - FileUtils.copyFile(newFile, oldFile); - break; // Copy was successful; break. - } - catch (IOException e) { - logger.error("Failed to copy the updated jar over the original jar.\nUpdated Jar:\t" + newFile + "\nOriginal Jar: " + oldFile); - if (retries < 0) { - // We failed! - // Show error messages, pop up message dialog, and open the directory containing jars - logger.error("Cannot ovewrite existing jar file " + oldFile + " with updated file " + newFile + " ... Please update by moving files manually"); - try { - Desktop.getDesktop().open(newFile.getParentFile()); - } catch (IOException ioe) { - logger.error("Error while opening directory " + newFile.getParentFile(), ioe); - } - JOptionPane.showMessageDialog(null, - "Failed to copy the updated .jar file over the original .jar file\nUpdated Jar:\t" + newFile + "\nOriginal Jar: " + oldFile + "\n\nPlease update by moving files manually", - "RipMe Updater Error", - JOptionPane.ERROR_MESSAGE); - System.exit(1); - return; - } - e.printStackTrace(); - try { - logger.warn("Waiting 1 second, copy retries remaining: " + retries); - Thread.sleep(1000); - } catch (InterruptedException ie) { - logger.error("Interrupted while waiting for original jar " + oldFile + " to be overwritten", ie); - return; - } - } - } - - // Delete the updated .jar on exit - if (newFile.exists()) { - logger.info("Will delete '" + newFile + "' on exit"); - try { - FileUtils.forceDeleteOnExit(newFile); - } - catch (Exception e) { - logger.error("Failed to schedule delete on file: " + newFile); - return; - } - } - - // Execute the copied, updated .jar at ripme.jar - try { - String[] command = new String[] { - "java", - "-jar", - oldFile.getName() }; - logger.info("Executing: " + command[0] + " " + command[1] + " " + command[2]); - Runtime.getRuntime().exec(command); - logger.info("Started new version at " + oldFile.getName() + ", quitting current program..."); - System.exit(0); - } - catch (IOException e) { - logger.error("Error while executing new jar '" + oldFile.getName() + "'", e); - return; - } - } - }