styx.sh -> styx.nim

This commit is contained in:
Daylin Morgan 2024-01-26 15:27:13 -06:00
parent 96cc3224f0
commit e78e4a6fd1
Signed by: daylin
GPG key ID: C1E52E7DD81DF79F
6 changed files with 165 additions and 4 deletions

View file

@ -14,10 +14,9 @@ in rec {
buildStyx = _: buildStyx = _:
forAllSystems ( forAllSystems (
pkgs: let pkgs: let
name = baseNameOf ../styx; pkg = pkgs.callPackage ../styx {};
pkg = pkgs.writeScriptBin name (readFile ../styx/styx.sh);
in { in {
${name} = pkg; styx = pkg;
default = pkg; default = pkg;
} }
); );

View file

@ -2,7 +2,7 @@
nimble = prev.nimble.overrideNimAttrs { nimble = prev.nimble.overrideNimAttrs {
version = "0.14.2-f74bf2"; version = "0.14.2-f74bf2";
requiredNimVersion = 2; requiredNimVersion = 2;
buildInputs = [ prev.pkgs.openssl ]; buildInputs = [prev.pkgs.openssl];
src = prev.fetchFromGitHub { src = prev.fetchFromGitHub {
owner = "nim-lang"; owner = "nim-lang";

11
styx/default.nix Normal file
View file

@ -0,0 +1,11 @@
{
lib,
buildNimPackage,
fetchFromGitHub,
}:
buildNimPackage (final: prev: {
pname = "styx";
version = "2023.1001";
src = ./.;
lockFile = ./lock.json;
})

1
styx/lock.json Normal file
View file

@ -0,0 +1 @@
{"depends":[{"method":"fetchzip","packages":["cligen"],"path":"/nix/store/b5dgqx2wds42kw2241qv7rmdf29hwl20-source","ref":"1.6.18","rev":"c54e2f3ea09d405a0d1b9bd8e7c0472d657d1193","sha256":"0ms572f6563bc2cr65gnh943adld5xbd6jy2w7gwvybxpczkxlf3","srcDir":"","url":"https://github.com/c-blake/cligen/archive/c54e2f3ea09d405a0d1b9bd8e7c0472d657d1193.tar.gz"}]}

136
styx/styx.nim Normal file
View file

@ -0,0 +1,136 @@
import std/[logging, os, osproc, tables, times]
from std/nativesockets import getHostname
var logger = newConsoleLogger()
addHandler(logger)
let summaryFile = getEnv("GITHUB_STEP_SUMMARY")
type
StyxContext = object
flake, host: string
cache = "daylin"
nom: bool = true
proc newCtx(): StyxContext =
result = StyxContext()
result.flake = getEnv("FLAKE_PATH", getEnv("HOME") / "nixcfg")
result.host = getHostname()
proc systemFlakePath(c: StyxContext): string =
c.flake & "#nixosConfigurations." & c.host & ".config.system.build.toplevel"
proc execQuit(cmd: string) =
quit (execCmd cmd)
proc build(c: StyxContext) =
## build nixos
let
cmd = if c.nom: "nom" else: "nix"
execQuit cmd & " build " & c.systemFlakePath
proc dry(c: StyxContext) =
## poor man's nix flake check
execQuit "nix build " & c.systemFlakePath & " --dry-run"
proc cache(c: StyxContext) =
# Simple benchmarking
let start = cpuTime()
let code = execCmd """
cachix watch-exec """ & c.cache & """ \
-- \
nix build """ & c.systemFlakePath & """ \
--print-build-logs \
--accept-flake-config
"""
let duration = (cpuTime() - start)
if code != 0:
error "faile to build configuration for: ", c.host
if summaryFile != "":
writeFile(
summaryFile,
"Built host: " & c.host & " in " & $duration & " seconds"
)
info "Built host: " & c.host & " in " & $duration & " seconds"
proc nixosRebuild(c: StyxContext, cmd: string) =
execQuit "sudo nixos-rebuild " & cmd & " " & " --flake " & c.flake
proc boot(c: StyxContext) =
## nixos rebuild boot
nixosRebuild c, "build"
proc switch(c: StyxContext) =
## nixos rebuild switch
nixosRebuild c, "swith"
# proc matchCmd(cmd: string): proc =
# case cmd:
# of "dry": dry
# of "switch": switch
# of "boot": boot
# of "cache": cache
# of "build": build
# else:
# error "unknown command", cmd
# quit 1
#
proc runCmd(c: StyxContext, cmd: string) =
case cmd:
of "dry": dry c
of "switch": switch c
of "boot": boot c
of "cache": cache c
of "build": build c
else:
error "unknown command: ", cmd
quit 1
const usage = """
styx <cmd> [opts]
commands:
dry poor man's nix flake check
boot nixos-rebuild boot
switch nixos-rebuild switch
cache build and push to cachix
build build system flake
options:
-?|--help > show this help
-h|--host > hostname (current host)
-f|--flake > path to flake ($FLAKE_PATH or $HOME/styx)
-c|--cache > name of cachix binary cache (daylin)
"""
proc parseFlag(c: var StyxContext, key, val: string) =
case key:
of "help":
echo usage; quit 0
of "h","host":
c.host = val
of "f","flake":
c.flake = val
of "no-nom":
c.nom = false
when isMainModule:
import std/parseopt
var
c = newCtx()
cmd: string
for kind, key, val in getopt():
case kind
of cmdArgument:
cmd = key
of cmdLongOption, cmdShortOption:
parseFlag c, key, val
of cmdEnd:
discard
info $c
runCmd c, cmd

14
styx/styx.nimble Normal file
View file

@ -0,0 +1,14 @@
# Package
author = "Daylin Morgan"
version = "2023.1001"
description = "styx"
license = "MIT"
srcDir = "."
bin = @["styx"]
# Dependencies
requires "nim >= 2.0.0"
requires "cligen"