Compare commits

...

6 commits

Author SHA1 Message Date
e1799718b9 flake.lock: Update
Flake lock file updates:

• Updated input 'hyprland':
    'git+https://github.com/hyprwm/Hyprland/?ref=refs/heads/main&rev=155d44016d0cb11332c454db73d59030cdbd7b13' (2024-09-10)
  → 'git+https://github.com/hyprwm/Hyprland/?ref=refs/heads/main&rev=8b9e385943d1a9fd0f8c6070fa1eae507ae26145' (2024-09-11)
• Updated input 'hyprland/aquamarine':
    'github:hyprwm/aquamarine/f8a687dd29ff019657498f1bd14da2fbbf0e604b' (2024-09-01)
  → 'github:hyprwm/aquamarine/e4a13203112a036fc7f437d391c7810f3dd5ab52' (2024-09-07)
• Updated input 'hyprland/hyprlang':
    'github:hyprwm/hyprlang/c12ab785ce1982f82594aff03b3104c598186ddd' (2024-09-01)
  → 'github:hyprwm/hyprlang/dfeb5811dd6485490cce18d6cc1e38a055eea876' (2024-09-10)
• Updated input 'hyprland/nixpkgs':
    'github:NixOS/nixpkgs/12228ff1752d7b7624a54e9c1af4b222b3c1073b' (2024-08-31)
  → 'github:NixOS/nixpkgs/1355a0cbfeac61d785b7183c0caaec1f97361b43' (2024-09-10)
• Updated input 'hyprland/xdph':
    'github:hyprwm/xdg-desktop-portal-hyprland/11e15b437e7efc39e452f36e15a183225d6bfa39' (2024-09-01)
  → 'github:hyprwm/xdg-desktop-portal-hyprland/e695669fd8e1d1be9eaae40f35e00f8bd8b64c18' (2024-09-11)
• Updated input 'lix':
    'cc183fdbc1.tar.gz?narHash=sha256-tiQ9OxiuTb/02xEU2ceo9MIxWBS5Rm/IAhv6QshH8K0%3D&rev=cc183fdbc14ce105a5661d646983f791978b9d5c' (2024-09-10)
  → '24db81eaf2.tar.gz?narHash=sha256-tB4Y3Rrv67ZdEo3HJzxYL5XX9wqtvWwIX1z8k399W0s%3D&rev=24db81eaf28259ab8f8334ccd6368673a26ed422' (2024-09-11)
• Updated input 'nixpkgs':
    'github:nixos/nixpkgs/574d1eac1c200690e27b8eb4e24887f8df7ac27c' (2024-09-06)
  → 'github:nixos/nixpkgs/1355a0cbfeac61d785b7183c0caaec1f97361b43' (2024-09-10)
• Updated input 'nixpkgs-wayland':
    'github:nix-community/nixpkgs-wayland/90046312d6c074e7b941b7ea9c4e54f4d416e5da' (2024-09-10)
  → 'github:nix-community/nixpkgs-wayland/5d6271a06b79364aa838cdc68c5852d383b17236' (2024-09-11)
• Updated input 'nixpkgs-wayland/nixpkgs':
    'github:nixos/nixpkgs/574d1eac1c200690e27b8eb4e24887f8df7ac27c' (2024-09-06)
  → 'github:nixos/nixpkgs/1355a0cbfeac61d785b7183c0caaec1f97361b43' (2024-09-10)
• Updated input 'roc':
    'github:roc-lang/roc/2936a37a1c54cb4cb10003c3b7e43a4772bbccf9' (2024-09-10)
  → 'github:roc-lang/roc/3d9c4673af25349be43e0e8e703a0f4b36176577' (2024-09-10)
2024-09-11 18:05:34 +00:00
6d2146a4f3
llm.withPlugins was removed 2024-09-11 13:02:53 -05:00
ea8099e184
fix hosts handling 2024-09-11 10:52:35 -05:00
a559ac1c79
rework overlays handling 2024-09-11 10:51:20 -05:00
b66236553f
use wip chronos nimlangserver 2024-09-10 14:13:00 -05:00
c450271582
cli: add support for GHA based update action 2024-09-10 11:38:45 -05:00
18 changed files with 545 additions and 139 deletions

View file

