aboutsummaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
authorFranck Cuny <franck@fcuny.net>2024-01-21 13:11:33 -0800
committerFranck Cuny <franck@fcuny.net>2024-01-21 13:12:44 -0800
commitb5ee47e701259575f22745f920fb4e7013eb0412 (patch)
tree870b9800907a01187d1b0407a18b646c00c90199 /pkg
parentinstall some go related programs (diff)
downloadinfra-b5ee47e701259575f22745f920fb4e7013eb0412.tar.gz
initial version of the flake-info command
A tool to display information about a flake. For now we shows all the inputs and when they were updated last.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/flake/lock/main.go93
1 files changed, 93 insertions, 0 deletions
diff --git a/pkg/flake/lock/main.go b/pkg/flake/lock/main.go
new file mode 100644
index 0000000..0fa21f4
--- /dev/null
+++ b/pkg/flake/lock/main.go
@@ -0,0 +1,93 @@
+package lock
+
+import (
+ "encoding/json"
+ "fmt"
+ "os"
+)
+
+type FlakeLock struct {
+ // Version of the lock file
+ Version int
+ // Root is the root node for the flake, containing all the inputs
+ Root RootNode
+ // Nodes represent all the inputs node for a flake
+ Nodes map[string]Node
+}
+
+type Node struct {
+ // Flake indicate whether the input is a flake
+ Flake bool `json:"flake"`
+ // Locked represent the locked attribute of the input
+ Locked repoLocked `json:"locked"`
+ // Original represent the user supplied attributes for the input
+ Original repoOriginal `json:"original"`
+}
+
+type repoLocked struct {
+ // LastModified represent the timestamp of when the input was updated last
+ LastModified int64 `json:"lastModified"`
+ // NarHash is the NAR hash for the input
+ NarHash string `json:"narHash"`
+ // Owner of the repository
+ Owner string `json:"owner"`
+ // Repository of the input
+ Repo string `json:"repo"`
+ // Revision of the input
+ Rev string `json:"rev"`
+ // Type of input
+ Type string `json:"type"`
+}
+
+type repoOriginal struct {
+ Owner string `json:"owner"`
+ Ref string `json:"ref"`
+ Repo string `json:"repo"`
+ Type string `json:"type"`
+}
+
+// RootNode is a mapping of input
+type RootNode struct {
+ // Inputs contains the mapping of input
+ Inputs map[string]string `json:"inputs"`
+}
+
+// New return a representation of a flake lock
+func New(flakeLockPath string) (*FlakeLock, error) {
+ content, err := os.ReadFile(flakeLockPath)
+ if err != nil {
+ return nil, fmt.Errorf("failed to read %s: %v", flakeLockPath, err)
+ }
+
+ var lock struct {
+ Version int `json:"version"`
+ Root string `json:"root"`
+ Nodes map[string]json.RawMessage `json:"nodes"`
+ }
+
+ if err := json.Unmarshal(content, &lock); err != nil {
+ return nil, fmt.Errorf("failed to parse %s: %v", flakeLockPath, err)
+ }
+
+ var flakeLock FlakeLock
+ flakeLock.Version = lock.Version
+ flakeLock.Nodes = map[string]Node{}
+
+ for nodeName, node := range lock.Nodes {
+ if nodeName != lock.Root {
+ var n Node
+ if err := json.Unmarshal(node, &n); err != nil {
+ return nil, fmt.Errorf("failed to read node %s: %v", nodeName, err)
+ }
+ flakeLock.Nodes[nodeName] = n
+ } else {
+ var r RootNode
+ if err := json.Unmarshal(node, &r); err != nil {
+ return nil, fmt.Errorf("failed to read the root node: %v", err)
+ }
+ flakeLock.Root = r
+ }
+ }
+
+ return &flakeLock, nil
+}