aboutsummaryrefslogtreecommitdiff
path: root/src/nix
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix')
-rw-r--r--src/nix/cat.cc4
-rw-r--r--src/nix/command.cc10
-rw-r--r--src/nix/copy.cc2
-rw-r--r--src/nix/develop.cc6
-rw-r--r--src/nix/flake.cc6
-rw-r--r--src/nix/hash.cc2
-rw-r--r--src/nix/installables.cc26
-rw-r--r--src/nix/local.mk2
-rw-r--r--src/nix/ls.cc2
-rw-r--r--src/nix/main.cc11
-rw-r--r--src/nix/make-content-addressable.cc12
-rw-r--r--src/nix/path-info.cc2
-rw-r--r--src/nix/profile.cc12
-rw-r--r--src/nix/progress-bar.cc476
-rw-r--r--src/nix/progress-bar.hh11
-rw-r--r--src/nix/repl.cc8
-rw-r--r--src/nix/run.cc10
-rw-r--r--src/nix/show-derivation.cc6
-rw-r--r--src/nix/upgrade-nix.cc7
-rw-r--r--src/nix/verify.cc25
-rw-r--r--src/nix/why-depends.cc16
21 files changed, 90 insertions, 566 deletions
diff --git a/src/nix/cat.cc b/src/nix/cat.cc
index b528a0507..97306107c 100644
--- a/src/nix/cat.cc
+++ b/src/nix/cat.cc
@@ -13,9 +13,9 @@ struct MixCat : virtual Args
{
auto st = accessor->stat(path);
if (st.type == FSAccessor::Type::tMissing)
- throw Error(format("path '%1%' does not exist") % path);
+ throw Error("path '%1%' does not exist", path);
if (st.type != FSAccessor::Type::tRegular)
- throw Error(format("path '%1%' is not a regular file") % path);
+ throw Error("path '%1%' is not a regular file", path);
std::cout << accessor->readFile(path);
}
diff --git a/src/nix/command.cc b/src/nix/command.cc
index 803a36e84..f7ebf998d 100644
--- a/src/nix/command.cc
+++ b/src/nix/command.cc
@@ -59,19 +59,19 @@ void StorePathsCommand::run(ref<Store> store)
if (installables.size())
throw UsageError("'--all' does not expect arguments");
for (auto & p : store->queryAllValidPaths())
- storePaths.push_back(p.clone());
+ storePaths.push_back(p);
}
else {
for (auto & p : toStorePaths(store, realiseMode, installables))
- storePaths.push_back(p.clone());
+ storePaths.push_back(p);
if (recursive) {
StorePathSet closure;
- store->computeFSClosure(storePathsToSet(storePaths), closure, false, false);
+ store->computeFSClosure(StorePathSet(storePaths.begin(), storePaths.end()), closure, false, false);
storePaths.clear();
for (auto & p : closure)
- storePaths.push_back(p.clone());
+ storePaths.push_back(p);
}
}
@@ -134,7 +134,7 @@ void MixProfile::updateProfile(const Buildables & buildables)
for (auto & output : buildable.outputs) {
if (result)
throw Error("'--profile' requires that the arguments produce a single store path, but there are multiple");
- result = output.second.clone();
+ result = output.second;
}
}
diff --git a/src/nix/copy.cc b/src/nix/copy.cc
index a29adf57d..815e653b0 100644
--- a/src/nix/copy.cc
+++ b/src/nix/copy.cc
@@ -101,7 +101,7 @@ struct CmdCopy : StorePathsCommand
{
ref<Store> dstStore = dstUri.empty() ? openStore() : openStore(dstUri);
- copyPaths(srcStore, dstStore, storePathsToSet(storePaths),
+ copyPaths(srcStore, dstStore, StorePathSet(storePaths.begin(), storePaths.end()),
NoRepair, checkSigs, substitute);
}
};
diff --git a/src/nix/develop.cc b/src/nix/develop.cc
index 59fcc15f4..06b165e41 100644
--- a/src/nix/develop.cc
+++ b/src/nix/develop.cc
@@ -135,12 +135,12 @@ StorePath getDerivationEnvironment(ref<Store> store, const StorePath & drvPath)
drv.inputSrcs.insert(std::move(getEnvShPath));
Hash h = hashDerivationModulo(*store, drv, true);
auto shellOutPath = store->makeOutputPath("out", h, drvName);
- drv.outputs.insert_or_assign("out", DerivationOutput(shellOutPath.clone(), "", ""));
+ drv.outputs.insert_or_assign("out", DerivationOutput { shellOutPath, "", "" });
drv.env["out"] = store->printStorePath(shellOutPath);
auto shellDrvPath2 = writeDerivation(store, drv, drvName);
/* Build the derivation. */
- store->buildPaths({shellDrvPath2});
+ store->buildPaths({{shellDrvPath2}});
assert(store->isValidPath(shellOutPath));
@@ -210,7 +210,7 @@ struct Common : InstallableCommand, MixProfile
{
auto path = installable->getStorePath();
if (path && hasSuffix(path->to_string(), "-env"))
- return path->clone();
+ return *path;
else {
auto drvs = toDerivations(store, {installable});
diff --git a/src/nix/flake.cc b/src/nix/flake.cc
index 57c5478c3..323810090 100644
--- a/src/nix/flake.cc
+++ b/src/nix/flake.cc
@@ -248,7 +248,7 @@ struct CmdFlakeCheck : FlakeCommand
auto [drvPathS, outputName] = decodeContext(i);
auto drvPath = store->parseStorePath(drvPathS);
if (!outputName.empty() && drvPath.isDerivation())
- drvPaths.emplace_back(drvPath);
+ drvPaths.push_back({drvPath});
}
} catch (Error & e) {
e.addPrefix(fmt("while checking the app definition '" ANSI_BOLD "%s" ANSI_NORMAL "' at %s:\n", attrPath, pos));
@@ -392,7 +392,7 @@ struct CmdFlakeCheck : FlakeCommand
fmt("%s.%s.%s", name, attr.name, attr2.name),
*attr2.value, *attr2.pos);
if ((std::string) attr.name == settings.thisSystem.get())
- drvPaths.emplace_back(drvPath);
+ drvPaths.push_back({drvPath});
}
}
}
@@ -720,7 +720,7 @@ struct CmdFlakeArchive : FlakeCommand, MixJSON, MixDryRun
StorePathSet sources;
- sources.insert(flake.flake.sourceInfo->storePath.clone());
+ sources.insert(flake.flake.sourceInfo->storePath);
if (jsonRoot)
jsonRoot->attr("path", store->printStorePath(flake.flake.sourceInfo->storePath));
diff --git a/src/nix/hash.cc b/src/nix/hash.cc
index 9e1d27f4c..7f646ad53 100644
--- a/src/nix/hash.cc
+++ b/src/nix/hash.cc
@@ -137,7 +137,7 @@ static int compatNixHash(int argc, char * * argv)
string s = getArg(*arg, arg, end);
ht = parseHashType(s);
if (ht == htUnknown)
- throw UsageError(format("unknown hash type '%1%'") % s);
+ throw UsageError("unknown hash type '%1%'", s);
}
else if (*arg == "--to-base16") op = opTo16;
else if (*arg == "--to-base32") op = opTo32;
diff --git a/src/nix/installables.cc b/src/nix/installables.cc
index d5d42ee57..c41aa859c 100644
--- a/src/nix/installables.cc
+++ b/src/nix/installables.cc
@@ -293,9 +293,9 @@ struct InstallableStorePath : Installable
Buildables toBuildables() override
{
std::map<std::string, StorePath> outputs;
- outputs.insert_or_assign("out", storePath.clone());
+ outputs.insert_or_assign("out", storePath);
Buildable b{
- .drvPath = storePath.isDerivation() ? storePath.clone() : std::optional<StorePath>(),
+ .drvPath = storePath.isDerivation() ? storePath : std::optional<StorePath>(),
.outputs = std::move(outputs)
};
Buildables bs;
@@ -305,7 +305,7 @@ struct InstallableStorePath : Installable
std::optional<StorePath> getStorePath() override
{
- return storePath.clone();
+ return storePath;
}
};
@@ -316,14 +316,14 @@ Buildables InstallableValue::toBuildables()
StorePathSet drvPaths;
for (auto & drv : toDerivations()) {
- Buildable b{.drvPath = drv.drvPath.clone()};
- drvPaths.insert(drv.drvPath.clone());
+ Buildable b{.drvPath = drv.drvPath};
+ drvPaths.insert(drv.drvPath);
auto outputName = drv.outputName;
if (outputName == "")
throw Error("derivation '%s' lacks an 'outputName' attribute", state->store->printStorePath(*b.drvPath));
- b.outputs.emplace(outputName, drv.outPath.clone());
+ b.outputs.emplace(outputName, drv.outPath);
res.push_back(std::move(b));
}
@@ -331,10 +331,10 @@ Buildables InstallableValue::toBuildables()
// Hack to recognize .all: if all drvs have the same drvPath,
// merge the buildables.
if (drvPaths.size() == 1) {
- Buildable b{.drvPath = drvPaths.begin()->clone()};
+ Buildable b{.drvPath = *drvPaths.begin()};
for (auto & b2 : res)
for (auto & output : b2.outputs)
- b.outputs.insert_or_assign(output.first, output.second.clone());
+ b.outputs.insert_or_assign(output.first, output.second);
Buildables bs;
bs.push_back(std::move(b));
return bs;
@@ -641,7 +641,7 @@ Buildables build(ref<Store> store, RealiseMode mode,
pathsToBuild.push_back({*b.drvPath, outputNames});
} else
for (auto & output : b.outputs)
- pathsToBuild.push_back({output.second.clone()});
+ pathsToBuild.push_back({output.second});
buildables.push_back(std::move(b));
}
}
@@ -661,7 +661,7 @@ StorePathSet toStorePaths(ref<Store> store, RealiseMode mode,
for (auto & b : build(store, mode, installables))
for (auto & output : b.outputs)
- outPaths.insert(output.second.clone());
+ outPaths.insert(output.second);
return outPaths;
}
@@ -674,7 +674,7 @@ StorePath toStorePath(ref<Store> store, RealiseMode mode,
if (paths.size() != 1)
throw Error("argument '%s' should evaluate to one store path", installable->what());
- return paths.begin()->clone();
+ return *paths.begin();
}
StorePathSet toDerivations(ref<Store> store,
@@ -692,10 +692,10 @@ StorePathSet toDerivations(ref<Store> store,
if (derivers.empty())
throw Error("'%s' does not have a known deriver", i->what());
// FIXME: use all derivers?
- drvPaths.insert(derivers.begin()->clone());
+ drvPaths.insert(*derivers.begin());
}
} else
- drvPaths.insert(b.drvPath->clone());
+ drvPaths.insert(*b.drvPath);
}
return drvPaths;
diff --git a/src/nix/local.mk b/src/nix/local.mk
index 43b7754e3..b057b7cc6 100644
--- a/src/nix/local.mk
+++ b/src/nix/local.mk
@@ -17,7 +17,7 @@ nix_SOURCES := \
nix_CXXFLAGS += -I src/libutil -I src/libstore -I src/libfetchers -I src/libexpr -I src/libmain
-nix_LIBS = libexpr libmain libfetchers libstore libutil libnixrust
+nix_LIBS = libexpr libmain libfetchers libstore libutil
nix_LDFLAGS = -pthread $(SODIUM_LIBS) $(EDITLINE_LIBS) $(BOOST_LDFLAGS) -lboost_context -lboost_thread -lboost_system
diff --git a/src/nix/ls.cc b/src/nix/ls.cc
index dc7e370b9..76c8bc9a3 100644
--- a/src/nix/ls.cc
+++ b/src/nix/ls.cc
@@ -63,7 +63,7 @@ struct MixLs : virtual Args, MixJSON
auto st = accessor->stat(path);
if (st.type == FSAccessor::Type::tMissing)
- throw Error(format("path '%1%' does not exist") % path);
+ throw Error("path '%1%' does not exist", path);
doPath(st, path,
st.type == FSAccessor::Type::tDirectory ? "." : std::string(baseNameOf(path)),
showDirectory);
diff --git a/src/nix/main.cc b/src/nix/main.cc
index 936674354..2ad748289 100644
--- a/src/nix/main.cc
+++ b/src/nix/main.cc
@@ -10,6 +10,7 @@
#include "progress-bar.hh"
#include "filetransfer.hh"
#include "finally.hh"
+#include "loggers.hh"
#include <sys/types.h>
#include <sys/socket.h>
@@ -90,7 +91,7 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
.longName = "print-build-logs",
.shortName = 'L',
.description = "print full build logs on stderr",
- .handler = {&printBuildLogs, true},
+ .handler = {[&]() {setLogFormat(LogFormat::barWithLogs); }},
});
addFlag({
@@ -166,6 +167,10 @@ void mainWrapped(int argc, char * * argv)
settings.verboseBuild = false;
evalSettings.pureEval = true;
+ setLogFormat("bar");
+
+ Finally f([] { logger->stop(); });
+
NixArgs args;
Finally printCompletions([&]()
@@ -194,10 +199,6 @@ void mainWrapped(int argc, char * * argv)
&& args.command->first != "upgrade-nix")
settings.requireExperimentalFeature("nix-command");
- Finally f([]() { stopProgressBar(); });
-
- startProgressBar(args.printBuildLogs);
-
if (args.useNet && !haveInternet()) {
warn("you don't have Internet access; disabling some network-dependent features");
args.useNet = false;
diff --git a/src/nix/make-content-addressable.cc b/src/nix/make-content-addressable.cc
index 3e7ff544d..0ebb8f13b 100644
--- a/src/nix/make-content-addressable.cc
+++ b/src/nix/make-content-addressable.cc
@@ -36,7 +36,7 @@ struct CmdMakeContentAddressable : StorePathsCommand, MixJSON
void run(ref<Store> store, StorePaths storePaths) override
{
- auto paths = store->topoSortPaths(storePathsToSet(storePaths));
+ auto paths = store->topoSortPaths(StorePathSet(storePaths.begin(), storePaths.end()));
std::reverse(paths.begin(), paths.end());
@@ -48,7 +48,7 @@ struct CmdMakeContentAddressable : StorePathsCommand, MixJSON
for (auto & path : paths) {
auto pathS = store->printStorePath(path);
auto oldInfo = store->queryPathInfo(path);
- auto oldHashPart = storePathToHash(pathS);
+ std::string oldHashPart(path.hashPart());
StringSink sink;
store->narFromPath(path, sink);
@@ -62,7 +62,7 @@ struct CmdMakeContentAddressable : StorePathsCommand, MixJSON
hasSelfReference = true;
else {
auto i = remappings.find(ref);
- auto replacement = i != remappings.end() ? i->second.clone() : ref.clone();
+ auto replacement = i != remappings.end() ? i->second : ref;
// FIXME: warn about unremapped paths?
if (replacement != ref)
rewrites.insert_or_assign(store->printStorePath(ref), store->printStorePath(replacement));
@@ -79,16 +79,16 @@ struct CmdMakeContentAddressable : StorePathsCommand, MixJSON
ValidPathInfo info(store->makeFixedOutputPath(FileIngestionMethod::Recursive, narHash, path.name(), references, hasSelfReference));
info.references = std::move(references);
- if (hasSelfReference) info.references.insert(info.path.clone());
+ if (hasSelfReference) info.references.insert(info.path);
info.narHash = narHash;
info.narSize = sink.s->size();
info.ca = makeFixedOutputCA(FileIngestionMethod::Recursive, info.narHash);
if (!json)
- printError("rewrote '%s' to '%s'", pathS, store->printStorePath(info.path));
+ printInfo("rewrote '%s' to '%s'", pathS, store->printStorePath(info.path));
auto source = sinkToSource([&](Sink & nextSink) {
- RewritingSink rsink2(oldHashPart, storePathToHash(store->printStorePath(info.path)), nextSink);
+ RewritingSink rsink2(oldHashPart, std::string(info.path.hashPart()), nextSink);
rsink2((unsigned char *) sink.s->data(), sink.s->size());
rsink2.flush();
});
diff --git a/src/nix/path-info.cc b/src/nix/path-info.cc
index 88d7fffd4..fb7bacc4c 100644
--- a/src/nix/path-info.cc
+++ b/src/nix/path-info.cc
@@ -90,7 +90,7 @@ struct CmdPathInfo : StorePathsCommand, MixJSON
JSONPlaceholder jsonRoot(std::cout);
store->pathInfoToJSON(jsonRoot,
// FIXME: preserve order?
- storePathsToSet(storePaths),
+ StorePathSet(storePaths.begin(), storePaths.end()),
true, showClosureSize, SRI, AllowInvalid);
}
diff --git a/src/nix/profile.cc b/src/nix/profile.cc
index 59cc745e2..3ba4f6e32 100644
--- a/src/nix/profile.cc
+++ b/src/nix/profile.cc
@@ -74,7 +74,7 @@ struct ProfileManifest
for (auto & drvInfo : drvInfos) {
ProfileElement element;
- element.storePaths = singleton(state.store->parseStorePath(drvInfo.queryOutPath()));
+ element.storePaths = {state.store->parseStorePath(drvInfo.queryOutPath())};
elements.emplace_back(std::move(element));
}
}
@@ -114,7 +114,7 @@ struct ProfileManifest
for (auto & path : element.storePaths) {
if (element.active)
pkgs.emplace_back(store->printStorePath(path), true, 5);
- references.insert(path.clone());
+ references.insert(path);
}
}
@@ -177,14 +177,14 @@ struct CmdProfileInstall : InstallablesCommand, MixDefaultProfile
auto [attrPath, resolvedRef, drv] = installable2->toDerivation();
ProfileElement element;
- element.storePaths = singleton(drv.outPath.clone()); // FIXME
+ element.storePaths = {drv.outPath}; // FIXME
element.source = ProfileElementSource{
installable2->flakeRef,
resolvedRef,
attrPath,
};
- pathsToBuild.emplace_back(drv.drvPath.clone(), StringSet{"out"}); // FIXME
+ pathsToBuild.push_back({drv.drvPath, StringSet{"out"}}); // FIXME
manifest.elements.emplace_back(std::move(element));
} else
@@ -346,14 +346,14 @@ struct CmdProfileUpgrade : virtual SourceExprCommand, MixDefaultProfile, MixProf
printInfo("upgrading '%s' from flake '%s' to '%s'",
element.source->attrPath, element.source->resolvedRef, resolvedRef);
- element.storePaths = singleton(drv.outPath.clone()); // FIXME
+ element.storePaths = {drv.outPath}; // FIXME
element.source = ProfileElementSource{
installable.flakeRef,
resolvedRef,
attrPath,
};
- pathsToBuild.emplace_back(drv.drvPath, StringSet{"out"}); // FIXME
+ pathsToBuild.push_back({drv.drvPath, StringSet{"out"}}); // FIXME
}
}
diff --git a/src/nix/progress-bar.cc b/src/nix/progress-bar.cc
deleted file mode 100644
index 2eccea4ad..000000000
--- a/src/nix/progress-bar.cc
+++ /dev/null
@@ -1,476 +0,0 @@
-#include "progress-bar.hh"
-#include "util.hh"
-#include "sync.hh"
-#include "store-api.hh"
-#include "names.hh"
-
-#include <atomic>
-#include <map>
-#include <thread>
-#include <iostream>
-
-namespace nix {
-
-static std::string getS(const std::vector<Logger::Field> & fields, size_t n)
-{
- assert(n < fields.size());
- assert(fields[n].type == Logger::Field::tString);
- return fields[n].s;
-}
-
-static uint64_t getI(const std::vector<Logger::Field> & fields, size_t n)
-{
- assert(n < fields.size());
- assert(fields[n].type == Logger::Field::tInt);
- return fields[n].i;
-}
-
-static std::string_view storePathToName(std::string_view path)
-{
- auto base = baseNameOf(path);
- auto i = base.find('-');
- return i == std::string::npos ? base.substr(0, 0) : base.substr(i + 1);
-}
-
-class ProgressBar : public Logger
-{
-private:
-
- struct ActInfo
- {
- std::string s, lastLine, phase;
- ActivityType type = actUnknown;
- uint64_t done = 0;
- uint64_t expected = 0;
- uint64_t running = 0;
- uint64_t failed = 0;
- std::map<ActivityType, uint64_t> expectedByType;
- bool visible = true;
- ActivityId parent;
- std::optional<std::string> name;
- };
-
- struct ActivitiesByType
- {
- std::map<ActivityId, std::list<ActInfo>::iterator> its;
- uint64_t done = 0;
- uint64_t expected = 0;
- uint64_t failed = 0;
- };
-
- struct State
- {
- std::list<ActInfo> activities;
- std::map<ActivityId, std::list<ActInfo>::iterator> its;
-
- std::map<ActivityType, ActivitiesByType> activitiesByType;
-
- uint64_t filesLinked = 0, bytesLinked = 0;
-
- uint64_t corruptedPaths = 0, untrustedPaths = 0;
-
- bool active = true;
- bool haveUpdate = true;
- };
-
- Sync<State> state_;
-
- std::thread updateThread;
-
- std::condition_variable quitCV, updateCV;
-
- bool printBuildLogs;
- bool isTTY;
-
-public:
-
- ProgressBar(bool printBuildLogs, bool isTTY)
- : printBuildLogs(printBuildLogs)
- , isTTY(isTTY)
- {
- state_.lock()->active = isTTY;
- updateThread = std::thread([&]() {
- auto state(state_.lock());
- while (state->active) {
- if (!state->haveUpdate)
- state.wait(updateCV);
- draw(*state);
- state.wait_for(quitCV, std::chrono::milliseconds(50));
- }
- });
- }
-
- ~ProgressBar()
- {
- stop();
- updateThread.join();
- }
-
- void stop()
- {
- auto state(state_.lock());
- if (!state->active) return;
- state->active = false;
- std::string status = getStatus(*state);
- writeToStderr("\r\e[K");
- /*
- if (status != "")
- writeToStderr("[" + status + "]\n");
- */
- updateCV.notify_one();
- quitCV.notify_one();
- }
-
- void log(Verbosity lvl, const FormatOrString & fs) override
- {
- auto state(state_.lock());
- log(*state, lvl, fs.s);
- }
-
- void log(State & state, Verbosity lvl, const std::string & s)
- {
- if (state.active) {
- writeToStderr("\r\e[K" + filterANSIEscapes(s, !isTTY) + ANSI_NORMAL "\n");
- draw(state);
- } else {
- auto s2 = s + ANSI_NORMAL "\n";
- if (!isTTY) s2 = filterANSIEscapes(s2, true);
- writeToStderr(s2);
- }
- }
-
- void startActivity(ActivityId act, Verbosity lvl, ActivityType type,
- const std::string & s, const Fields & fields, ActivityId parent) override
- {
- auto state(state_.lock());
-
- if (lvl <= verbosity && !s.empty())
- log(*state, lvl, s + "...");
-
- state->activities.emplace_back(ActInfo());
- auto i = std::prev(state->activities.end());
- i->s = s;
- i->type = type;
- i->parent = parent;
- state->its.emplace(act, i);
- state->activitiesByType[type].its.emplace(act, i);
-
- if (type == actBuild) {
- auto name = storePathToName(getS(fields, 0));
- if (hasSuffix(name, ".drv"))
- name = name.substr(0, name.size() - 4);
- i->s = fmt("building " ANSI_BOLD "%s" ANSI_NORMAL, name);
- auto machineName = getS(fields, 1);
- if (machineName != "")
- i->s += fmt(" on " ANSI_BOLD "%s" ANSI_NORMAL, machineName);
- auto curRound = getI(fields, 2);
- auto nrRounds = getI(fields, 3);
- if (nrRounds != 1)
- i->s += fmt(" (round %d/%d)", curRound, nrRounds);
- i->name = DrvName(name).name;
- }
-
- if (type == actSubstitute) {
- auto name = storePathToName(getS(fields, 0));
- auto sub = getS(fields, 1);
- i->s = fmt(
- hasPrefix(sub, "local")
- ? "copying " ANSI_BOLD "%s" ANSI_NORMAL " from %s"
- : "fetching " ANSI_BOLD "%s" ANSI_NORMAL " from %s",
- name, sub);
- }
-
- if (type == actPostBuildHook) {
- auto name = storePathToName(getS(fields, 0));
- if (hasSuffix(name, ".drv"))
- name = name.substr(0, name.size() - 4);
- i->s = fmt("post-build " ANSI_BOLD "%s" ANSI_NORMAL, name);
- i->name = DrvName(name).name;
- }
-
- if (type == actQueryPathInfo) {
- auto name = storePathToName(getS(fields, 0));
- i->s = fmt("querying " ANSI_BOLD "%s" ANSI_NORMAL " on %s", name, getS(fields, 1));
- }
-
- if ((type == actFileTransfer && hasAncestor(*state, actCopyPath, parent))
- || (type == actFileTransfer && hasAncestor(*state, actQueryPathInfo, parent))
- || (type == actCopyPath && hasAncestor(*state, actSubstitute, parent)))
- i->visible = false;
-
- update(*state);
- }
-
- /* Check whether an activity has an ancestore with the specified
- type. */
- bool hasAncestor(State & state, ActivityType type, ActivityId act)
- {
- while (act != 0) {
- auto i = state.its.find(act);
- if (i == state.its.end()) break;
- if (i->second->type == type) return true;
- act = i->second->parent;
- }
- return false;
- }
-
- void stopActivity(ActivityId act) override
- {
- auto state(state_.lock());
-
- auto i = state->its.find(act);
- if (i != state->its.end()) {
-
- auto & actByType = state->activitiesByType[i->second->type];
- actByType.done += i->second->done;
- actByType.failed += i->second->failed;
-
- for (auto & j : i->second->expectedByType)
- state->activitiesByType[j.first].expected -= j.second;
-
- actByType.its.erase(act);
- state->activities.erase(i->second);
- state->its.erase(i);
- }
-
- update(*state);
- }
-
- void result(ActivityId act, ResultType type, const std::vector<Field> & fields) override
- {
- auto state(state_.lock());
-
- if (type == resFileLinked) {
- state->filesLinked++;
- state->bytesLinked += getI(fields, 0);
- update(*state);
- }
-
- else if (type == resBuildLogLine || type == resPostBuildLogLine) {
- auto lastLine = trim(getS(fields, 0));
- if (!lastLine.empty()) {
- auto i = state->its.find(act);
- assert(i != state->its.end());
- ActInfo info = *i->second;
- if (printBuildLogs) {
- auto suffix = "> ";
- if (type == resPostBuildLogLine) {
- suffix = " (post)> ";
- }
- log(*state, lvlInfo, ANSI_FAINT + info.name.value_or("unnamed") + suffix + ANSI_NORMAL + lastLine);
- } else {
- state->activities.erase(i->second);
- info.lastLine = lastLine;
- state->activities.emplace_back(info);
- i->second = std::prev(state->activities.end());
- update(*state);
- }
- }
- }
-
- else if (type == resUntrustedPath) {
- state->untrustedPaths++;
- update(*state);
- }
-
- else if (type == resCorruptedPath) {
- state->corruptedPaths++;
- update(*state);
- }
-
- else if (type == resSetPhase) {
- auto i = state->its.find(act);
- assert(i != state->its.end());
- i->second->phase = getS(fields, 0);
- update(*state);
- }
-
- else if (type == resProgress) {
- auto i = state->its.find(act);
- assert(i != state->its.end());
- ActInfo & actInfo = *i->second;
- actInfo.done = getI(fields, 0);
- actInfo.expected = getI(fields, 1);
- actInfo.running = getI(fields, 2);
- actInfo.failed = getI(fields, 3);
- update(*state);
- }
-
- else if (type == resSetExpected) {
- auto i = state->its.find(act);
- assert(i != state->its.end());
- ActInfo & actInfo = *i->second;
- auto type = (ActivityType) getI(fields, 0);
- auto & j = actInfo.expectedByType[type];
- state->activitiesByType[type].expected -= j;
- j = getI(fields, 1);
- state->activitiesByType[type].expected += j;
- update(*state);
- }
- }
-
- void update(State & state)
- {
- state.haveUpdate = true;
- updateCV.notify_one();
- }
-
- void draw(State & state)
- {
- state.haveUpdate = false;
- if (!state.active) return;
-
- std::string line;
-
- std::string status = getStatus(state);
- if (!status.empty()) {
- line += '[';
- line += status;
- line += "]";
- }
-
- if (!state.activities.empty()) {
- if (!status.empty()) line += " ";
- auto i = state.activities.rbegin();
-
- while (i != state.activities.rend() && (!i->visible || (i->s.empty() && i->lastLine.empty())))
- ++i;
-
- if (i != state.activities.rend()) {
- line += i->s;
- if (!i->phase.empty()) {
- line += " (";
- line += i->phase;
- line += ")";
- }
- if (!i->lastLine.empty()) {
- if (!i->s.empty()) line += ": ";
- line += i->lastLine;
- }
- }
- }
-
- auto width = getWindowSize().second;
- if (width <= 0) width = std::numeric_limits<decltype(width)>::max();
-
- writeToStderr("\r" + filterANSIEscapes(line, false, width) + "\e[K");
- }
-
- std::string getStatus(State & state)
- {
- auto MiB = 1024.0 * 1024.0;
-
- std::string res;
-
- auto renderActivity = [&](ActivityType type, const std::string & itemFmt, const std::string & numberFmt = "%d", double unit = 1) {
- auto & act = state.activitiesByType[type];
- uint64_t done = act.done, expected = act.done, running = 0, failed = act.failed;
- for (auto & j : act.its) {
- done += j.second->done;
- expected += j.second->expected;
- running += j.second->running;
- failed += j.second->failed;
- }
-
- expected = std::max(expected, act.expected);
-
- std::string s;
-
- if (running || done || expected || failed) {
- if (running)
- if (expected != 0)
- s = fmt(ANSI_BLUE + numberFmt + ANSI_NORMAL "/" ANSI_GREEN + numberFmt + ANSI_NORMAL "/" + numberFmt,
- running / unit, done / unit, expected / unit);
- else
- s = fmt(ANSI_BLUE + numberFmt + ANSI_NORMAL "/" ANSI_GREEN + numberFmt + ANSI_NORMAL,
- running / unit, done / unit);
- else if (expected != done)
- if (expected != 0)
- s = fmt(ANSI_GREEN + numberFmt + ANSI_NORMAL "/" + numberFmt,
- done / unit, expected / unit);
- else
- s = fmt(ANSI_GREEN + numberFmt + ANSI_NORMAL, done / unit);
- else
- s = fmt(done ? ANSI_GREEN + numberFmt + ANSI_NORMAL : numberFmt, done / unit);
- s = fmt(itemFmt, s);
-
- if (failed)
- s += fmt(" (" ANSI_RED "%d failed" ANSI_NORMAL ")", failed / unit);
- }
-
- return s;
- };
-
- auto showActivity = [&](ActivityType type, const std::string & itemFmt, const std::string & numberFmt = "%d", double unit = 1) {
- auto s = renderActivity(type, itemFmt, numberFmt, unit);
- if (s.empty()) return;
- if (!res.empty()) res += ", ";
- res += s;
- };
-
- showActivity(actBuilds, "%s built");
-
- auto s1 = renderActivity(actCopyPaths, "%s copied");
- auto s2 = renderActivity(actCopyPath, "%s MiB", "%.1f", MiB);
-
- if (!s1.empty() || !s2.empty()) {
- if (!res.empty()) res += ", ";
- if (s1.empty()) res += "0 copied"; else res += s1;
- if (!s2.empty()) { res += " ("; res += s2; res += ')'; }
- }
-
- showActivity(actFileTransfer, "%s MiB DL", "%.1f", MiB);
-
- {
- auto s = renderActivity(actOptimiseStore, "%s paths optimised");
- if (s != "") {
- s += fmt(", %.1f MiB / %d inodes freed", state.bytesLinked / MiB, state.filesLinked);
- if (!res.empty()) res += ", ";
- res += s;
- }
- }
-
- // 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;
- }
-
- void writeToStdout(std::string_view s) override
- {
- auto state(state_.lock());
- if (state->active) {
- std::cerr << "\r\e[K";
- Logger::writeToStdout(s);
- draw(*state);
- } else {
- Logger::writeToStdout(s);
- }
- }
-};
-
-void startProgressBar(bool printBuildLogs)
-{
- logger = new ProgressBar(
- printBuildLogs,
- isatty(STDERR_FILENO) && getEnv("TERM").value_or("dumb") != "dumb");
-}
-
-void stopProgressBar()
-{
- auto progressBar = dynamic_cast<ProgressBar *>(logger);
- if (progressBar) progressBar->stop();
-
-}
-
-}
diff --git a/src/nix/progress-bar.hh b/src/nix/progress-bar.hh
deleted file mode 100644
index 4d61175c2..000000000
--- a/src/nix/progress-bar.hh
+++ /dev/null
@@ -1,11 +0,0 @@
-#pragma once
-
-#include "logging.hh"
-
-namespace nix {
-
-void startProgressBar(bool printBuildLogs = false);
-
-void stopProgressBar();
-
-}
diff --git a/src/nix/repl.cc b/src/nix/repl.cc
index c936f9cc2..73b0ae521 100644
--- a/src/nix/repl.cc
+++ b/src/nix/repl.cc
@@ -218,12 +218,12 @@ void NixRepl::mainLoop(const std::vector<std::string> & files)
// input without clearing the input so far.
continue;
} else {
- printMsg(lvlError, format(error + "%1%%2%") % (settings.showTrace ? e.prefix() : "") % e.msg());
+ printMsg(lvlError, error + "%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg());
}
} catch (Error & e) {
- printMsg(lvlError, format(error + "%1%%2%") % (settings.showTrace ? e.prefix() : "") % e.msg());
+ printMsg(lvlError, error + "%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg());
} catch (Interrupted & e) {
- printMsg(lvlError, format(error + "%1%%2%") % (settings.showTrace ? e.prefix() : "") % e.msg());
+ printMsg(lvlError, error + "%1%%2%", (settings.showTrace ? e.prefix() : ""), e.msg());
}
// We handled the current input fully, so we should clear it
@@ -512,7 +512,7 @@ bool NixRepl::processLine(string line)
return false;
else if (command != "")
- throw Error(format("unknown command '%1%'") % command);
+ throw Error("unknown command '%1%'", command);
else {
size_t p = line.find('=');
diff --git a/src/nix/run.cc b/src/nix/run.cc
index 2ab9d9ef4..204937cbc 100644
--- a/src/nix/run.cc
+++ b/src/nix/run.cc
@@ -110,16 +110,16 @@ struct CmdShell : InstallablesCommand, RunCommon, MixEnvironment
std::unordered_set<StorePath> done;
std::queue<StorePath> todo;
- for (auto & path : outPaths) todo.push(path.clone());
+ for (auto & path : outPaths) todo.push(path);
setEnviron();
auto unixPath = tokenizeString<Strings>(getEnv("PATH").value_or(""), ":");
while (!todo.empty()) {
- auto path = todo.front().clone();
+ auto path = todo.front();
todo.pop();
- if (!done.insert(path.clone()).second) continue;
+ if (!done.insert(path).second) continue;
if (true)
unixPath.push_front(store->printStorePath(path) + "/bin");
@@ -251,10 +251,10 @@ void chrootHelper(int argc, char * * argv)
Finally freeCwd([&]() { free(cwd); });
if (chroot(tmpDir.c_str()) == -1)
- throw SysError(format("chrooting into '%s'") % tmpDir);
+ throw SysError("chrooting into '%s'", tmpDir);
if (chdir(cwd) == -1)
- throw SysError(format("chdir to '%s' in chroot") % cwd);
+ throw SysError("chdir to '%s' in chroot", cwd);
} else
if (mount(realStoreDir.c_str(), storeDir.c_str(), "", MS_BIND, 0) == -1)
throw SysError("mounting '%s' on '%s'", realStoreDir, storeDir);
diff --git a/src/nix/show-derivation.cc b/src/nix/show-derivation.cc
index 22c569f3c..2d31894c2 100644
--- a/src/nix/show-derivation.cc
+++ b/src/nix/show-derivation.cc
@@ -61,11 +61,9 @@ struct CmdShowDerivation : InstallablesCommand
for (auto & drvPath : drvPaths) {
if (!drvPath.isDerivation()) continue;
- auto drvPathS = store->printStorePath(drvPath);
+ auto drvObj(jsonRoot.object(store->printStorePath(drvPath)));
- auto drvObj(jsonRoot.object(drvPathS));
-
- auto drv = readDerivation(*store, drvPathS);
+ auto drv = store->readDerivation(drvPath);
{
auto outputsObj(drvObj.object("outputs"));
diff --git a/src/nix/upgrade-nix.cc b/src/nix/upgrade-nix.cc
index 678780f33..a880bdae0 100644
--- a/src/nix/upgrade-nix.cc
+++ b/src/nix/upgrade-nix.cc
@@ -68,7 +68,10 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand
if (dryRun) {
stopProgressBar();
- printError("would upgrade to version %s", version);
+ logWarning({
+ .name = "Version update",
+ .hint = hintfmt("would upgrade to version %s", version)
+ });
return;
}
@@ -94,7 +97,7 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand
{"--profile", profileDir, "-i", store->printStorePath(storePath), "--no-sandbox"});
}
- printError(ANSI_GREEN "upgrade to version %s done" ANSI_NORMAL, version);
+ printInfo(ANSI_GREEN "upgrade to version %s done" ANSI_NORMAL, version);
}
/* Return the profile in which Nix is installed. */
diff --git a/src/nix/verify.cc b/src/nix/verify.cc
index cf1fa6a99..ab83637dc 100644
--- a/src/nix/verify.cc
+++ b/src/nix/verify.cc
@@ -90,7 +90,7 @@ struct CmdVerify : StorePathsCommand
if (info->ca == "")
hashSink = std::make_unique<HashSink>(info->narHash.type);
else
- hashSink = std::make_unique<HashModuloSink>(info->narHash.type, storePathToHash(store->printStorePath(info->path)));
+ hashSink = std::make_unique<HashModuloSink>(info->narHash.type, std::string(info->path.hashPart()));
store->narFromPath(info->path, *hashSink);
@@ -99,11 +99,15 @@ struct CmdVerify : StorePathsCommand
if (hash.first != info->narHash) {
corrupted++;
act2.result(resCorruptedPath, store->printStorePath(info->path));
- printError(
- "path '%s' was modified! expected hash '%s', got '%s'",
- store->printStorePath(info->path), info->narHash.to_string(), hash.first.to_string());
+ logError({
+ .name = "Hash error - path modified",
+ .hint = hintfmt(
+ "path '%s' was modified! expected hash '%s', got '%s'",
+ store->printStorePath(info->path),
+ info->narHash.to_string(Base32, true),
+ hash.first.to_string(Base32, true))
+ });
}
-
}
if (!noTrust) {
@@ -139,7 +143,7 @@ struct CmdVerify : StorePathsCommand
doSigs(info2->sigs);
} catch (InvalidPath &) {
} catch (Error & e) {
- printError(format(ANSI_RED "error:" ANSI_NORMAL " %s") % e.what());
+ logError(e.info());
}
}
@@ -150,7 +154,12 @@ struct CmdVerify : StorePathsCommand
if (!good) {
untrusted++;
act2.result(resUntrustedPath, store->printStorePath(info->path));
- printError("path '%s' is untrusted", store->printStorePath(info->path));
+ logError({
+ .name = "Untrusted path",
+ .hint = hintfmt("path '%s' is untrusted",
+ store->printStorePath(info->path))
+ });
+
}
}
@@ -158,7 +167,7 @@ struct CmdVerify : StorePathsCommand
done++;
} catch (Error & e) {
- printError(format(ANSI_RED "error:" ANSI_NORMAL " %s") % e.what());
+ logError(e.info());
failed++;
}
diff --git a/src/nix/why-depends.cc b/src/nix/why-depends.cc
index f9d54e486..a208e0081 100644
--- a/src/nix/why-depends.cc
+++ b/src/nix/why-depends.cc
@@ -76,7 +76,7 @@ struct CmdWhyDepends : SourceExprCommand
auto packagePath = toStorePath(store, Build, package);
auto dependency = parseInstallable(store, _dependency);
auto dependencyPath = toStorePath(store, NoBuild, dependency);
- auto dependencyPathHash = storePathToHash(store->printStorePath(dependencyPath));
+ auto dependencyPathHash = dependencyPath.hashPart();
StorePathSet closure;
store->computeFSClosure({packagePath}, closure, false, false);
@@ -106,16 +106,16 @@ struct CmdWhyDepends : SourceExprCommand
std::map<StorePath, Node> graph;
for (auto & path : closure)
- graph.emplace(path.clone(), Node { .path = path.clone(), .refs = cloneStorePathSet(store->queryPathInfo(path)->references) });
+ graph.emplace(path, Node { .path = path, .refs = store->queryPathInfo(path)->references });
// Transpose the graph.
for (auto & node : graph)
for (auto & ref : node.second.refs)
- graph.find(ref)->second.rrefs.insert(node.first.clone());
+ graph.find(ref)->second.rrefs.insert(node.first);
/* Run Dijkstra's shortest path algorithm to get the distance
of every path in the closure to 'dependency'. */
- graph.emplace(dependencyPath.clone(), Node { .path = dependencyPath.clone(), .dist = 0 });
+ graph.emplace(dependencyPath, Node { .path = dependencyPath, .dist = 0 });
std::priority_queue<Node *> queue;
@@ -175,7 +175,7 @@ struct CmdWhyDepends : SourceExprCommand
auto & node2 = graph.at(ref);
if (node2.dist == inf) continue;
refs.emplace(node2.dist, &node2);
- hashes.insert(storePathToHash(store->printStorePath(node2.path)));
+ hashes.insert(std::string(node2.path.hashPart()));
}
/* For each reference, find the files and symlinks that
@@ -211,7 +211,7 @@ struct CmdWhyDepends : SourceExprCommand
p2,
hilite(filterPrintable(
std::string(contents, pos2, pos - pos2 + hash.size() + margin)),
- pos - pos2, storePathHashLen,
+ pos - pos2, StorePath::HashLen,
getColour(hash))));
}
}
@@ -224,7 +224,7 @@ struct CmdWhyDepends : SourceExprCommand
auto pos = target.find(hash);
if (pos != std::string::npos)
hits[hash].emplace_back(fmt("%s -> %s\n", p2,
- hilite(target, pos, storePathHashLen, getColour(hash))));
+ hilite(target, pos, StorePath::HashLen, getColour(hash))));
}
}
};
@@ -235,7 +235,7 @@ struct CmdWhyDepends : SourceExprCommand
RunPager pager;
for (auto & ref : refs) {
- auto hash = storePathToHash(store->printStorePath(ref.second->path));
+ std::string hash(ref.second->path.hashPart());
bool last = all ? ref == *refs.rbegin() : true;