@ -20,11 +20,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1725199881, "lastModified": 1725753098,
"narHash": "sha256-jsmipf/u1GFZE5tBUkr56CHMN6VpUWCAjfLIhvQijU0=", "narHash": "sha256-/NO/h/qD/eJXAQr/fHA4mdDgYsNT9thHQ+oT6KPi2ac=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "aquamarine", "repo": "aquamarine",
"rev": "f8a687dd29ff019657498f1bd14da2fbbf0e604b", "rev": "e4a13203112a036fc7f437d391c7810f3dd5ab52",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -323,11 +323,11 @@
"xdph": "xdph" "xdph": "xdph"
}, },
"locked": { "locked": {
"lastModified": 1725976150, "lastModified": 1726071051,
"narHash": "sha256-Dv4XEWRcVFZhBDbj11/zuuXyf7TGHFVU1IGH9W/yPX8=", "narHash": "sha256-eZPhLQ8DM8AsP+zM1KmUzxWQaiTpOUbFS1xeOyjgwvg=",
"ref": "refs/heads/main", "ref": "refs/heads/main",
"rev": "155d44016d0cb11332c454db73d59030cdbd7b13", "rev": "8b9e385943d1a9fd0f8c6070fa1eae507ae26145",
"revCount": 5209, "revCount": 5213,
"submodules": true, "submodules": true,
"type": "git", "type": "git",
"url": "https://github.com/hyprwm/Hyprland/" "url": "https://github.com/hyprwm/Hyprland/"
@ -399,11 +399,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1725188252, "lastModified": 1725997860,
"narHash": "sha256-yBH8c4GDaEAtBrh+BqIlrx5vp6gG/Gu8fQQK63KAQgs=", "narHash": "sha256-d/rZ/fHR5l1n7PeyLw0StWMNLXVU9c4HFyfskw568so=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "hyprlang", "repo": "hyprlang",
"rev": "c12ab785ce1982f82594aff03b3104c598186ddd", "rev": "dfeb5811dd6485490cce18d6cc1e38a055eea876",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -504,11 +504,11 @@
"lix": { "lix": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1725927421, "lastModified": 1726016547,
"narHash": "sha256-tiQ9OxiuTb/02xEU2ceo9MIxWBS5Rm/IAhv6QshH8K0=", "narHash": "sha256-tB4Y3Rrv67ZdEo3HJzxYL5XX9wqtvWwIX1z8k399W0s=",
"rev": "cc183fdbc14ce105a5661d646983f791978b9d5c", "rev": "24db81eaf28259ab8f8334ccd6368673a26ed422",
"type": "tarball", "type": "tarball",
"url": "https://git.lix.systems/api/v1/repos/lix-project/lix/archive/cc183fdbc14ce105a5661d646983f791978b9d5c.tar.gz?rev=cc183fdbc14ce105a5661d646983f791978b9d5c" "url": "https://git.lix.systems/api/v1/repos/lix-project/lix/archive/24db81eaf28259ab8f8334ccd6368673a26ed422.tar.gz?rev=24db81eaf28259ab8f8334ccd6368673a26ed422"
}, },
"original": { "original": {
"type": "tarball", "type": "tarball",
@ -707,11 +707,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1725103162, "lastModified": 1725983898,
"narHash": "sha256-Ym04C5+qovuQDYL/rKWSR+WESseQBbNAe5DsXNx5trY=", "narHash": "sha256-4b3A9zPpxAxLnkF9MawJNHDtOOl6ruL0r6Og1TEDGCE=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "12228ff1752d7b7624a54e9c1af4b222b3c1073b", "rev": "1355a0cbfeac61d785b7183c0caaec1f97361b43",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -744,11 +744,11 @@
"nixpkgs": "nixpkgs_6" "nixpkgs": "nixpkgs_6"
}, },
"locked": { "locked": {
"lastModified": 1725981791, "lastModified": 1726058240,
"narHash": "sha256-+4dwaoIrnubM29MK8BW4S2mdKwdlCF1svtO0hQ443X0=", "narHash": "sha256-p74soeV48Sry7+wOxDJ8Gqx3JT26lH9AY4+slpJemyw=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixpkgs-wayland", "repo": "nixpkgs-wayland",
"rev": "90046312d6c074e7b941b7ea9c4e54f4d416e5da", "rev": "5d6271a06b79364aa838cdc68c5852d383b17236",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -791,11 +791,11 @@
}, },
"nixpkgs_4": { "nixpkgs_4": {
"locked": { "locked": {
"lastModified": 1725634671, "lastModified": 1725983898,
"narHash": "sha256-v3rIhsJBOMLR8e/RNWxr828tB+WywYIoajrZKFM+0Gg=", "narHash": "sha256-4b3A9zPpxAxLnkF9MawJNHDtOOl6ruL0r6Og1TEDGCE=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "574d1eac1c200690e27b8eb4e24887f8df7ac27c", "rev": "1355a0cbfeac61d785b7183c0caaec1f97361b43",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -823,11 +823,11 @@
}, },
"nixpkgs_6": { "nixpkgs_6": {
"locked": { "locked": {
"lastModified": 1725634671, "lastModified": 1725983898,
"narHash": "sha256-v3rIhsJBOMLR8e/RNWxr828tB+WywYIoajrZKFM+0Gg=", "narHash": "sha256-4b3A9zPpxAxLnkF9MawJNHDtOOl6ruL0r6Og1TEDGCE=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "574d1eac1c200690e27b8eb4e24887f8df7ac27c", "rev": "1355a0cbfeac61d785b7183c0caaec1f97361b43",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -900,11 +900,11 @@
"rust-overlay": "rust-overlay" "rust-overlay": "rust-overlay"
}, },
"locked": { "locked": {
"lastModified": 1725957803, "lastModified": 1726002278,
"narHash": "sha256-qBG8DEmc9aOLr/WBtsuOB5QKEDxK2bDy4dq3X686xdo=", "narHash": "sha256-INEUQt5tQkmQtHv+//9+FGFOet2IEJPg/31y8qtsCqs=",
"owner": "roc-lang", "owner": "roc-lang",
"repo": "roc", "repo": "roc",
"rev": "2936a37a1c54cb4cb10003c3b7e43a4772bbccf9", "rev": "3d9c4673af25349be43e0e8e703a0f4b36176577",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -1162,11 +1162,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1725228143, "lastModified": 1726046979,
"narHash": "sha256-kbSiPA5oXiz1+1eVoRslMi5wylHD6SDT8dS9eZAxXAM=", "narHash": "sha256-6SEsjurq9cdTkITA6d49ncAJe4O/8CgRG5/F//s6Xh8=",
"owner": "hyprwm", "owner": "hyprwm",
"repo": "xdg-desktop-portal-hyprland", "repo": "xdg-desktop-portal-hyprland",
"rev": "11e15b437e7efc39e452f36e15a183225d6bfa39", "rev": "e695669fd8e1d1be9eaae40f35e00f8bd8b64c18",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -3,23 +3,21 @@ let
lib = nixpkgs.lib.extend (import ./extended.nix inputs); lib = nixpkgs.lib.extend (import ./extended.nix inputs);
inherit (builtins) mapAttrs readDir listToAttrs; inherit (builtins) mapAttrs readDir listToAttrs;
inherit (lib) genAttrs pkgFromSystem pkgsFromSystem; inherit (lib) genAttrs pkgFromSystem pkgsFromSystem loadOverlays;
inherit (import ./find-modules.nix { inherit lib; }) findModulesList; inherit (import ./find-modules.nix { inherit lib; }) findModulesList;
inherit (import ./generators.nix { inherit lib self inputs; }) mkIso mkSystem; inherit (import ./generators.nix { inherit lib self inputs; }) mkIso mkSystem;
#supportedSystems = ["x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin"]; #supportedSystems = ["x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin"];
supportedSystems = [ "x86_64-linux" ]; supportedSystems = [ "x86_64-linux" ];
forAllSystems = forAllSystems =
f: fn:
genAttrs supportedSystems ( genAttrs supportedSystems (
system: system:
f ( fn (
import nixpkgs { import nixpkgs {
inherit system; inherit system;
overlays = [ overlays = (import ../overlays { inherit inputs loadOverlays; });
inputs.nim2nix.overlays.default
(import ../overlays/nimble { inherit inputs; })
];
} }
) )
); );
@ -42,6 +40,7 @@ let
default = oizys-nim; default = oizys-nim;
oizys-nim = pkgs.callPackage ../pkgs/oizys-nim { }; oizys-nim = pkgs.callPackage ../pkgs/oizys-nim { };
oizys-go = pkgs.callPackage ../pkgs/oizys { }; oizys-go = pkgs.callPackage ../pkgs/oizys { };
nimlangserver = pkgs.callPackage ../pkgs/nimlangserver { };
iso = mkIso.config.system.build.isoImage; iso = mkIso.config.system.build.isoImage;
roc = (pkgsFromSystem pkgs.system "roc").full; roc = (pkgsFromSystem pkgs.system "roc").full;
} }
@ -61,13 +60,13 @@ let
]; ];
}; };
}); });
checks = forAllSystems ( # checks = forAllSystems (
pkgs: # pkgs:
import ./checks.nix { # import ./checks.nix {
inherit inputs lib self; # inherit inputs lib self;
system = pkgs.system; # system = pkgs.system;
} # }
); # );
formatter = forAllSystems (pkgs: pkgs.nixfmt-rfc-style); formatter = forAllSystems (pkgs: pkgs.nixfmt-rfc-style);
}; };
in in

