diff options
Diffstat (limited to 'src/libexpr/flake/lockfile.hh')
-rw-r--r-- | src/libexpr/flake/lockfile.hh | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/libexpr/flake/lockfile.hh b/src/libexpr/flake/lockfile.hh new file mode 100644 index 000000000..7077db3cd --- /dev/null +++ b/src/libexpr/flake/lockfile.hh @@ -0,0 +1,116 @@ +#pragma once + +#include "flakeref.hh" + +#include <nlohmann/json.hpp> + +namespace nix { +class Store; +} + +namespace nix::flake { + +/* Common lock file information about a flake input, namely the + immutable ref and the NAR hash. */ +struct AbstractInput +{ + FlakeRef ref; + Hash narHash; + + AbstractInput(const FlakeRef & flakeRef, const Hash & narHash) + : ref(flakeRef), narHash(narHash) + { + assert(ref.isImmutable()); + }; + + AbstractInput(const nlohmann::json & json); + + nlohmann::json toJson() const; + + Path computeStorePath(Store & store) const; +}; + +/* Lock file information about a non-flake input. */ +struct NonFlakeInput : AbstractInput +{ + using AbstractInput::AbstractInput; + + bool operator ==(const NonFlakeInput & other) const + { + return ref == other.ref && narHash == other.narHash; + } +}; + +struct FlakeInput; + +/* Lock file information about the dependencies of a flake. */ +struct FlakeInputs +{ + std::map<FlakeRef, FlakeInput> flakeInputs; + std::map<FlakeAlias, NonFlakeInput> nonFlakeInputs; + + FlakeInputs() {}; + FlakeInputs(const nlohmann::json & json); + + nlohmann::json toJson() const; + + /* A lock file is dirty if it contains a dirty flakeref + (i.e. reference to a dirty working tree). */ + bool isDirty() const; +}; + +/* Lock file information about a flake input. */ +struct FlakeInput : FlakeInputs, AbstractInput +{ + FlakeId id; + + FlakeInput(const FlakeId & id, const FlakeRef & flakeRef, const Hash & narHash) + : AbstractInput(flakeRef, narHash), id(id) {}; + + FlakeInput(const nlohmann::json & json); + + bool operator ==(const FlakeInput & other) const + { + return + id == other.id + && ref == other.ref + && narHash == other.narHash + && flakeInputs == other.flakeInputs + && nonFlakeInputs == other.nonFlakeInputs; + } + + nlohmann::json toJson() const; +}; + +/* An entire lock file. Note that this cannot be a FlakeInput for the + top-level flake, because then the lock file would need to contain + the hash of the top-level flake, but committing the lock file + would invalidate that hash. */ +struct LockFile : FlakeInputs +{ + bool operator ==(const LockFile & other) const + { + return + flakeInputs == other.flakeInputs + && nonFlakeInputs == other.nonFlakeInputs; + } + + LockFile() {} + LockFile(const nlohmann::json & json) : FlakeInputs(json) {} + LockFile(FlakeInput && dep) + { + flakeInputs = std::move(dep.flakeInputs); + nonFlakeInputs = std::move(dep.nonFlakeInputs); + } + + nlohmann::json toJson() const; + + static LockFile read(const Path & path); + + void write(const Path & path) const; +}; + +std::ostream & operator <<(std::ostream & stream, const LockFile & lockFile); + +} + |