aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-04-14 16:27:48 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-04-14 17:26:57 +0200
commitc045630522b8c5d7b3804c6cb0173c16eb1a6d33 (patch)
tree69c3cd7e0c9b9bda1ac19f76c533a41ae3661021
parent363f37d0843d87e03bd4dcb600ce04e7be60d7e1 (diff)
Support channel:<channel-name> URIs
For convenience, you can now say $ nix-env -f channel:nixos-16.03 -iA hello instead of $ nix-env -f https://nixos.org/channels/nixos-16.03/nixexprs.tar.xz -iA hello Similarly, $ nix-shell -I channel:nixpkgs-unstable -p hello $ nix-build channel:nixos-15.09 -A hello Abstracting over the NixOS/Nixpkgs channels location also allows us to use a more efficient transport (e.g. Git) in the future.
-rw-r--r--src/libstore/download.cc19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/libstore/download.cc b/src/libstore/download.cc
index c34fa4ab8..7277751b4 100644
--- a/src/libstore/download.cc
+++ b/src/libstore/download.cc
@@ -18,6 +18,14 @@ double getTime()
return tv.tv_sec + (tv.tv_usec / 1000000.0);
}
+std::string resolveUri(const std::string & uri)
+{
+ if (uri.compare(0, 8, "channel:") == 0)
+ return "https://nixos.org/channels/" + std::string(uri, 8) + "/nixexprs.tar.xz";
+ else
+ return uri;
+}
+
struct CurlDownloader : public Downloader
{
CURL * curl;
@@ -197,7 +205,7 @@ struct CurlDownloader : public Downloader
DownloadResult download(string url, const DownloadOptions & options) override
{
DownloadResult res;
- if (fetch(url, options)) {
+ if (fetch(resolveUri(url), options)) {
res.cached = false;
res.data = data;
} else
@@ -207,15 +215,15 @@ struct CurlDownloader : public Downloader
}
};
-
ref<Downloader> makeDownloader()
{
return make_ref<CurlDownloader>();
}
-
-Path Downloader::downloadCached(ref<Store> store, const string & url, bool unpack)
+Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpack)
{
+ auto url = resolveUri(url_);
+
Path cacheDir = getEnv("XDG_CACHE_HOME", getEnv("HOME", "") + "/.cache") + "/nix/tarballs";
createDirs(cacheDir);
@@ -300,10 +308,11 @@ Path Downloader::downloadCached(ref<Store> store, const string & url, bool unpac
bool isUri(const string & s)
{
+ if (s.compare(0, 8, "channel:") == 0) return true;
size_t pos = s.find("://");
if (pos == string::npos) return false;
string scheme(s, 0, pos);
- return scheme == "http" || scheme == "https" || scheme == "file";
+ return scheme == "http" || scheme == "https" || scheme == "file" || scheme == "channel";
}