forked from lix-project/lix
nix verify: Restore the progress indicator
This commit is contained in:
parent
b4ed97e3a3
commit
c2cab20732
|
@ -22,11 +22,14 @@ typedef enum {
|
|||
actBuilds = 104,
|
||||
actBuild = 105,
|
||||
actOptimiseStore = 106,
|
||||
actVerifyPaths = 107,
|
||||
} ActivityType;
|
||||
|
||||
typedef enum {
|
||||
resFileLinked = 100,
|
||||
resBuildLogLine = 101,
|
||||
resUntrustedPath = 102,
|
||||
resCorruptedPath = 103,
|
||||
} ResultType;
|
||||
|
||||
typedef uint64_t ActivityId;
|
||||
|
|
|
@ -57,6 +57,8 @@ private:
|
|||
std::map<ActivityType, ActivitiesByType> activitiesByType;
|
||||
|
||||
uint64_t filesLinked = 0, bytesLinked = 0;
|
||||
|
||||
uint64_t corruptedPaths = 0, untrustedPaths = 0;
|
||||
};
|
||||
|
||||
Sync<State> state_;
|
||||
|
@ -179,6 +181,16 @@ public:
|
|||
update(*state);
|
||||
}
|
||||
}
|
||||
|
||||
else if (type == resUntrustedPath) {
|
||||
state->untrustedPaths++;
|
||||
update(*state);
|
||||
}
|
||||
|
||||
else if (type == resCorruptedPath) {
|
||||
state->corruptedPaths++;
|
||||
update(*state);
|
||||
}
|
||||
}
|
||||
|
||||
void update()
|
||||
|
@ -285,6 +297,19 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
// FIXME: don't show "done" paths in green.
|
||||
showActivity(actVerifyPaths, "%s paths verified");
|
||||
|
||||
if (state.corruptedPaths) {
|
||||
if (!res.empty()) res += ", ";
|
||||
res += fmt(ANSI_RED "%d corrupted" ANSI_NORMAL, state.corruptedPaths);
|
||||
}
|
||||
|
||||
if (state.untrustedPaths) {
|
||||
if (!res.empty()) res += ", ";
|
||||
res += fmt(ANSI_RED "%d untrusted" ANSI_NORMAL, state.untrustedPaths);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -61,16 +61,17 @@ struct CmdVerify : StorePathsCommand
|
|||
|
||||
auto publicKeys = getDefaultPublicKeys();
|
||||
|
||||
Activity act(*logger, actVerifyPaths);
|
||||
|
||||
std::atomic<size_t> done{0};
|
||||
std::atomic<size_t> untrusted{0};
|
||||
std::atomic<size_t> corrupted{0};
|
||||
std::atomic<size_t> failed{0};
|
||||
std::atomic<size_t> active{0};
|
||||
|
||||
std::string doneLabel("paths checked");
|
||||
std::string untrustedLabel("untrusted");
|
||||
std::string corruptedLabel("corrupted");
|
||||
std::string failedLabel("failed");
|
||||
//logger->setExpected(doneLabel, storePaths.size());
|
||||
auto update = [&]() {
|
||||
act.progress(done, storePaths.size(), active, failed);
|
||||
};
|
||||
|
||||
ThreadPool pool;
|
||||
|
||||
|
@ -78,7 +79,10 @@ struct CmdVerify : StorePathsCommand
|
|||
try {
|
||||
checkInterrupt();
|
||||
|
||||
//Activity act(*logger, lvlInfo, format("checking '%s'") % storePath);
|
||||
Activity act2(*logger, actUnknown, fmt("checking '%s'", storePath));
|
||||
|
||||
MaintainCount<std::atomic<size_t>> mcActive(active);
|
||||
update();
|
||||
|
||||
auto info = store->queryPathInfo(storePath);
|
||||
|
||||
|
@ -90,8 +94,8 @@ struct CmdVerify : StorePathsCommand
|
|||
auto hash = sink.finish();
|
||||
|
||||
if (hash.first != info->narHash) {
|
||||
//logger->incProgress(corruptedLabel);
|
||||
corrupted = 1;
|
||||
corrupted++;
|
||||
act2.result(resCorruptedPath, info->path);
|
||||
printError(
|
||||
format("path '%s' was modified! expected hash '%s', got '%s'")
|
||||
% info->path % info->narHash.to_string() % hash.first.to_string());
|
||||
|
@ -142,21 +146,21 @@ struct CmdVerify : StorePathsCommand
|
|||
}
|
||||
|
||||
if (!good) {
|
||||
//logger->incProgress(untrustedLabel);
|
||||
untrusted++;
|
||||
act2.result(resUntrustedPath, info->path);
|
||||
printError(format("path '%s' is untrusted") % info->path);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//logger->incProgress(doneLabel);
|
||||
done++;
|
||||
|
||||
} catch (Error & e) {
|
||||
printError(format(ANSI_RED "error:" ANSI_NORMAL " %s") % e.what());
|
||||
//logger->incProgress(failedLabel);
|
||||
failed++;
|
||||
}
|
||||
|
||||
update();
|
||||
};
|
||||
|
||||
for (auto & storePath : storePaths)
|
||||
|
@ -164,9 +168,6 @@ struct CmdVerify : StorePathsCommand
|
|||
|
||||
pool.process();
|
||||
|
||||
printInfo(format("%d paths checked, %d untrusted, %d corrupted, %d failed")
|
||||
% done % untrusted % corrupted % failed);
|
||||
|
||||
throw Exit(
|
||||
(corrupted ? 1 : 0) |
|
||||
(untrusted ? 2 : 0) |
|
||||
|
|
Loading…
Reference in a new issue