aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libcmd/command.hh2
-rw-r--r--src/libcmd/installables.cc17
-rw-r--r--src/nix-store/nix-store.cc10
3 files changed, 28 insertions, 1 deletions
diff --git a/src/libcmd/command.hh b/src/libcmd/command.hh
index b6d554aab..49c7b4f9b 100644
--- a/src/libcmd/command.hh
+++ b/src/libcmd/command.hh
@@ -128,6 +128,8 @@ struct InstallablesCommand : virtual Args, SourceExprCommand
virtual bool useDefaultInstallables() { return true; }
+ bool readFromStdIn;
+
std::vector<std::string> getFlakesForCompletion() override;
protected:
diff --git a/src/libcmd/installables.cc b/src/libcmd/installables.cc
index 90f001902..7d444aac0 100644
--- a/src/libcmd/installables.cc
+++ b/src/libcmd/installables.cc
@@ -694,6 +694,13 @@ StorePathSet Installable::toDerivations(
InstallablesCommand::InstallablesCommand()
{
+
+ addFlag({
+ .longName = "stdin",
+ .description = "Read installables from the standard input.",
+ .handler = {&readFromStdIn, true}
+ });
+
expectArgs({
.label = "installables",
.handler = {&_installables},
@@ -710,10 +717,18 @@ void InstallablesCommand::prepare()
Installables InstallablesCommand::load()
{
- if (_installables.empty() && useDefaultInstallables())
+ if (_installables.empty() && useDefaultInstallables() && !readFromStdIn)
// FIXME: commands like "nix profile install" should not have a
// default, probably.
_installables.push_back(".");
+
+ if (readFromStdIn && !isatty(STDIN_FILENO)) {
+ std::string word;
+ while (std::cin >> word) {
+ _installables.emplace_back(std::move(word));
+ }
+ }
+
return parseInstallables(getStore(), _installables);
}
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index 3bbefedbe..d4218550a 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -1020,6 +1020,7 @@ static int main_nix_store(int argc, char * * argv)
{
Strings opFlags, opArgs;
Operation op = 0;
+ bool readFromStdIn;
parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) {
Operation oldOp = op;
@@ -1078,6 +1079,8 @@ static int main_nix_store(int argc, char * * argv)
op = opGenerateBinaryCacheKey;
else if (*arg == "--add-root")
gcRoot = absPath(getArg(*arg, arg, end));
+ else if (*arg == "--stdin" && !isatty(STDIN_FILENO))
+ readFromStdIn = true;
else if (*arg == "--indirect")
;
else if (*arg == "--no-output")
@@ -1090,6 +1093,13 @@ static int main_nix_store(int argc, char * * argv)
else
opArgs.push_back(*arg);
+ if (readFromStdIn && op != opImport && op != opRestore && op != opServe) {
+ std::string word;
+ while (std::cin >> word) {
+ opArgs.emplace_back(std::move(word));
+ };
+ }
+
if (oldOp && oldOp != op)
throw UsageError("only one operation may be specified");