aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/flake/lockfile.hh
blob: c34939ebc5c57ef51a777804c9d5e4f9893b16a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#pragma once

#include "flakeref.hh"

#include <nlohmann/json_fwd.hpp>

namespace nix {
class Store;
struct StorePath;
}

namespace nix::flake {

using namespace fetchers;

typedef std::vector<FlakeId> InputPath;

/* A node in the lock file. It has outgoing edges to other nodes (its
   inputs). Only the root node has this type; all other nodes have
   type LockedNode. */
struct Node : std::enable_shared_from_this<Node>
{
    std::map<FlakeId, std::shared_ptr<Node>> inputs;

    virtual ~Node() { }

    std::shared_ptr<Node> findInput(const InputPath & path);
};

/* A non-root node in the lock file. */
struct LockedNode : Node
{
    FlakeRef lockedRef, originalRef;
    TreeInfo info;
    bool isFlake = true;

    LockedNode(
        const FlakeRef & lockedRef,
        const FlakeRef & originalRef,
        const TreeInfo & info,
        bool isFlake = true)
        : lockedRef(lockedRef), originalRef(originalRef), info(info), isFlake(isFlake)
    { }

    LockedNode(const nlohmann::json & json);

    StorePath computeStorePath(Store & store) const;
};

struct LockFile
{
    std::shared_ptr<Node> root = std::make_shared<Node>();

    LockFile() {};
    LockFile(const nlohmann::json & json, const Path & path);

    nlohmann::json toJson() const;

    std::string to_string() const;

    static LockFile read(const Path & path);

    void write(const Path & path) const;

    bool isImmutable() const;

    bool operator ==(const LockFile & other) const;
};

std::ostream & operator <<(std::ostream & stream, const LockFile & lockFile);

InputPath parseInputPath(std::string_view s);

std::string diffLockFiles(const LockFile & oldLocks, const LockFile & newLocks);

}