aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
authorNick Van den Broeck <nick.van.den.broeck666@gmail.com>2019-03-10 07:05:05 +0100
committerNick Van den Broeck <nick.van.den.broeck666@gmail.com>2019-03-22 15:22:18 +0100
commit5e4d92d267c080bcb81168e37429bbb56bc39fb2 (patch)
treeb784a1643d392a88d7f98f964e55827e19751584 /src/libexpr
parente007f367bd605ad14ddf84d1d5ad611aa427d338 (diff)
Issue #15 is finished
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/primops/flake.cc13
-rw-r--r--src/libexpr/primops/flake.hh5
-rw-r--r--src/libexpr/primops/flakeref.cc15
-rw-r--r--src/libexpr/primops/flakeref.hh3
4 files changed, 31 insertions, 5 deletions
diff --git a/src/libexpr/primops/flake.cc b/src/libexpr/primops/flake.cc
index 48a036875..b74e0b4b7 100644
--- a/src/libexpr/primops/flake.cc
+++ b/src/libexpr/primops/flake.cc
@@ -12,9 +12,14 @@
namespace nix {
+Path getUserRegistryPath()
+{
+ return getHome() + "/.config/nix/registry.json";
+}
+
/* Read the registry or a lock file. (Currently they have an identical
format. */
-static std::unique_ptr<FlakeRegistry> readRegistry(const Path & path)
+std::unique_ptr<FlakeRegistry> readRegistry(const Path & path)
{
auto registry = std::make_unique<FlakeRegistry>();
@@ -40,7 +45,7 @@ void writeRegistry(FlakeRegistry registry, Path path)
json["version"] = 1;
json["flakes"] = {};
for (auto elem : registry.entries) {
- json["flakes"][elem.first] = elem.second.ref.to_string();
+ json["flakes"][elem.first] = { {"uri", elem.second.ref.to_string()} };
}
writeFile(path, json.dump(4)); // The '4' is the number of spaces used in the indentation in the json file.
}
@@ -183,8 +188,8 @@ Flake getFlake(EvalState & state, const FlakeRef & flakeRef)
if (std::get_if<FlakeRef::IsGitHub>(&newFlakeRef.data)) {
FlakeSourceInfo srcInfo = fetchFlake(state, newFlakeRef);
if (srcInfo.rev) {
- std::string uri = flakeRef.to_string();
- newFlakeRef = FlakeRef(uri + "/" + srcInfo.rev->to_string());
+ std::string uri = flakeRef.baseRef().to_string();
+ newFlakeRef = FlakeRef(uri + "/" + srcInfo.rev->to_string(Base16, false));
}
}
diff --git a/src/libexpr/primops/flake.hh b/src/libexpr/primops/flake.hh
index b3a755311..4e49becc7 100644
--- a/src/libexpr/primops/flake.hh
+++ b/src/libexpr/primops/flake.hh
@@ -14,14 +14,19 @@ struct FlakeRegistry
{
FlakeRef ref;
Entry(const FlakeRef & flakeRef) : ref(flakeRef) {};
+ Entry operator=(const Entry & entry) { return Entry(entry.ref); }
};
std::map<FlakeId, Entry> entries;
};
+Path getUserRegistryPath();
+
Value * makeFlakeRegistryValue(EvalState & state);
Value * makeFlakeValue(EvalState & state, std::string flakeUri, Value & v);
+std::unique_ptr<FlakeRegistry> readRegistry(const Path &);
+
void writeRegistry(FlakeRegistry, Path);
struct Flake
diff --git a/src/libexpr/primops/flakeref.cc b/src/libexpr/primops/flakeref.cc
index a2700f102..8e7c1f8df 100644
--- a/src/libexpr/primops/flakeref.cc
+++ b/src/libexpr/primops/flakeref.cc
@@ -152,4 +152,19 @@ bool FlakeRef::isImmutable() const
else abort();
}
+FlakeRef FlakeRef::baseRef() const // Removes the ref and rev from a FlakeRef.
+{
+ FlakeRef result(*this);
+ if (auto refData = std::get_if<FlakeRef::IsGitHub>(&result.data)) {
+ refData->ref = std::nullopt;
+ refData->rev = std::nullopt;
+ } else if (auto refData = std::get_if<FlakeRef::IsGit>(&result.data)) {
+ refData->ref = std::nullopt;
+ refData->rev = std::nullopt;
+ } else if (auto refData = std::get_if<FlakeRef::IsGit>(&result.data)) {
+ refData->ref = std::nullopt;
+ refData->rev = std::nullopt;
+ }
+ return result;
+}
}
diff --git a/src/libexpr/primops/flakeref.hh b/src/libexpr/primops/flakeref.hh
index 4d1756b49..fb365e101 100644
--- a/src/libexpr/primops/flakeref.hh
+++ b/src/libexpr/primops/flakeref.hh
@@ -153,6 +153,7 @@ struct FlakeRef
/* Check whether this is an "immutable" flake reference, that is,
one that contains a commit hash or content hash. */
bool isImmutable() const;
-};
+ FlakeRef baseRef() const;
+};
}