about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/manual/nix-reference.xml17
-rw-r--r--src/exec.cc6
-rw-r--r--src/globals.cc3
-rw-r--r--src/globals.hh6
-rw-r--r--src/nix-help.txt1
-rw-r--r--src/nix.cc2
6 files changed, 34 insertions, 1 deletions
diff --git a/doc/manual/nix-reference.xml b/doc/manual/nix-reference.xml
index 75009b1d04bc..d9c78ff07344 100644
--- a/doc/manual/nix-reference.xml
+++ b/doc/manual/nix-reference.xml
@@ -15,6 +15,10 @@
 	<arg><option>--verbose</option></arg>
 	<arg><option>-v</option></arg>
       </group>
+      <group choice='opt' rep='repeat'>
+	<arg><option>--keep-failed</option></arg>
+	<arg><option>-K</option></arg>
+      </group>
       <arg choice='plain'><replaceable>operation</replaceable></arg>
       <arg rep='repeat'><replaceable>options</replaceable></arg>
       <arg rep='repeat'><replaceable>arguments</replaceable></arg>
@@ -121,6 +125,19 @@
 
 	</listitem>
       </varlistentry>
+
+      <varlistentry>
+	<term><option>--keep-failed</option></term>
+	<listitem>
+	  <para>
+	    Specifies that in case of a build failure, the temporary directory
+            (usually in <filename>/tmp</filename>) in which the build takes
+            place should not be deleted.  The path of the build directory is
+            printed as an informational message.
+	  </para>
+	</listitem>
+      </varlistentry>
+
     </variablelist>
 
   </refsect1>
diff --git a/src/exec.cc b/src/exec.cc
index d82f5effaaea..fdfb467cca71 100644
--- a/src/exec.cc
+++ b/src/exec.cc
@@ -122,7 +122,11 @@ void runProgram(const string & program,
         throw Error("unable to wait for child");
     
     if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
-        delTmpDir.cancel();
+	if (keepFailed) {
+	    msg(lvlTalkative, 
+		format("build failed; keeping build directory `%1%'") % tmpDir);
+	    delTmpDir.cancel();
+	}
         throw Error("unable to build package");
     }
 }
diff --git a/src/globals.cc b/src/globals.cc
index 1ec0c4f9ba21..f21820f59771 100644
--- a/src/globals.cc
+++ b/src/globals.cc
@@ -17,6 +17,9 @@ string nixLogDir = "/UNINIT";
 string nixDBPath = "/UNINIT";
 
 
+bool keepFailed = false;
+
+
 void openDB()
 {
     nixDB.open(nixDBPath);
diff --git a/src/globals.hh b/src/globals.hh
index 2c4d3392077d..107d617bc895 100644
--- a/src/globals.hh
+++ b/src/globals.hh
@@ -69,6 +69,12 @@ extern string nixLogDir;
 extern string nixDBPath;
 
 
+/* Misc. global flags. */
+
+/* Whether to keep temporary directories of failed builds. */
+extern bool keepFailed;
+
+
 /* Open the database environment. */
 void openDB();
 
diff --git a/src/nix-help.txt b/src/nix-help.txt
index 0e54d162de05..4e1d707c8926 100644
--- a/src/nix-help.txt
+++ b/src/nix-help.txt
@@ -34,3 +34,4 @@ Query flags:
 Options:
 
   --verbose / -v: verbose operation (may be repeated)
+  --keep-failed / -K: keep temporary directories of failed builds
diff --git a/src/nix.cc b/src/nix.cc
index 4beeb5da8943..704442c313e4 100644
--- a/src/nix.cc
+++ b/src/nix.cc
@@ -372,6 +372,8 @@ void run(Strings args)
             pathArgs = true;
         else if (arg == "--verbose" || arg == "-v")
             verbosity = (Verbosity) ((int) verbosity + 1);
+        else if (arg == "--keep-failed" || arg == "-K")
+            keepFailed = true;
         else if (arg == "--help")
             printHelp();
         else if (arg[0] == '-')