View file

@ -3,8 +3,11 @@ let
inherit (builtins) inherit (builtins)
listToAttrs listToAttrs
substring substring
filter
replaceStrings replaceStrings
map
filter
attrNames
readDir
; ;
inherit (final) inherit (final)
concatStringsSep concatStringsSep
@ -106,6 +109,12 @@ let
pkg = pkgFromSystem system; pkg = pkgFromSystem system;
}; };
loadOverlays =
inputs: dir: readDir dir
|> attrNames
|> filter (f: f != "default.nix")
|> map (f: import (../overlays + "/${f}") { inherit inputs; });
in in
{ {
inherit inherit
@ -125,5 +134,6 @@ in
overlayFrom overlayFrom
flakeFromSystem flakeFromSystem
listify listify
loadOverlays
; ;
} }

View file

@ -49,7 +49,6 @@ let
nixosSystem { nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
modules = [ modules = [
../overlays
../modules/oizys.nix ../modules/oizys.nix
inputs.lix-module.nixosModules.default inputs.lix-module.nixosModules.default
inputs.hyprland.nixosModules.default inputs.hyprland.nixosModules.default

View file

@ -7,15 +7,16 @@
let let
inherit (lib) mkIfIn; inherit (lib) mkIfIn;
cfg = config.oizys.languages; cfg = config.oizys.languages;
nimlangserver = pkgs.callPackage ../../pkgs/nimlangserver { };
in in
{ {
config = mkIfIn "nim" cfg { config = mkIfIn "nim" cfg {
environment.systemPackages = with pkgs; [ environment.systemPackages =
with pkgs;
[
nim nim
nim-atlas
nimble nimble
nimlangserver ]
]; ++ [ nimlangserver ];
}; };
} }

View file

@ -10,15 +10,14 @@ let
inherit (pkgs) python3Packages; inherit (pkgs) python3Packages;
# llm-ollama = python3Packages.callPackage ./llm-plugins/llm-ollama { }; # llm-ollama = python3Packages.callPackage ./llm-plugins/llm-ollama { };
llm-claude3 = python3Packages.callPackage ./llm-plugins/llm-claude-3 { }; llm-claude3 = python3Packages.callPackage ./llm-plugins/llm-claude-3 { };
llm = (
pkgs.llm.withPlugins [
# llm-ollama
llm-claude3
]
);
in in
mkOizysModule config "llm" { mkOizysModule config "llm" {
# services.ollama = enabled; # services.ollama = enabled;
environment.systemPackages = [ llm ]; environment.systemPackages = with pkgs; [
(python3.withPackages (ps: [
ps.llm
llm-claude3
]))
];
} }

View file

@ -1,11 +1,12 @@
{ {
inputs,
lib, lib,
self, self,
hostName, hostName,
... ...
}: }:
let let
inherit (lib) mkEnableOption mkOption; inherit (lib) mkEnableOption mkOption loadOverlays;
in in
{ {
imports = with self.nixosModules; [ imports = with self.nixosModules; [
@ -54,5 +55,6 @@ in
config = { config = {
networking.hostName = hostName; networking.hostName = hostName;
time.timeZone = "US/Central"; time.timeZone = "US/Central";
nixpkgs.overlays = import ../overlays { inherit inputs loadOverlays; };
}; };
} }

View file

@ -1,30 +1,11 @@
{ inputs, ... }: { inputs, loadOverlays }:
let (loadOverlays inputs ./.)
inherit (builtins) ++ [
map inputs.nim2nix.overlays.default # adds buildNimPackage
filter
attrNames
readDir
;
# execute and import all overlay files in the current
# directory with the given args
# overlays =
# map
# (f: (import (./. + "/${f}") { inherit inputs; }))
# (filter (f: f != "default.nix") (attrNames (readDir ./.)));
overlays =
readDir ./.
|> attrNames
|> filter (f: f != "default.nix")
|> map (f: import (./. + "/${f}") { inherit inputs; });
in
{
nixpkgs.overlays = overlays ++ [
(final: _prev: { (final: _prev: {
stable = import inputs.stable { stable = import inputs.stable {
system = final.system; system = final.system;
config.allowUnfree = true; config.allowUnfree = true;
}; };
}) })
]; ]
}

View file

@ -1,12 +0,0 @@
{ ... }:
(final: prev: {
nim-atlas = prev.nim-atlas.overrideNimAttrs {
version = "unstable";
src = final.fetchFromGitHub {
owner = "nim-lang";
repo = "atlas";
rev = "cbba9fa77fa837931bf3c58e20c1f8cb15a22919";
hash = "sha256-TsZ8TriVuKEY9/mV6KR89eFOgYrgTqXmyv/vKu362GU=";
};
};
})

View file

@ -0,0 +1,15 @@
{ fetchFromGitHub, buildNimPackage }:
buildNimPackage{
pname = "nimlangserver";
version = "unstable";
src = fetchFromGitHub {
owner = "daylinmorgan";
repo = "langserver";
rev = "26b333d0c8d62ba947a9ce9fbd59a7a77766872c";
# rev = "v${version}";
hash = "sha256-XFgA0yOfE34+bZxBgOdoK+5CWhxvppzl8QSQx1TTPpQ=";
};
doCheck = false;
lockFile = ./lock.json;
}

View file

@ -0,0 +1,242 @@
{
"depends": [
{
"method": "git",
"path": "/nix/store/jvk4kr8wws3dbjqnlag2zcysg0d7xnhz-nim-chronos-c04576d",
"rev": "c04576d829b8a0a1b12baaa8bc92037501b3a4a0",
"sha256": "0plwammxi4iis59p2416g7420f5fx38jziwhmi082c5lm2x658x9",
"srcDir": "",
"url": "https://github.com/status-im/nim-chronos",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"chronos"
]
},
{
"method": "git",
"path": "/nix/store/rxh6hjns335dl5zn13dl78hlj6ign33m-nim-http-utils-8b88ad6",
"rev": "8b88ad6dd9a6326c29f82067800c483d9410d873",
"sha256": "1c20yhzm7c69xkcdzxwbm8ldid565nrmvgr5jk3g6cghh6z9b63n",
"srcDir": "",
"url": "https://github.com/status-im/nim-http-utils",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"httputils"
]
},
{
"method": "git",
"path": "/nix/store/ngj2jlgi2ygv3xvnqvhlpws2s069fh6c-nim-stint-7c81df9",
"rev": "7c81df9adc80088f46a4c2b8bf2a46c26fab057c",
"sha256": "0gl8hxk3a29p5f2l3x5v3hscbydnwy8470bl9xjsawysbpa41jq0",
"srcDir": "",
"url": "https://github.com/status-im/nim-stint",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"stint"
]
},
{
"method": "git",
"path": "/nix/store/fvqlv9l67gdbvdq48w76y7dm48s52viw-nim-unittest2-e96f321",
"rev": "e96f3215030cbfa13abc2f5827069b6f8ba87e38",
"sha256": "0q919mswsspk3fdhb9a742y7yv0pk14yc965afx2jza57m4fw2a2",
"srcDir": "",
"url": "https://github.com/status-im/nim-unittest2",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"unittest2"
]
},
{
"method": "git",
"path": "/nix/store/ggzfksc7mbfllfdr2va5rmyx757c7nfx-nim-websock-63bcc29",
"rev": "63bcc2902d884c63101e144555ad99421734a70a",
"sha256": "0rxdz62pns7ywwzh4r1pjj9qyhx7djj06y5yhf83j7dc30qi7wp2",
"srcDir": "",
"url": "https://github.com/status-im/nim-websock",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"websock"
]
},
{
"method": "git",
"path": "/nix/store/4q5lil0j6wdxjbkk4nbwnvz0swhxph4v-nim-serialization-298a955",
"rev": "298a9554a885b2df59737bb3461aac8d0d339724",
"sha256": "1skh778gkml33n0pz7s8fxybdn2rqg2hg10nyp8jip9x6rbpgz6g",
"srcDir": "",
"url": "https://github.com/status-im/nim-serialization",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"serialization"
]
},
{
"method": "git",
"path": "/nix/store/1k3vziq26ynmmm9j9savsfm8d7glmrax-nim-stew-d4634c5",
"rev": "d4634c5405ac188e7050d348332edb6c3b09a527",
"sha256": "15ii11644vxs55jix64krg8h0ninnhlgqnc7klmskycbcr4a1xgh",
"srcDir": "",
"url": "https://github.com/status-im/nim-stew",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"stew"
]
},
{
"method": "git",
"path": "/nix/store/3x156nly2vr6nixgw1zk5jp5n6bgi6rk-nim-faststreams-dbc4a95",
"rev": "dbc4a95df60238157dcf286f6125188cb72f37c1",
"sha256": "1zvh1lgjmszdd074993qkj01w2v7fjxcawjf7iplwq0rvjpszdy0",
"srcDir": "",
"url": "https://github.com/status-im/nim-faststreams",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"faststreams"
]
},
{
"method": "git",
"path": "/nix/store/7k5blrxbh2zzsxrmz54l5i6v6dj4mp3g-with-91c51ec",
"rev": "91c51ec1051bf0cb518cf9bb78114e2a84b03da7",
"sha256": "170hfdc2z2qp9cxgvpqswzr4bmzljybh4lnn0k5kganwvf0ffz9p",
"srcDir": "",
"url": "https://github.com/zevv/with",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"with"
]
},
{
"method": "git",
"path": "/nix/store/jw9y4cm15y80h3v9xjz5s1r0rnyi5x4i-nim-testutils-e4fb95c",
"rev": "e4fb95cbe36ad1e231661c922da04b81e0ffeed9",
"sha256": "0gqhag91f8dkdv0v2mg6pz5q6afl70bbnk628i52p4wsi4bl49jj",
"srcDir": "",
"url": "https://github.com/status-im/nim-testutils",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"testutils"
]
},
{
"method": "git",
"path": "/nix/store/sskmpq7fqax2x2wydb1lhyac4ikx5p6p-nim-results-57b2392",
"rev": "57b2392ad69849e3e2d02b74a8a0feee2c3d9570",
"sha256": "1wma3dhrrdfxn05ds6yiv9mj071czv90x06bm7f5rslzk0s7m1af",
"srcDir": "",
"url": "https://github.com/arnetheduck/nim-results",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"results"
]
},
{
"method": "git",
"path": "/nix/store/06gaz1ks9rc13bxr7wkig4sfiz0mb3xw-nim-json-rpc-e27c10a",
"rev": "e27c10ad4172e67f71a78044f53de073e7401390",
"sha256": "16f1lz2c6pzyjwmnqxxzl3sf635kzvzggmk2gl7mqifz4v31wjbq",
"srcDir": "",
"url": "https://github.com/status-im/nim-json-rpc",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"json_rpc"
]
},
{
"method": "git",
"path": "/nix/store/narxn874mr56chm56iya8zdmnadvg61d-nimcrypto-71bca15",
"rev": "71bca15508e2c0548f32b42a69bcfb1ccd9ab9ff",
"sha256": "0iizdwgxdrfa94572874dr5d3q2g9j6yk33xzywci7ig3w58rm82",
"srcDir": "",
"url": "https://github.com/cheatfate/nimcrypto",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"nimcrypto"
]
},
{
"method": "git",
"path": "/nix/store/mki47dpj9mi8wa7gwhp3n0q6z9lhn1mv-nim-bearssl-667b404",
"rev": "667b40440a53a58e9f922e29e20818720c62d9ac",
"sha256": "0a4mf9g7p7zdhlzzfl9iikmhkyl7w5kf2mrn0bv4w4n30sl98m4s",
"srcDir": "",
"url": "https://github.com/status-im/nim-bearssl",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"bearssl"
]
},
{
"method": "git",
"path": "/nix/store/cfs80kvd9s3np81i5bfr0pvhsv046vxm-nim-json-serialization-8a4ed98",
"rev": "8a4ed98bbd0a9479df15af2fa31da38a586ea6d5",
"sha256": "1r6acznzdyd3r5ixfhxbcqsrm6iqcyvrg5i93pzna1q4h9mgmf5f",
"srcDir": "",
"url": "https://github.com/status-im/nim-json-serialization",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"json_serialization"
]
},
{
"method": "git",
"path": "/nix/store/vnxrmzlkma85rsf82abcr81ywrgr5dya-nim-chronicles-32ac867",
"rev": "32ac8679680ea699f7dbc046e8e0131cac97d41a",
"sha256": "0w3ya0rpy0rp997nnfakq0cshpk4vyva195mmgrw5c9zp4pwv2hm",
"srcDir": "",
"url": "https://github.com/status-im/nim-chronicles",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"chronicles"
]
},
{
"method": "git",
"path": "/nix/store/ngqb4fpv1yi4zn5x7sn3p3yvxmmbn2z1-nim-zlib-45b06fc",
"rev": "45b06fca15ce0f09586067d950da30c10227865a",
"sha256": "1gcvl59j7yj698sl4l35drq0cmvy2zsywgi7b0dv9ci3klss4cxb",
"srcDir": "",
"url": "https://github.com/status-im/nim-zlib",
"subDir": "",
"fetchSubmodules": true,
"leaveDotGit": false,
"packages": [
"zlib"
]
}
]
}

