aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libstore/local-store.cc21
-rw-r--r--src/libstore/local-store.hh4
-rw-r--r--src/nix-store/nix-store.cc17
3 files changed, 39 insertions, 3 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index 4d82547c6..f93ba3639 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -327,6 +327,8 @@ void LocalStore::openDB(bool create)
"insert into FailedPaths (path, time) values (?, ?);");
stmtHasPathFailed.create(db,
"select time from FailedPaths where path = ?;");
+ stmtQueryFailedPaths.create(db,
+ "select path from FailedPaths;");
stmtAddDerivationOutput.create(db,
"insert or replace into DerivationOutputs (drv, id, path) values (?, ?, ?);");
stmtQueryValidDerivers.create(db,
@@ -508,6 +510,25 @@ bool LocalStore::hasPathFailed(const Path & path)
}
+PathSet LocalStore::queryFailedPaths()
+{
+ SQLiteStmtUse use(stmtQueryFailedPaths);
+
+ PathSet res;
+ int r;
+ while ((r = sqlite3_step(stmtQueryFailedPaths)) == SQLITE_ROW) {
+ const char * s = (const char *) sqlite3_column_text(stmtQueryFailedPaths, 0);
+ assert(s);
+ res.insert(s);
+ }
+
+ if (r != SQLITE_DONE)
+ throw SQLiteError(db, "error querying failed paths");
+
+ return res;
+}
+
+
Hash parseHashField(const Path & path, const string & s)
{
string::size_type colon = s.find(':');
diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh
index 0c5f04158..70fc64fdc 100644
--- a/src/libstore/local-store.hh
+++ b/src/libstore/local-store.hh
@@ -184,6 +184,9 @@ public:
/* Query whether `path' previously failed to build. */
bool hasPathFailed(const Path & path);
+ /* Return the set of paths that have failed to build.*/
+ PathSet queryFailedPaths();
+
private:
Path schemaPath;
@@ -203,6 +206,7 @@ private:
SQLiteStmt stmtInvalidatePath;
SQLiteStmt stmtRegisterFailedPath;
SQLiteStmt stmtHasPathFailed;
+ SQLiteStmt stmtQueryFailedPaths;
SQLiteStmt stmtAddDerivationOutput;
SQLiteStmt stmtQueryValidDerivers;
SQLiteStmt stmtQueryDerivationOutputs;
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index ddf2062c2..34bbbcd9f 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -33,7 +33,7 @@ static bool indirectRoot = false;
LocalStore & ensureLocalStore()
{
LocalStore * store2(dynamic_cast<LocalStore *>(store.get()));
- if (!store2) throw Error("you don't have sufficient rights to use --verify");
+ if (!store2) throw Error("you don't have sufficient rights to use this command");
return *store2;
}
@@ -651,8 +651,7 @@ static void opOptimise(Strings opFlags, Strings opArgs)
bool dryRun = false;
- for (Strings::iterator i = opFlags.begin();
- i != opFlags.end(); ++i)
+ foreach (Strings::iterator, i, opFlags)
if (*i == "--dry-run") dryRun = true;
else throw UsageError(format("unknown flag `%1%'") % *i);
@@ -667,6 +666,16 @@ static void opOptimise(Strings opFlags, Strings opArgs)
}
+static void opQueryFailedPaths(Strings opFlags, Strings opArgs)
+{
+ if (!opArgs.empty() || !opFlags.empty())
+ throw UsageError("no arguments expected");
+ PathSet failed = ensureLocalStore().queryFailedPaths();
+ foreach (PathSet::iterator, i, failed)
+ cout << format("%1%\n") % *i;
+}
+
+
/* Scan the arguments; find the operation, set global flags, put all
other flags in a list, and put all other arguments in another
list. */
@@ -718,6 +727,8 @@ void run(Strings args)
op = opVerify;
else if (arg == "--optimise")
op = opOptimise;
+ else if (arg == "--query-failed-paths")
+ op = opQueryFailedPaths;
else if (arg == "--add-root") {
if (i == args.end())
throw UsageError("`--add-root requires an argument");