diff --git a/arduino-core/src/cc/arduino/utils/ArchiveExtractor.java b/arduino-core/src/cc/arduino/utils/ArchiveExtractor.java index bfb65516c..036a3daf4 100644 --- a/arduino-core/src/cc/arduino/utils/ArchiveExtractor.java +++ b/arduino-core/src/cc/arduino/utils/ArchiveExtractor.java @@ -69,6 +69,11 @@ public class ArchiveExtractor { * @throws IOException */ public static void extract(File archiveFile, File destFolder, int stripPath) throws IOException { + extract(archiveFile, destFolder, stripPath, false); + } + + + public static void extract(File archiveFile, File destFolder, int stripPath, boolean overwrite) throws IOException { // Folders timestamps must be set at the end of archive extraction // (because creating a file in a folder alters the folder's timestamp) @@ -193,14 +198,14 @@ public class ArchiveExtractor { // Safety check if (isDirectory) { - if (outputFile.isFile()) { + if (outputFile.isFile() && !overwrite) { throw new IOException("Can't create folder " + outputFile + ", a file with the same name exists!"); } } else { // - isLink // - isSymLink // - anything else - if (outputFile.exists()) { + if (outputFile.exists() && !overwrite) { throw new IOException("Can't extract file " + outputFile + ", file already exists!"); } } @@ -233,6 +238,9 @@ public class ArchiveExtractor { } for (Map.Entry entry : hardLinks.entrySet()) { + if (entry.getKey().exists() && overwrite) { + entry.getKey().delete(); + } FileNativeUtils.link(entry.getValue(), entry.getKey()); Integer mode = hardLinksMode.get(entry.getKey()); if (mode != null) { @@ -241,6 +249,9 @@ public class ArchiveExtractor { } for (Map.Entry entry : symLinks.entrySet()) { + if (entry.getKey().exists() && overwrite) { + entry.getKey().delete(); + } FileNativeUtils.symlink(entry.getValue(), entry.getKey()); entry.getKey().setLastModified(symLinksModifiedTimes.get(entry.getKey())); } diff --git a/arduino-core/src/processing/app/BaseNoGui.java b/arduino-core/src/processing/app/BaseNoGui.java index b35098e4d..15fa90132 100644 --- a/arduino-core/src/processing/app/BaseNoGui.java +++ b/arduino-core/src/processing/app/BaseNoGui.java @@ -578,11 +578,12 @@ public class BaseNoGui { static public void initPackages() throws Exception { indexer = new ContributionsIndexer(BaseNoGui.getSettingsFolder()); File indexFile = indexer.getIndexFile(); - if (!indexFile.isFile()) { + File avrCoreFolder = FileUtils.newFile(indexFile.getParentFile(), "packages", "arduino", "hardware", "avr"); + if (!indexFile.isFile() || !(avrCoreFolder.exists() && avrCoreFolder.isDirectory())) { File distFile = findDefaultPackageFile(); if (distFile != null) { - ArchiveExtractor.extract(distFile, BaseNoGui.getSettingsFolder(), 0); - } else { + ArchiveExtractor.extract(distFile, BaseNoGui.getSettingsFolder(), 0, true); + } else if (!indexFile.isFile()) { // Otherwise create an empty packages index FileOutputStream out = null; try { diff --git a/arduino-core/src/processing/app/helpers/FileUtils.java b/arduino-core/src/processing/app/helpers/FileUtils.java index e4a8fdbdb..92b069195 100644 --- a/arduino-core/src/processing/app/helpers/FileUtils.java +++ b/arduino-core/src/processing/app/helpers/FileUtils.java @@ -73,11 +73,13 @@ public class FileUtils { } public static void recursiveDelete(File file) { - if (file == null) + if (file == null) { return; + } if (file.isDirectory()) { - for (File current : file.listFiles()) + for (File current : file.listFiles()) { recursiveDelete(current); + } } file.delete(); } @@ -254,5 +256,14 @@ public class FileUtils { return result; } + public static File newFile(File parent, String... parts) { + File result = parent; + for (String part : parts) { + result = new File(result, part); + } + + return result; + } + }