about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-06-22T08·50+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-06-22T08·50+0000
commitc4cb6ea2bc77f1f9239ce81ffc7a0fa6b540b1ab (patch)
tree73883262549f10206cc2a961dc7fb577f0ba1679 /src
parent88fb4f6e537ebea37fe0aaa4a2b044cf70d32178 (diff)
* Refactoring.
Diffstat (limited to 'src')
-rw-r--r--src/libstore/normalise.cc24
-rw-r--r--src/libstore/store.cc3
-rw-r--r--src/libutil/util.cc13
-rw-r--r--src/libutil/util.hh5
4 files changed, 25 insertions, 20 deletions
diff --git a/src/libstore/normalise.cc b/src/libstore/normalise.cc
index 937dbc7f9bac..29a6c339cb15 100644
--- a/src/libstore/normalise.cc
+++ b/src/libstore/normalise.cc
@@ -497,14 +497,8 @@ void NormalisationGoal::buildDone()
     /* Check the exit status. */
     if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
         deleteTmpDir(false);
-        if (WIFEXITED(status))
-            throw Error(format("builder for `%1%' failed with exit code %2%")
-                % nePath % WEXITSTATUS(status));
-        else if (WIFSIGNALED(status))
-            throw Error(format("builder for `%1%' failed due to signal %2%")
-                % nePath % WTERMSIG(status));
-        else
-            throw Error(format("builder for `%1%' failed died abnormally") % nePath);
+        throw Error(format("builder for `%1%' %2%")
+            % nePath % statusToString(status));
     }
     
     deleteTmpDir(true);
@@ -1425,17 +1419,9 @@ void SubstitutionGoal::finished()
     debug(format("substitute for `%1%' finished") % storePath);
 
     /* Check the exit status. */
-    /* !!! cut & paste */
-    if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
-        if (WIFEXITED(status))
-            throw Error(format("builder for `%1%' failed with exit code %2%")
-                % storePath % WEXITSTATUS(status));
-        else if (WIFSIGNALED(status))
-            throw Error(format("builder for `%1%' failed due to signal %2%")
-                % storePath % WTERMSIG(status));
-        else
-            throw Error(format("builder for `%1%' failed died abnormally") % storePath);
-    }
+    if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+        throw Error(format("builder for `%1%' %2%")
+            % storePath % statusToString(status));
 
     if (!pathExists(storePath))
         throw Error(format("substitute did not produce path `%1%'") % storePath);
diff --git a/src/libstore/store.cc b/src/libstore/store.cc
index 73c09b27442f..59d4430fd692 100644
--- a/src/libstore/store.cc
+++ b/src/libstore/store.cc
@@ -164,7 +164,8 @@ void copyPath(const Path & src, const Path & dst)
         throw SysError("waiting for child");
 
     if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
-        throw Error("cannot copy file: child died");
+        throw Error(format("cannot copy `%1% to `%2%': child %3%")
+            % src % dst % statusToString(status));
 }
 
 
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 2cfada35450a..d3446d38a6d8 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -491,3 +491,16 @@ Strings unpackStrings(const string & s)
     
     return strings;
 }
+
+
+string statusToString(int status)
+{
+    if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
+        if (WIFEXITED(status))
+            return (format("failed with exit code %2%") % WEXITSTATUS(status)).str();
+        else if (WIFSIGNALED(status))
+            return (format("failed due to signal %2%") % WTERMSIG(status)).str();
+        else
+            return "died abnormally";
+    } else return "succeeded";
+}
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index e808f4e1b50b..21c6774b9d07 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -221,4 +221,9 @@ string packStrings(const Strings & strings);
 Strings unpackStrings(const string & s);
 
 
+/* Convert the exit status of a child as returned by wait() into an
+   error string. */
+string statusToString(int status);
+
+
 #endif /* !__UTIL_H */