View file

@ -1,5 +1,5 @@
## nix begat oizys ## nix begat oizys
import std/[os, tables, sequtils, strformat,] import std/[os, tables, sequtils, strformat,strutils]
import cligen, bbansi import cligen, bbansi
import oizys/[context, github, nix, overlay, logging] import oizys/[context, github, nix, overlay, logging]
@ -13,6 +13,17 @@ addHandler(
) )
) )
proc confirm(q: string): bool =
stderr.write $(q & bb"[yellow] (Y/n) ")
while true:
let ans = readLine(stdin)
case ans.strip().toLowerAscii():
of "y","yes": return true
of "n","no": return false
else:
stderr.write($bb("[red]Please answer Yes/no\nexpected one of [b]Y,yes,N,no "))
stderr.write "\n"
overlay: overlay:
proc pre( proc pre(
flake: string = "", flake: string = "",
@ -32,9 +43,20 @@ overlay:
## output ## output
echo nixosConfigAttrs().join(" ") echo nixosConfigAttrs().join(" ")
proc update(yes: bool = false) = proc update(
## *TBI* update and run nixos-rebuild yes: bool = false,
fatal "not implemented" preview: bool = false
) =
## update and run nixos-rebuild
let hosts = getHosts()
if hosts.len > 1: fatalQuit "operation only supports one host"
let run = getLastUpdateRun()
echo fmt"run created at: {run.created_at}"
echo "nvd diff:\n", getUpdateSummary(run.id, hosts[0])
if preview: quit 0
if yes or confirm("Proceed with system update?"):
updateRepo()
nixosRebuild("switch")
proc build(minimal: bool = false) = proc build(minimal: bool = false) =
## nix build ## nix build

View file

@ -1,11 +1,11 @@
import std/[logging, os, strformat, strutils] import std/[logging, os, strformat, strutils]
from std/nativesockets import getHostname from std/nativesockets import getHostname
import bbansi
import ./logging import ./logging
type type
OizysContext* = object OizysContext* = object
flake, host: string flake: string
hosts: seq[string] hosts: seq[string]
debug: bool debug: bool
ci: bool ci: bool
@ -37,15 +37,16 @@ proc updateContext*(
debug: bool, debug: bool,
resetCache: bool resetCache: bool
) = ) =
oc.debug = debug
oc.resetCache = resetCache
if host.len > 0: if host.len > 0:
oc.hosts = host oc.hosts = host
oc.debug = debug
oc.resetCache = resetCache
if flake != "": if flake != "":
oc.flake = oc.flake =
if flake.startsWith("github") or flake.startsWith("git+"): flake if flake.startsWith("github") or flake.startsWith("git+"): flake
else: checkPath(flake.normalizedPath().absolutePath()) else: checkPath(flake.normalizedPath().absolutePath())
debug oc
debug bb(fmt"""[b]flake[/]: {oc.flake}, [b]hosts[/]: {oc.hosts.join(" ")}""")
proc getHosts*(): seq[string] = return oc.hosts proc getHosts*(): seq[string] = return oc.hosts
proc getFlake*(): string = return oc.flake proc getFlake*(): string = return oc.flake

View file

@ -23,7 +23,7 @@ type
proc runCmdCapt*( proc runCmdCapt*(
cmd: string, cmd: string,
capture: set[CaptureGrp], capture: set[CaptureGrp] = {CaptStdout},
): tuple[stdout, stderr: string, exitCode: int] = ): tuple[stdout, stderr: string, exitCode: int] =
debug fmt"running cmd: {cmd}" debug fmt"running cmd: {cmd}"
let args = cmd.splitWhitespace() let args = cmd.splitWhitespace()

View file

@ -1,21 +1,43 @@
import std/[httpclient,logging, os, strformat, strutils, json] import std/[httpclient,logging, os, strformat, strutils, json, tables, tempfiles]
import ./logging import jsony, bbansi, zippy/ziparchives
import ./[logging, exec, context]
# localPassC is used by zippy but the additional
# module mangling on nixos somehow breaks localPassC
when defined(amd64) and (defined(gcc) or defined(clang)):
{.passC: "-msse4.1 -mpclmul".}
template withTmpDir(body: untyped): untyped =
let tmpDir {.inject.} = createTempDir("oizys","")
body
removeDir(tmpDir)
var ghToken = getEnv("GITHUB_TOKEN") var ghToken = getEnv("GITHUB_TOKEN")
proc checkToken() {.inline.} = proc checkToken() {.inline.} =
if ghToken == "": fatalQuit "GITHUB_TOKEN not set" if ghToken == "": fatalQuit "GITHUB_TOKEN not set"
#[curl -L \ proc ghClient(
-X POST \ maxRedirects = 5
-H "Accept: application/vnd.github+json" \ ): HttpClient =
-H "Authorization: Bearer <YOUR-TOKEN>" \ checkToken()
-H "X-GitHub-Api-Version: 2022-11-28" \ result = newHttpClient(maxRedirects = maxRedirects)
https://api.github.com/repos/OWNER/REPO/actions/workflows/WORKFLOW_ID/dispatches \ result.headers = newHttpHeaders({
-d '{"ref":"topic-branch","inputs":{"name":"Mona the Octocat","home":"San Francisco, CA"}}' "Accept" : "application/vnd.github+json",
]# "Authorization" : fmt"Bearer {ghToken}",
"X-GitHub-Api-Version": "2022-11-28",
})
proc getGhApi(url: string): Response =
let client = ghClient()
try:
result = client.get(url)
except:
error fmt"github api request failed: {url}"
error fmt"response: {result.body}"
quit QuitFailure
proc postGhApi(url: string, body: JsonNode) = proc postGhApi(url: string, body: JsonNode) =
checkToken() checkToken()
let client = newHttpClient() let client = newHttpClient()
@ -43,4 +65,129 @@ proc createDispatch*(workflowFileName: string, `ref`: string) =
} }
) )
type
GhArtifact = object
id: int
name: string
url: string
archive_download_url*: string
GhWorkflowRun = object
id*: int
node_id: string
run_number: int
event: string
status: string
conclusion: string
html_url: string
workflow_id: int
created_at*: string # use datetime?
updated_at: string # use datetime?
ListGhArtifactResponse = object
total_count: int
artifacts: seq[GhArtifact]
ListGhWorkflowResponse = object
total_count: int
workflow_runs: seq[GhWorkflowRun]
proc listUpdateRuns(): seq[GhWorkflowRun] =
## get update.yml runs
## endpoint https://api.github.com/repos/OWNER/REPO/actions/workflows/WORKFLOW_ID/runs
debug "listing update workflows"
let response = getGhApi("https://api.github.com/repos/daylinmorgan/oizys/actions/workflows/update.yml/runs")
fromJson(response.body, ListGhWorkflowResponse).workflow_runs
proc getLastUpdateRun*(): GhWorkflowRun =
let runs = listUpdateRuns()
let run = runs[0]
if run.conclusion == "failure":
fatalQuit bb(fmt("Most recent run was not successful\n[b]runID[/]: {run.id}\n[b]conclusion[/]: {run.conclusion}"))
if run.status in ["in_progress", "queued"]:
fatalQuit bb(fmt("Most recent run is not finished\nview workflow run at: {run.html_url}"))
result = run
proc getArtifacts(runId: int): seq[GhArtifact] =
## get workflow artifacts
## https://api.github.com/repos/OWNER/REPO/actions/runs/RUN_ID/artifacts
let response = getGhApi(fmt"https://api.github.com/repos/daylinmorgan/oizys/actions/runs/{runId}/artifacts")
fromJson(response.body, ListGhArtifactResponse).artifacts
proc getUpdateSummaryArtifact(runId: int, host: string): GhArtifact =
let name = fmt"{host}-summary"
let artifacts = getArtifacts(runId)
for artifact in artifacts:
if artifact.name == name:
return artifact
fatalQuit fmt"failed to find summary for run id: {runID}"
proc getUpdateSummaryUrl(runID: int, host: string): string =
## https://api.github.com/repos/OWNER/REPO/actions/artifacts/ARTIFACT_ID/ARCHIVE_FORMAT
let artifact = getUpdateSummaryArtifact(runID, host)
# httpclient was forwarding the Authorization headers,
# which confused Azure where the archive lives...
var response: Response
try:
let client = ghClient(maxRedirects = 0)
response = client.get(artifact.archive_download_url)
except:
errorQuit fmt("fetching summary failed:\n\n{response.headers}\n\n{response.body}")
if "location" notin response.headers.table:
errorQuit fmt("fetching summary failed:\n\n{response.headers}\n\n{response.body}")
let location = response.headers.table.getOrDefault("location", @[])
if location.len == 0: errorQuit fmt("location header missing url?")
return location[0]
proc fetchUpdateSummaryFromUrl(url: string): string =
withTmpDir:
let client = newHttpClient()
client.downloadFile(url, tmpDir / "summary.zip")
let reader = openZipArchive(tmpDir / "summary.zip")
try:
result = reader.extractFile("summary.md")
finally:
reader.close()
proc getUpdateSummary*(runId: int, host: string): string =
let url = getUpdateSummaryUrl(runId, host)
result = fetchUpdateSummaryFromUrl(url)
type
GitRepo = object
path: string
proc git(r: GitRepo, rest: varargs[string]): string =
result = "git"
result.addArgs ["-C", r.path]
result.addArgs rest
proc checkGit(code: int) =
if code != 0: fatalQuit "git had a non-zero exit status"
proc fetch(r: GitRepo) =
let code = runCmd r.git("fetch", "origin")
checkGit code
proc status(r: GitRepo) =
let (output, _, code) = runCmdCapt(r.git("status", "--porcelain"))
checkGit code
if output.len > 0:
info "unstaged commits, cowardly exiting..."
quit QuitFailure
proc rebase(r: GitRepo, `ref`: string) =
r.status()
let code = runCmd r.git("rebase", `ref`)
checkGit code
proc updateRepo*() =
let repo = GitRepo(path: getFlake())
fetch repo
rebase repo, "origin/flake-lock"

