2020-03-30 15:03:28 +03:00
|
|
|
#include "registry.hh"
|
|
|
|
#include "fetchers.hh"
|
2020-01-21 17:27:53 +02:00
|
|
|
#include "util.hh"
|
|
|
|
#include "globals.hh"
|
2020-03-18 15:08:25 +02:00
|
|
|
#include "store-api.hh"
|
2020-10-09 23:18:08 +03:00
|
|
|
#include "local-fs-store.hh"
|
2020-01-21 17:27:53 +02:00
|
|
|
|
2022-03-01 03:29:34 +02:00
|
|
|
#include "fetch-settings.hh"
|
|
|
|
|
2020-01-21 17:27:53 +02:00
|
|
|
#include <nlohmann/json.hpp>
|
|
|
|
|
|
|
|
namespace nix::fetchers {
|
|
|
|
|
|
|
|
std::shared_ptr<Registry> Registry::read(
|
|
|
|
const Path & path, RegistryType type)
|
|
|
|
{
|
2020-01-22 21:00:58 +02:00
|
|
|
auto registry = std::make_shared<Registry>(type);
|
2020-01-21 17:27:53 +02:00
|
|
|
|
|
|
|
if (!pathExists(path))
|
2020-01-22 21:00:58 +02:00
|
|
|
return std::make_shared<Registry>(type);
|
2020-01-21 17:27:53 +02:00
|
|
|
|
2020-04-02 20:09:17 +03:00
|
|
|
try {
|
2020-01-21 17:27:53 +02:00
|
|
|
|
2020-04-02 20:09:17 +03:00
|
|
|
auto json = nlohmann::json::parse(readFile(path));
|
2020-01-21 17:27:53 +02:00
|
|
|
|
2020-04-02 20:09:17 +03:00
|
|
|
auto version = json.value("version", 0);
|
|
|
|
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
if (version == 2) {
|
2020-04-02 20:09:17 +03:00
|
|
|
for (auto & i : json["flakes"]) {
|
|
|
|
auto toAttrs = jsonToAttrs(i["to"]);
|
|
|
|
Attrs extraAttrs;
|
|
|
|
auto j = toAttrs.find("dir");
|
|
|
|
if (j != toAttrs.end()) {
|
|
|
|
extraAttrs.insert(*j);
|
|
|
|
toAttrs.erase(j);
|
|
|
|
}
|
|
|
|
auto exact = i.find("exact");
|
|
|
|
registry->entries.push_back(
|
|
|
|
Entry {
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
.from = Input::fromAttrs(jsonToAttrs(i["from"])),
|
|
|
|
.to = Input::fromAttrs(std::move(toAttrs)),
|
2020-04-02 20:09:17 +03:00
|
|
|
.extraAttrs = extraAttrs,
|
|
|
|
.exact = exact != i.end() && exact.value()
|
|
|
|
});
|
2020-02-20 23:14:44 +02:00
|
|
|
}
|
|
|
|
}
|
2020-01-21 17:27:53 +02:00
|
|
|
|
2020-04-02 20:09:17 +03:00
|
|
|
else
|
|
|
|
throw Error("flake registry '%s' has unsupported version %d", path, version);
|
2020-02-06 15:27:31 +02:00
|
|
|
|
2020-04-02 20:09:17 +03:00
|
|
|
} catch (nlohmann::json::exception & e) {
|
|
|
|
warn("cannot parse flake registry '%s': %s", path, e.what());
|
2020-04-14 18:25:39 +03:00
|
|
|
} catch (Error & e) {
|
|
|
|
warn("cannot read flake registry '%s': %s", path, e.what());
|
2020-04-02 20:09:17 +03:00
|
|
|
}
|
2020-02-06 15:27:31 +02:00
|
|
|
|
2020-01-21 17:27:53 +02:00
|
|
|
return registry;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Registry::write(const Path & path)
|
|
|
|
{
|
2020-02-06 15:27:31 +02:00
|
|
|
nlohmann::json arr;
|
2020-04-02 00:03:27 +03:00
|
|
|
for (auto & entry : entries) {
|
2020-02-06 15:27:31 +02:00
|
|
|
nlohmann::json obj;
|
2020-10-28 16:41:18 +02:00
|
|
|
obj["from"] = attrsToJSON(entry.from.toAttrs());
|
|
|
|
obj["to"] = attrsToJSON(entry.to.toAttrs());
|
2020-04-02 00:03:27 +03:00
|
|
|
if (!entry.extraAttrs.empty())
|
2020-10-28 16:41:18 +02:00
|
|
|
obj["to"].update(attrsToJSON(entry.extraAttrs));
|
2020-04-02 00:12:45 +03:00
|
|
|
if (entry.exact)
|
|
|
|
obj["exact"] = true;
|
2020-02-06 15:27:31 +02:00
|
|
|
arr.emplace_back(std::move(obj));
|
|
|
|
}
|
|
|
|
|
2020-01-21 17:27:53 +02:00
|
|
|
nlohmann::json json;
|
2020-02-06 15:27:31 +02:00
|
|
|
json["version"] = 2;
|
|
|
|
json["flakes"] = std::move(arr);
|
|
|
|
|
2020-01-21 17:27:53 +02:00
|
|
|
createDirs(dirOf(path));
|
2020-02-06 15:27:31 +02:00
|
|
|
writeFile(path, json.dump(2));
|
2020-01-21 17:27:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void Registry::add(
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
const Input & from,
|
|
|
|
const Input & to,
|
2020-03-17 21:54:36 +02:00
|
|
|
const Attrs & extraAttrs)
|
2020-01-21 17:27:53 +02:00
|
|
|
{
|
2020-04-02 00:03:27 +03:00
|
|
|
entries.emplace_back(
|
|
|
|
Entry {
|
|
|
|
.from = from,
|
|
|
|
.to = to,
|
|
|
|
.extraAttrs = extraAttrs
|
|
|
|
});
|
2020-01-21 17:27:53 +02:00
|
|
|
}
|
|
|
|
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
void Registry::remove(const Input & input)
|
2020-01-21 17:27:53 +02:00
|
|
|
{
|
|
|
|
// FIXME: use C++20 std::erase.
|
|
|
|
for (auto i = entries.begin(); i != entries.end(); )
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
if (i->from == input)
|
2020-01-21 17:27:53 +02:00
|
|
|
i = entries.erase(i);
|
|
|
|
else
|
|
|
|
++i;
|
|
|
|
}
|
|
|
|
|
2020-04-01 23:56:50 +03:00
|
|
|
static Path getSystemRegistryPath()
|
|
|
|
{
|
|
|
|
return settings.nixConfDir + "/registry.json";
|
|
|
|
}
|
|
|
|
|
|
|
|
static std::shared_ptr<Registry> getSystemRegistry()
|
|
|
|
{
|
|
|
|
static auto systemRegistry =
|
|
|
|
Registry::read(getSystemRegistryPath(), Registry::System);
|
|
|
|
return systemRegistry;
|
|
|
|
}
|
|
|
|
|
2020-01-21 17:27:53 +02:00
|
|
|
Path getUserRegistryPath()
|
|
|
|
{
|
2021-03-17 23:56:57 +02:00
|
|
|
return getConfigDir() + "/nix/registry.json";
|
2020-01-21 17:27:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
std::shared_ptr<Registry> getUserRegistry()
|
|
|
|
{
|
2020-04-01 23:56:50 +03:00
|
|
|
static auto userRegistry =
|
|
|
|
Registry::read(getUserRegistryPath(), Registry::User);
|
|
|
|
return userRegistry;
|
2020-01-21 17:27:53 +02:00
|
|
|
}
|
|
|
|
|
2021-07-07 11:02:55 +03:00
|
|
|
std::shared_ptr<Registry> getCustomRegistry(const Path & p)
|
2021-06-30 22:14:41 +03:00
|
|
|
{
|
|
|
|
static auto customRegistry =
|
|
|
|
Registry::read(p, Registry::Custom);
|
|
|
|
return customRegistry;
|
|
|
|
}
|
|
|
|
|
2020-01-22 21:00:58 +02:00
|
|
|
static std::shared_ptr<Registry> flagRegistry =
|
|
|
|
std::make_shared<Registry>(Registry::Flag);
|
|
|
|
|
|
|
|
std::shared_ptr<Registry> getFlagRegistry()
|
2020-01-21 17:27:53 +02:00
|
|
|
{
|
|
|
|
return flagRegistry;
|
|
|
|
}
|
2020-01-22 21:00:58 +02:00
|
|
|
|
|
|
|
void overrideRegistry(
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
const Input & from,
|
|
|
|
const Input & to,
|
2020-03-17 21:54:36 +02:00
|
|
|
const Attrs & extraAttrs)
|
2020-01-22 21:00:58 +02:00
|
|
|
{
|
2020-02-20 23:14:44 +02:00
|
|
|
flagRegistry->add(from, to, extraAttrs);
|
2020-01-22 21:00:58 +02:00
|
|
|
}
|
2020-01-21 17:27:53 +02:00
|
|
|
|
|
|
|
static std::shared_ptr<Registry> getGlobalRegistry(ref<Store> store)
|
|
|
|
{
|
|
|
|
static auto reg = [&]() {
|
2022-03-01 03:29:34 +02:00
|
|
|
auto path = fetchSettings.flakeRegistry.get();
|
2020-01-21 17:27:53 +02:00
|
|
|
|
2020-03-19 12:45:34 +02:00
|
|
|
if (!hasPrefix(path, "/")) {
|
2020-09-29 14:05:19 +03:00
|
|
|
auto storePath = downloadFile(store, path, "flake-registry.json", false).storePath;
|
2020-03-19 12:45:34 +02:00
|
|
|
if (auto store2 = store.dynamic_pointer_cast<LocalFSStore>())
|
2020-09-03 12:26:36 +03:00
|
|
|
store2->addPermRoot(storePath, getCacheDir() + "/nix/flake-registry.json");
|
2020-03-19 12:45:34 +02:00
|
|
|
path = store->toRealPath(storePath);
|
|
|
|
}
|
2020-01-21 17:27:53 +02:00
|
|
|
|
|
|
|
return Registry::read(path, Registry::Global);
|
|
|
|
}();
|
|
|
|
|
|
|
|
return reg;
|
|
|
|
}
|
|
|
|
|
|
|
|
Registries getRegistries(ref<Store> store)
|
|
|
|
{
|
|
|
|
Registries registries;
|
2020-01-22 21:00:58 +02:00
|
|
|
registries.push_back(getFlagRegistry());
|
2020-01-21 17:27:53 +02:00
|
|
|
registries.push_back(getUserRegistry());
|
2020-04-01 23:56:50 +03:00
|
|
|
registries.push_back(getSystemRegistry());
|
2020-01-21 17:27:53 +02:00
|
|
|
registries.push_back(getGlobalRegistry(store));
|
|
|
|
return registries;
|
|
|
|
}
|
|
|
|
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
std::pair<Input, Attrs> lookupInRegistries(
|
2020-01-21 17:27:53 +02:00
|
|
|
ref<Store> store,
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
const Input & _input)
|
2020-01-21 17:27:53 +02:00
|
|
|
{
|
2020-03-17 21:54:36 +02:00
|
|
|
Attrs extraAttrs;
|
2020-01-21 17:27:53 +02:00
|
|
|
int n = 0;
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
Input input(_input);
|
2020-01-21 17:27:53 +02:00
|
|
|
|
|
|
|
restart:
|
|
|
|
|
|
|
|
n++;
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
if (n > 100) throw Error("cycle detected in flake registry for '%s'", input.to_string());
|
2020-01-21 17:27:53 +02:00
|
|
|
|
|
|
|
for (auto & registry : getRegistries(store)) {
|
|
|
|
// FIXME: O(n)
|
|
|
|
for (auto & entry : registry->entries) {
|
2020-04-02 00:12:45 +03:00
|
|
|
if (entry.exact) {
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
if (entry.from == input) {
|
2020-04-02 00:12:45 +03:00
|
|
|
input = entry.to;
|
|
|
|
extraAttrs = entry.extraAttrs;
|
|
|
|
goto restart;
|
|
|
|
}
|
|
|
|
} else {
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
if (entry.from.contains(input)) {
|
|
|
|
input = entry.to.applyOverrides(
|
|
|
|
!entry.from.getRef() && input.getRef() ? input.getRef() : std::optional<std::string>(),
|
|
|
|
!entry.from.getRev() && input.getRev() ? input.getRev() : std::optional<Hash>());
|
2020-04-02 00:12:45 +03:00
|
|
|
extraAttrs = entry.extraAttrs;
|
|
|
|
goto restart;
|
|
|
|
}
|
2020-01-21 17:27:53 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Remove TreeInfo
The attributes previously stored in TreeInfo (narHash, revCount,
lastModified) are now stored in Input. This makes it less arbitrary
what attributes are stored where.
As a result, the lock file format has changed. An entry like
"info": {
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github"
},
is now stored as
"locked": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be",
"type": "github",
"lastModified": 1585405475,
"narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE="
},
The 'Input' class is now a dumb set of attributes. All the fetcher
implementations subclass InputScheme, not Input. This simplifies the
API.
Also, fix substitution of flake inputs. This was broken since lazy
flake fetching started using fetchTree internally.
2020-05-30 01:44:11 +03:00
|
|
|
if (!input.isDirect())
|
|
|
|
throw Error("cannot find flake '%s' in the flake registries", input.to_string());
|
2020-01-21 17:27:53 +02:00
|
|
|
|
2020-07-01 21:23:39 +03:00
|
|
|
debug("looked up '%s' -> '%s'", _input.to_string(), input.to_string());
|
|
|
|
|
2020-02-20 23:14:44 +02:00
|
|
|
return {input, extraAttrs};
|
2020-01-21 17:27:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|