nix-env/nix-instantiate/nix-build: Support URIs

For instance, you can install Firefox from a specific Nixpkgs revision
like this:

  $ nix-env -f 63def04891.tar.gz -iA firefox

Or build a package from the latest nixpkgs-unstable channel:

  $ nix-build https://nixos.org/channels/nixpkgs-unstable/nixexprs.tar.xz -A hello
This commit is contained in:
Eelco Dolstra 2015-05-06 14:54:31 +02:00
parent 0705d04dfa
commit 6519f06f39
5 changed files with 19 additions and 14 deletions

View file

@ -1,5 +1,6 @@
#include "common-opts.hh"
#include "../libmain/shared.hh"
#include "shared.hh"
#include "download.hh"
#include "util.hh"
@ -53,7 +54,9 @@ bool parseSearchPathArg(Strings::iterator & i,
Path lookupFileArg(EvalState & state, string s)
{
if (s.size() > 2 && s.at(0) == '<' && s.at(s.size() - 1) == '>') {
if (isUri(s))
return downloadFileCached(s, true);
else if (s.size() > 2 && s.at(0) == '<' && s.at(s.size() - 1) == '>') {
Path p = s.substr(1, s.size() - 2);
return state.findFile(p);
} else

View file

@ -223,4 +223,13 @@ Path downloadFileCached(const string & url, bool unpack)
}
bool isUri(const string & s)
{
size_t pos = s.find("://");
if (pos == string::npos) return false;
string scheme(s, 0, pos);
return scheme == "http" || scheme == "https";
}
}

View file

@ -17,4 +17,6 @@ Path downloadFileCached(const string & url, bool unpack);
MakeError(DownloadError, Error)
bool isUri(const string & s);
}

View file

@ -601,15 +601,6 @@ Expr * EvalState::parseExprFromString(const string & s, const Path & basePath)
}
bool isUri(const string & s)
{
size_t pos = s.find("://");
if (pos == string::npos) return false;
string scheme(s, 0, pos);
return scheme == "http" || scheme == "https";
}
void EvalState::addToSearchPath(const string & s, bool warn)
{
size_t pos = s.find('=');

View file

@ -183,10 +183,10 @@ int main(int argc, char * * argv)
} else if (files.empty() && !fromArgs)
files.push_back("./default.nix");
foreach (Strings::iterator, i, files) {
for (auto & i : files) {
Expr * e = fromArgs
? state.parseExprFromString(*i, absPath("."))
: state.parseExprFromFile(resolveExprPath(lookupFileArg(state, *i)));
? state.parseExprFromString(i, absPath("."))
: state.parseExprFromFile(resolveExprPath(lookupFileArg(state, i)));
processExpr(state, attrPaths, parseOnly, strict, autoArgs,
evalOnly, outputKind, xmlOutputSourceLocation, e);
}