View file

@ -20,3 +20,4 @@ gitea
lock lock
code code
comma-with-db comma-with-db
nix-index-with-db

View file

@ -94,6 +94,7 @@ proc trunc(s: string, limit: int): string =
proc display(msg: string, drvs: seq[Derivation]) = proc display(msg: string, drvs: seq[Derivation]) =
echo fmt"{msg}: [bold cyan]{drvs.len()}[/]".bb echo fmt"{msg}: [bold cyan]{drvs.len()}[/]".bb
if drvs.len > 0:
let maxLen = min(max drvs.mapIt(it.name.len), 40) let maxLen = min(max drvs.mapIt(it.name.len), 40)
for drv in drvs: for drv in drvs:
echo " ", drv.name.trunc(maxLen).alignLeft(maxLen), " ", drv.hash.bb("faint") echo " ", drv.name.trunc(maxLen).alignLeft(maxLen), " ", drv.hash.bb("faint")
@ -130,7 +131,7 @@ proc evaluateDerivations(drvs: seq[string]): Table[string, NixDerivation] =
fromJson(output, Table[string,NixDerivation]) fromJson(output, Table[string,NixDerivation])
# TODO: replace asserts in this proc # TODO: replace asserts in this proc, would be easier with results type
proc findSystemPaths(drvs: Table[string, NixDerivation]): seq[string] = proc findSystemPaths(drvs: Table[string, NixDerivation]): seq[string] =
let hosts = getHosts() let hosts = getHosts()
let systemDrvs = collect( let systemDrvs = collect(
@ -148,7 +149,8 @@ proc findSystemPaths(drvs: Table[string, NixDerivation]): seq[string] =
func isIgnored(drv: string): bool = func isIgnored(drv: string): bool =
const ignoredPackages = (slurp "ignored.txt").splitLines() const ignoredPackages = (slurp "ignored.txt").splitLines()
drv.split("-", 1)[1].replace(".drv","") in ignoredPackages let name = drv.split("-", 1)[1].replace(".drv","")
name in ignoredPackages
proc systemPathDrvsToBuild(): seq[string] = proc systemPathDrvsToBuild(): seq[string] =
let toBuild = toBuildNixosConfiguration() let toBuild = toBuildNixosConfiguration()
@ -157,11 +159,12 @@ proc systemPathDrvsToBuild(): seq[string] =
var inputDrvs: seq[string] var inputDrvs: seq[string]
for p in systemPaths: for p in systemPaths:
inputDrvs &= drvs[p].inputDrvs.keys().toSeq() inputDrvs &= drvs[p].inputDrvs.keys().toSeq()
result = collect( result = inputDrvs.filterIt(it in toBuild)
for drv in inputDrvs: let nToBuild = result.len
if (drv in toBuild) and (not drv.isIgnored()): result = result.filterIt(not it.isIgnored)
drv & "^*" let nIgnored = result.len - nToBuild
) debug fmt"ignored {nIgnored} derivations"
result = result.mapIt(it & "^*")
func splitDrv(drv: string): tuple[name, hash:string] = func splitDrv(drv: string): tuple[name, hash:string] =
let s = drv.split("-", 1) let s = drv.split("-", 1)

View file

@ -1,8 +1,4 @@
# oizys-nim todo's # oizys-nim todo's
- [x] nix commands including dry runs
- [ ] gh api commands
- [x] ci <- start with the easier one
- [ ] update
<!-- generated with <3 by daylinmorgan/todo --> <!-- generated with <3 by daylinmorgan/todo -->