From 6519f06f397448c3f1677e87e385012e2507164b Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 6 May 2015 14:54:31 +0200 Subject: [PATCH] nix-env/nix-instantiate/nix-build: Support URIs For instance, you can install Firefox from a specific Nixpkgs revision like this: $ nix-env -f https://github.com/NixOS/nixpkgs/archive/63def04891a0abc328b1b0b3a78ec02c58f48583.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 --- src/libexpr/common-opts.cc | 7 +++++-- src/libexpr/download.cc | 9 +++++++++ src/libexpr/download.hh | 2 ++ src/libexpr/parser.y | 9 --------- src/nix-instantiate/nix-instantiate.cc | 6 +++--- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/libexpr/common-opts.cc b/src/libexpr/common-opts.cc index c03d720bd..13760490d 100644 --- a/src/libexpr/common-opts.cc +++ b/src/libexpr/common-opts.cc @@ -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 diff --git a/src/libexpr/download.cc b/src/libexpr/download.cc index e3c6c505c..18ab6fbcd 100644 --- a/src/libexpr/download.cc +++ b/src/libexpr/download.cc @@ -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"; +} + + } diff --git a/src/libexpr/download.hh b/src/libexpr/download.hh index 36fa183d6..28c9117e4 100644 --- a/src/libexpr/download.hh +++ b/src/libexpr/download.hh @@ -17,4 +17,6 @@ Path downloadFileCached(const string & url, bool unpack); MakeError(DownloadError, Error) +bool isUri(const string & s); + } diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index e3f2f09b2..26168b2ed 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -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('='); diff --git a/src/nix-instantiate/nix-instantiate.cc b/src/nix-instantiate/nix-instantiate.cc index 973a34ec1..bea04180e 100644 --- a/src/nix-instantiate/nix-instantiate.cc +++ b/src/nix-instantiate/nix-instantiate.cc @@ -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); }