Skip to content

Delete temporary files on exit #2980

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 15, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion app/src/processing/app/Base.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import cc.arduino.contributions.packages.ContributionsIndexer;
import cc.arduino.contributions.DownloadableContributionVersionComparator;
import cc.arduino.contributions.packages.ui.ContributionManagerUI;
import cc.arduino.files.DeleteFilesOnShutdown;
import cc.arduino.packages.DiscoveryManager;
import cc.arduino.utils.Progress;
import cc.arduino.view.SplashScreenHelper;
Expand Down Expand Up @@ -127,6 +128,8 @@ static public void main(String args[]) throws Exception {
}

static public void guardedMain(String args[]) throws Exception {
Runtime.getRuntime().addShutdownHook(new Thread(DeleteFilesOnShutdown.INSTANCE));

BaseNoGui.initLogger();

BaseNoGui.notifier = new GUIUserNotifier();
Expand Down Expand Up @@ -202,7 +205,7 @@ static public void guardedMain(String args[]) throws Exception {

// Create a location for untitled sketches
untitledFolder = createTempFolder("untitled");
untitledFolder.deleteOnExit();
DeleteFilesOnShutdown.add(untitledFolder);

new Base(args);
}
Expand Down Expand Up @@ -401,6 +404,7 @@ protected void onProgress(Progress progress) {
// Set verbosity for command line build
Preferences.set("build.verbose", "" + parser.isDoVerboseBuild());
Preferences.set("upload.verbose", "" + parser.isDoVerboseUpload());
Preferences.set("runtime.preserve.temp.files", Boolean.toString(parser.isPreserveTempFiles()));

// Make sure these verbosity preferences are only for the
// current session
Expand Down
8 changes: 5 additions & 3 deletions app/src/processing/app/EditorConsoleStream.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package processing.app;

import cc.arduino.files.DeleteFilesOnShutdown;

import static processing.app.I18n._;

import java.io.File;
Expand Down Expand Up @@ -33,19 +35,19 @@ public static void init() {
// The files and folders are not deleted on exit because they may be
// needed for debugging or bug reporting.
tempFolder = Base.createTempFolder("console");
tempFolder.deleteOnExit();
DeleteFilesOnShutdown.add(tempFolder);
try {
String outFileName = Preferences.get("console.output.file");
if (outFileName != null) {
outFile = new File(tempFolder, outFileName);
outFile.deleteOnExit();
DeleteFilesOnShutdown.add(outFile);
stdoutFile = new FileOutputStream(outFile);
}

String errFileName = Preferences.get("console.error.file");
if (errFileName != null) {
errFile = new File(tempFolder, errFileName);
errFile.deleteOnExit();
DeleteFilesOnShutdown.add(errFile);
stderrFile = new FileOutputStream(errFile);
}
} catch (IOException e) {
Expand Down
4 changes: 3 additions & 1 deletion app/test/processing/app/AbstractGUITest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package processing.app;

import cc.arduino.files.DeleteFilesOnShutdown;
import org.fest.swing.edt.FailOnThreadViolationRepaintManager;
import org.fest.swing.edt.GuiActionRunner;
import org.fest.swing.edt.GuiQuery;
Expand All @@ -16,6 +17,7 @@ public abstract class AbstractGUITest {
@Before
public void startUpTheIDE() throws Exception {
System.setProperty("mrj.version", "whynot"); //makes sense only on osx. See https://github.com/alexruiz/fest-swing-1.x/issues/2#issuecomment-86532042
Runtime.getRuntime().addShutdownHook(new Thread(DeleteFilesOnShutdown.INSTANCE));

FailOnThreadViolationRepaintManager.install();

Expand All @@ -25,7 +27,7 @@ public void startUpTheIDE() throws Exception {
Theme.init();
Base.getPlatform().setLookAndFeel();
Base.untitledFolder = Base.createTempFolder("untitled");
Base.untitledFolder.deleteOnExit();
DeleteFilesOnShutdown.add(Base.untitledFolder);

window = GuiActionRunner.execute(new GuiQuery<ArduinoFrameFixture>() {
@Override
Expand Down
6 changes: 4 additions & 2 deletions app/test/processing/app/AbstractWithPreferencesTest.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
package processing.app;

import cc.arduino.files.DeleteFilesOnShutdown;
import org.junit.Before;

public abstract class AbstractWithPreferencesTest {

@Before
public void init() throws Exception {
Runtime.getRuntime().addShutdownHook(new Thread(DeleteFilesOnShutdown.INSTANCE));
Base.initPlatform();
Preferences.init(null);
Theme.init();

Base.untitledFolder = Base.createTempFolder("untitled");
Base.untitledFolder.deleteOnExit();

DeleteFilesOnShutdown.add(Base.untitledFolder);
}

}
47 changes: 47 additions & 0 deletions arduino-core/src/cc/arduino/files/DeleteFilesOnShutdown.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package cc.arduino.files;

import processing.app.PreferencesData;
import processing.app.helpers.FileUtils;

import java.io.File;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class DeleteFilesOnShutdown implements Runnable {

public static final DeleteFilesOnShutdown INSTANCE = new DeleteFilesOnShutdown();

public static void add(File file) {
INSTANCE.addFile(file);
}

private final List<File> files;

public DeleteFilesOnShutdown() {
this.files = new LinkedList<File>();
}

public synchronized void addFile(File file) {
this.files.add(file);
}

@Override
public void run() {
boolean preserveTempFiles = PreferencesData.getBoolean("runtime.preserve.temp.files");
if (preserveTempFiles) {
return;
}
List<File> copyOfFiles;
synchronized (this) {
copyOfFiles = new LinkedList<File>(files);
}
Collections.reverse(copyOfFiles);
for (File file : copyOfFiles) {
if (file.exists() && file.canWrite()) {
FileUtils.recursiveDelete(file);
}
}
}

}
6 changes: 4 additions & 2 deletions arduino-core/src/processing/app/BaseNoGui.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package processing.app;

import cc.arduino.contributions.libraries.LibrariesIndexer;
import cc.arduino.files.DeleteFilesOnShutdown;
import cc.arduino.packages.DiscoveryManager;
import cc.arduino.packages.Uploader;
import cc.arduino.contributions.packages.ContributedTool;
import cc.arduino.contributions.packages.ContributionsIndexer;
import cc.arduino.utils.ArchiveExtractor;
import org.apache.commons.logging.impl.LogFactoryImpl;
import org.apache.commons.logging.impl.NoOpLog;
import processing.app.debug.Compiler;
Expand Down Expand Up @@ -133,7 +133,7 @@ static public File getBuildFolder() {
//File folder = new File(getTempFolder(), "build");
//if (!folder.exists()) folder.mkdirs();
buildFolder = createTempFolder("build");
buildFolder.deleteOnExit();
DeleteFilesOnShutdown.add(buildFolder);
}
}
return buildFolder;
Expand Down Expand Up @@ -703,6 +703,8 @@ static public void main(String args[]) throws Exception {
if (args.length == 0)
showError(_("No parameters"), _("No command line parameters found"), null);

Runtime.getRuntime().addShutdownHook(new Thread(DeleteFilesOnShutdown.INSTANCE));

initPlatform();

initPortableFolder();
Expand Down
11 changes: 11 additions & 0 deletions arduino-core/src/processing/app/helpers/CommandlineParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ private enum ACTION {
private boolean doVerboseBuild = false;
private boolean doVerboseUpload = false;
private boolean doUseProgrammer = false;
private boolean preserveTempFiles;
private boolean noUploadPort = false;
private boolean forceSavePrefs = false;
private String getPref;
Expand Down Expand Up @@ -105,6 +106,12 @@ private void parseArguments(String[] args) {
action = ACTION.NOOP;
continue;
}
if (args[i].equals("--preserve-temp-files")) {
preserveTempFiles = true;
if (action == ACTION.GUI)
action = ACTION.NOOP;
continue;
}
if (args[i].equals("--verbose-build")) {
doVerboseBuild = true;
if (action == ACTION.GUI)
Expand Down Expand Up @@ -330,4 +337,8 @@ public String getBoardToInstall() {
public String getLibraryToInstall() {
return libraryToInstall;
}

public boolean isPreserveTempFiles() {
return preserveTempFiles;
}
}
6 changes: 5 additions & 1 deletion build/shared/manpage.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ SYNOPSIS
--------
*arduino* ['FILE.ino'...]

*arduino* [*--verify*|*--upload*] [*--board* __package__:__arch__:__board__[:__parameters__]] [*--port* __portname__] [*--pref* __name__=__value__] [*-v*|*--verbose*] [__FILE.ino__]
*arduino* [*--verify*|*--upload*] [*--board* __package__:__arch__:__board__[:__parameters__]] [*--port* __portname__] [*--pref* __name__=__value__] [*-v*|*--verbose*] [--preserve-temp-files] [__FILE.ino__]

*arduino* [*--get-pref* __preference__]

Expand Down Expand Up @@ -117,6 +117,10 @@ OPTIONS
verbose mode during build is *disabled* regardless of the current
preferences.

*--preserve-temp-files*::
Keep temporary files (preprocessed sketch, object files...) after termination.
If omitted, temporary files are deleted.

{empty}::
This option is only valid together with *--verify* or
*--upload*.
Expand Down