mirror of
https://gitlab.com/rensa-nix/devtools.git
synced 2025-12-10 21:30:07 +01:00
chore: initial commit
This commit is contained in:
commit
db488d8f41
26 changed files with 1077 additions and 0 deletions
2
.envrc
Normal file
2
.envrc
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
source $(fetchurl https://gitlab.com/rensa-nix/direnv/-/raw/v0.3.0/direnvrc "sha256-u7+KEz684NnIZ+Vh5x5qLrt8rKdnUNexewBoeTcEVHQ=")
|
||||
use ren //repo/devShells/default
|
||||
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
.ren
|
||||
result
|
||||
5
.gitlab-ci.yml
Normal file
5
.gitlab-ci.yml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
# Generated by soonix, DO NOT EDIT
|
||||
include:
|
||||
- component: gitlab.com/TECHNOFAB/nix-gitlab-ci/nix-gitlab-ci@3.0.0-alpha.2
|
||||
inputs:
|
||||
version: 3.0.0-alpha.2
|
||||
21
README.md
Normal file
21
README.md
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
# Rensa Devtools
|
||||
|
||||
Utilities and dev tools with integration into the Rensa ecosystem (mainly devshell).
|
||||
|
||||
## Usage
|
||||
|
||||
```nix
|
||||
let
|
||||
devshell = inputs.devshell.lib { inherit pkgs; };
|
||||
in
|
||||
devshell.mkShell {
|
||||
imports = [inputs.devtools.devshellModule];
|
||||
|
||||
# use the modules
|
||||
lefthook.enable = true;
|
||||
}
|
||||
```
|
||||
|
||||
## Docs
|
||||
|
||||
See [docs](https://devtools.rensa.projects.tf).
|
||||
1
docs/images/logo.svg
Executable file
1
docs/images/logo.svg
Executable file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" fill="none"><rect width="100" height="100" fill="url(#a)" rx="12"/><path fill="url(#b)" d="m77.3 87.8-2.7 4.7h-5.5l-5.6-10h4.7c2 0 3.7-.6 5.2-1.6l3.9 6.9ZM68.7 79h-.2.2ZM89 67l-5.3 9.6h-7c.4-1 .6-2 .6-3.2V67H89Zm-15.2 6.4v.3a5.9 5.9 0 0 1 0-.3Zm-59.3-13V72L11 66l3.1-5.5h.4Zm6-15.1-4.2 9.5H4.7L2 50l2.7-4.8h15.7Zm52-2.2-1.2 2.2-1.3-3a8.6 8.6 0 0 0-2.5-3.4l.7-.1 4.4 4.3ZM38 37.7h-.5.5ZM29.2 34c-.4.9-.7 1.9-.7 3l-1.2.2 1.9-3.2Zm38.4 1.3a8 8 0 0 1 .3 0h-.3Zm-5-17.2a5 5 0 0 0-3 3.2 5 5 0 0 0-3.1 3l-.5 1.3L45.7 7.6l10.9-.1 6 10.7Zm12-10.6 2.7 4.8-4.2 7.3a10.5 10.5 0 0 0-6.6-2.2c-1.1 0-2.2.1-3.3.5l6-10.4h5.4Z"/><path fill="url(#c)" d="m54.9 92.4-10.7.1-5.6-10h10.7l5.6 9.9Zm-23.2 0h-5.3l-2.8-4.8 3-5.1h10.7l-5.6 10Zm4.5-28Zm.6-1.1a5.8 5.8 0 0 0-.1.2l.1-.2ZM74.5 45a5.6 5.6 0 0 0 4.1 1.7c1.6 0 3-.6 4-1.7l.7-.7-.4.7h12.4L98 50l-2.7 4.8H77.5l-1.2 2.1-.5-1.2-4.2-9.5 1.4-2.4 1.5 1.4Zm3.4-1.9a2.2 2.2 0 0 0 .2 0h-.2Zm11.3-9.1-4.3 7.6.1-1.5V40c0-1.3-.6-2.6-1.7-3.7l-4-4 4.4-7.6 5.5 9.5Zm-8.3 4.6.1.2a2.2 2.2 0 0 1-.1-.2l-3.3-3.2 3.3 3.2ZM40.5 23.3h12.7l2.6 4.6a13.8 13.8 0 0 0 0 .9l-1.5-.1H37.5a8.9 8.9 0 0 0-7.6 4.1H12l5.3-9.5h12.5l-6.2-11 2.6-4.8h5.5l8.8 15.8Z"/><path fill="#fff" d="M63 22.6c0-.5.3-.9 1-1.2a6 6 0 0 1 2.5-.4c2 0 3.7.7 5.1 2.1a7.4 7.4 0 0 1 1.5 8l7.8 7.6c.4.4.6 1 .6 1.6 0 .6-.2 1.1-.6 1.6l-.8.7c-.4.5-1 .7-1.5.7-.7 0-1.2-.2-1.7-.6L69.3 35a7.9 7.9 0 0 1-2.7.5 7 7 0 0 1-5.2-2.1 7 7 0 0 1-2.1-5.1c0-1 .1-2 .4-2.6.3-.6.7-1 1.2-1l.5.2.4.3 3.1 3 1.6-1.5-3.1-3.1-.3-.5v-.5ZM23.6 79c-1.6 0-2.9-.5-4-1.6-1-1.1-1.6-2.4-1.6-4v-11h14c0 .8.2 1.5.7 2 .6.6 1.2.8 2 .8s1.3-.3 1.6-1c.3-.6.7-1.2 1.2-1.7h16.8a2.7 2.7 0 0 0 2.8 2.8c.7 0 1.2-.4 1.5-1 .3-.7.7-1.3 1.2-1.8h14v11c0 1.5-.6 2.8-1.7 3.9-1 1-2.4 1.6-4 1.6H23.7Zm-4.4-22L25 43.7c.4-1 1-1.8 2-2.4 1-.6 2-.9 3-.9h2v-2.7c0-1.6.5-2.8 1.6-4 1-1 2.4-1.5 4-1.5h16.6c1.6 0 2.9.5 4 1.6 1 1 1.6 2.3 1.6 3.9v2.7h2a5.4 5.4 0 0 1 5 3.3L72.6 57H59.8c0-.8-.2-1.5-.8-2-.5-.5-1.2-.8-2-.8-.7 0-1.2.3-1.5 1-.3.7-.7 1.2-1.3 1.8H37.5c0-.8-.2-1.5-.8-2-.5-.5-1.2-.8-2-.8-.7 0-1.2.3-1.5 1-.3.7-.7 1.2-1.3 1.8H19.2Zm18.3-16.6h16.8v-2.7H37.5v2.7Z"/><defs><linearGradient id="b" x1="76.7" x2="59.1" y1="47.7" y2="17.6" gradientUnits="userSpaceOnUse"><stop offset=".2" stop-color="#7EB1DD"/></linearGradient><linearGradient id="c" x1="63.4" x2="81.3" y1="70.8" y2="41.1" gradientUnits="userSpaceOnUse"><stop offset="1" stop-color="#5277C3"/></linearGradient><radialGradient id="a" cx="0" cy="0" r="1" gradientTransform="matrix(0 50 -50 0 50 50)" gradientUnits="userSpaceOnUse"><stop offset=".5" stop-color="#091A3D"/><stop offset="1" stop-color="#000819"/></radialGradient></defs></svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
19
docs/index.md
Normal file
19
docs/index.md
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
# Rensa Devtools
|
||||
|
||||
Utilities and dev tools with integration into the Rensa ecosystem (mainly devshell).
|
||||
|
||||
## Usage
|
||||
|
||||
```nix
|
||||
let
|
||||
devshell = inputs.devshell.lib { inherit pkgs; };
|
||||
in
|
||||
devshell.mkShell {
|
||||
imports = [inputs.devtools.devshellModule];
|
||||
|
||||
# use the modules
|
||||
lefthook.enable = true;
|
||||
}
|
||||
```
|
||||
|
||||
[See all options](./options.md)
|
||||
3
docs/options.md
Normal file
3
docs/options.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# Options
|
||||
|
||||
{% include 'options.md' %}
|
||||
15
docs/style.css
Normal file
15
docs/style.css
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
.md-header__button.md-logo {
|
||||
margin: 0;
|
||||
padding-top: .2rem;
|
||||
padding-bottom: .2rem;
|
||||
}
|
||||
|
||||
[dir="ltr"] .md-header__title {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.md-header__button.md-logo img,
|
||||
.md-header__button.md-logo svg {
|
||||
height: 2rem;
|
||||
}
|
||||
|
||||
63
flake.lock
generated
Normal file
63
flake.lock
generated
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1757487488,
|
||||
"narHash": "sha256-zwE/e7CuPJUWKdvvTCB7iunV4E/+G0lKfv4kk/5Izdg=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ab0f3607a6c7486ea22229b92ed2d355f1482ee0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1754184128,
|
||||
"narHash": "sha256-AjhoyBL4eSyXf01Bmc6DiuaMrJRNdWopmdnMY0Pa/M0=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "02e72200e6d56494f4a7c0da8118760736e41b60",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"ren": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"dir": "lib",
|
||||
"lastModified": 1756370106,
|
||||
"narHash": "sha256-l84ojcHuQWBwn4BRxQsMMfQpcq/Az/sHh/hSqFgVtyg=",
|
||||
"owner": "rensa-nix",
|
||||
"repo": "core",
|
||||
"rev": "9c1a29fa9ba7cbbb78b9e47eb8afbcd29303a3b4",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
"dir": "lib",
|
||||
"owner": "rensa-nix",
|
||||
"repo": "core",
|
||||
"type": "gitlab"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs",
|
||||
"ren": "ren"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
35
flake.nix
Normal file
35
flake.nix
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
ren.url = "gitlab:rensa-nix/core?dir=lib";
|
||||
};
|
||||
|
||||
outputs = {
|
||||
ren,
|
||||
self,
|
||||
...
|
||||
} @ inputs:
|
||||
ren.buildWith
|
||||
{
|
||||
inherit inputs;
|
||||
cellsFrom = ./nix;
|
||||
transformInputs = system: i:
|
||||
i
|
||||
// {
|
||||
pkgs = import i.nixpkgs {inherit system;};
|
||||
};
|
||||
cellBlocks = with ren.blocks; [
|
||||
(simple "devShells")
|
||||
(simple "tests")
|
||||
(simple "docs")
|
||||
(simple "ci")
|
||||
];
|
||||
}
|
||||
{
|
||||
packages = ren.select self [
|
||||
["repo" "tests"]
|
||||
["repo" "docs"]
|
||||
["repo" "ci" "packages"]
|
||||
];
|
||||
};
|
||||
}
|
||||
3
lib/default.nix
Normal file
3
lib/default.nix
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
_: {
|
||||
devshellModule = ./modules;
|
||||
}
|
||||
5
lib/flake.nix
Normal file
5
lib/flake.nix
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
outputs = _i: {
|
||||
devshellModule = ./modules;
|
||||
};
|
||||
}
|
||||
59
lib/modules/cocogitto.nix
Normal file
59
lib/modules/cocogitto.nix
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
{
|
||||
lib,
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
inherit (lib) mkEnableOption mkOption mkIf types;
|
||||
cfg = config.cocogitto;
|
||||
|
||||
# we need a newer version than in nixpkgs, since the PR which adds `--config`
|
||||
# didn't land in a release yet
|
||||
cocogitto = pkgs.cocogitto.overrideAttrs (_prev: {
|
||||
version = "2025-09-11";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "oknozor";
|
||||
repo = "cocogitto";
|
||||
rev = "031cc238cb3e3e8aa3a525c1df089c3e70020efc";
|
||||
hash = "sha256-fyhugacBLJPMqHWxoxBTFhIE3wHDB9xdrqJYzJc36I0=";
|
||||
};
|
||||
});
|
||||
|
||||
configFile = (pkgs.formats.toml {}).generate "cog.toml" cfg.config;
|
||||
cogAlias = pkgs.writeTextFile {
|
||||
name = "cog-alias";
|
||||
destination = "/bin/${cfg.alias}";
|
||||
executable = true;
|
||||
text =
|
||||
# sh
|
||||
''
|
||||
${cocogitto}/bin/cog --config "${configFile}" ''${@:1}
|
||||
'';
|
||||
};
|
||||
in {
|
||||
options.cocogitto = {
|
||||
enable =
|
||||
mkEnableOption "Cocogitto"
|
||||
// {
|
||||
default = cfg.config != {};
|
||||
};
|
||||
alias = mkOption {
|
||||
type = types.str;
|
||||
default = "cog";
|
||||
description = ''
|
||||
Alias for `cog`.
|
||||
'';
|
||||
};
|
||||
config = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
description = ''
|
||||
Configure cocogitto here.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
packages = [cogAlias];
|
||||
};
|
||||
}
|
||||
28
lib/modules/cocogitto_test.nix
Normal file
28
lib/modules/cocogitto_test.nix
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
ntlib,
|
||||
devshell,
|
||||
...
|
||||
}: let
|
||||
module = ./cocogitto.nix;
|
||||
in {
|
||||
suites."Cocogitto" = {
|
||||
pos = __curPos;
|
||||
tests = [
|
||||
{
|
||||
name = "basic";
|
||||
type = "script";
|
||||
script = let
|
||||
shell = devshell.mkShell {
|
||||
imports = [module];
|
||||
cocogitto.enable = true;
|
||||
};
|
||||
in
|
||||
# sh
|
||||
''
|
||||
${ntlib.helpers.scriptHelpers}
|
||||
assert "-f ${shell}/bin/cog" "/bin/cog should exist"
|
||||
'';
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
7
lib/modules/default.nix
Normal file
7
lib/modules/default.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
imports = [
|
||||
./lefthook.nix
|
||||
./taskfile.nix
|
||||
./cocogitto.nix
|
||||
];
|
||||
}
|
||||
152
lib/modules/lefthook.nix
Normal file
152
lib/modules/lefthook.nix
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
{
|
||||
lib,
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
inherit (lib) concatStringsSep concatMapStringsSep subtractLists mkEnableOption mkOption types mkIf;
|
||||
cfg = config.lefthook;
|
||||
|
||||
allHookNames = [
|
||||
"applypatch-msg"
|
||||
"pre-applypatch"
|
||||
"post-applypatch"
|
||||
"pre-commit"
|
||||
"prepare-commit-msg"
|
||||
"commit-msg"
|
||||
"post-commit"
|
||||
"pre-rebase"
|
||||
"post-rewrite"
|
||||
"post-checkout"
|
||||
"post-merge"
|
||||
"pre-push"
|
||||
"pre-auto-gc"
|
||||
"post-update"
|
||||
"sendemail-validate"
|
||||
"fsmonitor-watchman"
|
||||
"p4-changelist"
|
||||
"p4-prepare-changelist"
|
||||
"p4-post-changelist"
|
||||
"p4-pre-submit"
|
||||
"post-index-change"
|
||||
"pre-receive"
|
||||
"update"
|
||||
"proc-receive"
|
||||
"reference-transaction"
|
||||
"push-to-checkout"
|
||||
"pre-merge-commit"
|
||||
];
|
||||
currentHookNames = builtins.filter (h: builtins.elem h allHookNames) (builtins.attrNames cfg.config);
|
||||
unusedNixHookNames = subtractLists allHookNames currentHookNames;
|
||||
unusedNixHookNamesStr = concatStringsSep " " unusedNixHookNames;
|
||||
|
||||
hookContent = hookName:
|
||||
pkgs.writeShellScript hookName ''
|
||||
if [ "$LEFTHOOK" = "0" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
${lefthookAlias}/bin/${cfg.alias} run "${hookName}" "$@"
|
||||
'';
|
||||
|
||||
lefthookConfig = (pkgs.formats.yaml {}).generate "lefthook.yaml" cfg.config;
|
||||
lefthookAlias = pkgs.writeShellScriptBin cfg.alias ''
|
||||
if [ "$1" = "install" ]; then
|
||||
echo "Warning, using 'lefthook install' should not be used, use the shellHook instead"
|
||||
fi
|
||||
if [ "$1" = "install" ]; then
|
||||
echo "Warning, using 'lefthook install' should not be used, use the shellHook instead"
|
||||
fi
|
||||
if [ "$1" = "install" ]; then
|
||||
echo "Warning, using 'lefthook install' should not be used, use the shellHook instead"
|
||||
fi
|
||||
LEFTHOOK_CONFIG="${lefthookConfig}" ${pkgs.lefthook}/bin/lefthook ''${@:1}
|
||||
'';
|
||||
in {
|
||||
options.lefthook = {
|
||||
enable =
|
||||
mkEnableOption "Lefthook"
|
||||
// {
|
||||
default = cfg.config != {};
|
||||
};
|
||||
shellHook = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to add a shell hook which automatically installs the git hooks.
|
||||
'';
|
||||
};
|
||||
alias = mkOption {
|
||||
type = types.str;
|
||||
default = "lefthook";
|
||||
example = "hooks";
|
||||
description = ''
|
||||
Alias for the lefthook command.
|
||||
'';
|
||||
};
|
||||
config = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
description = ''
|
||||
Config for lefthook. See https://lefthook.dev/configuration/.
|
||||
'';
|
||||
example = {
|
||||
pre-commit = {
|
||||
parallel = true;
|
||||
jobs = [
|
||||
{
|
||||
name = "hello";
|
||||
run = "echo world";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
outputs = {
|
||||
shellHook = mkOption {
|
||||
type = types.str;
|
||||
readOnly = true;
|
||||
description = ''
|
||||
The script to run on shell activation.
|
||||
It automatically installs the git hooks and removes unused/previously used ones.
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
config = {
|
||||
lefthook.outputs.shellHook =
|
||||
# sh
|
||||
''
|
||||
${builtins.readFile ./lefthook_helpers.sh}
|
||||
|
||||
# ensure git is available and we are in a Git repository
|
||||
if ! command -v git &> /dev/null; then
|
||||
__log ERROR "Git command not found. Cannot manage Git hooks." >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
local GIT_REAL_DIR
|
||||
GIT_REAL_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
||||
if [ $? -ne 0 ]; then
|
||||
__log INFO "Not inside a Git repository. Skipping Git hook setup." >&2
|
||||
return 0
|
||||
fi
|
||||
# Use realpath to handle .git file for worktrees, and resolve relative path
|
||||
GIT_REAL_DIR=$(realpath "$GIT_REAL_DIR")
|
||||
|
||||
# clean up unused hooks
|
||||
cleanup_git_hooks "${unusedNixHookNamesStr}"
|
||||
|
||||
${concatMapStringsSep "\n" (hook: ''
|
||||
setup_git_hook "${hook}" "${hookContent hook}"
|
||||
'')
|
||||
currentHookNames}
|
||||
'';
|
||||
packages = mkIf cfg.enable [lefthookAlias];
|
||||
enterShellCommands."lefthook" = mkIf (cfg.enable && cfg.shellHook) {
|
||||
text = cfg.outputs.shellHook;
|
||||
deps = ["env"];
|
||||
};
|
||||
};
|
||||
}
|
||||
149
lib/modules/lefthook_helpers.sh
Normal file
149
lib/modules/lefthook_helpers.sh
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
# Usage: __log <LEVEL> "message"
|
||||
# LEVEL can be: TRACE, INFO, WARN, ERROR
|
||||
__log() {
|
||||
local level="$1" msg="$2"
|
||||
local format=$'\E[mlefthook: \E[38;5;8m%s\E[m\n'
|
||||
case "$level" in
|
||||
TRACE)
|
||||
if [[ -n "${LEFTHOOK_VERBOSE:-}" ]]; then
|
||||
# shellcheck disable=SC2059
|
||||
printf "$format" "[TRACE] ${msg}" >&2
|
||||
fi
|
||||
;;
|
||||
INFO)
|
||||
if [[ -n "${LEFTHOOK_VERBOSE:-}" ]]; then
|
||||
# shellcheck disable=SC2059
|
||||
printf "$format" "$msg" >&2
|
||||
fi
|
||||
;;
|
||||
WARN)
|
||||
# shellcheck disable=SC2059
|
||||
printf "$format" "[WARN] ${msg}" >&2
|
||||
;;
|
||||
ERROR)
|
||||
# shellcheck disable=SC2059
|
||||
printf "$format" "[ERROR] ${msg}" >&2
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Helper to get the current Git hooks directory, supporting worktrees.
|
||||
# Returns the absolute path to the hooks directory.
|
||||
_get_git_hooks_dir() {
|
||||
# Check if we are inside a Git repository
|
||||
if ! command -v git &> /dev/null; then
|
||||
__log ERROR "Git command not found. Cannot resolve Git hooks directory."
|
||||
return 1
|
||||
fi
|
||||
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
||||
__log ERROR "Not inside a Git repository. Cannot resolve Git hooks directory."
|
||||
return 1
|
||||
fi
|
||||
local GIT_DIR_PATH
|
||||
GIT_DIR_PATH=$(git rev-parse --git-dir)
|
||||
GIT_DIR_PATH=$(realpath "$GIT_DIR_PATH") # Resolve to absolute path
|
||||
echo "${GIT_DIR_PATH}/hooks"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Function to set up a Git hook as a symlink to a Nix store path.
|
||||
# Usage: setup_git_hook <hook_name> <nix_store_hook_path>
|
||||
setup_git_hook() {
|
||||
local HOOK_NAME="$1"
|
||||
local NIX_HOOK_PATH="$2"
|
||||
local NIX_STORE_PATTERN="/nix/store/" # Pattern to identify Nix store paths
|
||||
|
||||
local HOOK_DIR
|
||||
HOOK_DIR=$(_get_git_hooks_dir)
|
||||
if [ $? -ne 0 ]; then
|
||||
return 1 # Error from _get_git_hooks_dir
|
||||
fi
|
||||
|
||||
local HOOK_FILE="${HOOK_DIR}/${HOOK_NAME}"
|
||||
local BACKUP_FILE="${HOOK_FILE}.old"
|
||||
|
||||
# Ensure the hooks directory exists
|
||||
mkdir -p "$HOOK_DIR"
|
||||
|
||||
if [ -e "$HOOK_FILE" ]; then # Check if anything exists at the hook path
|
||||
if [ -L "$HOOK_FILE" ]; then # Existing hook is a symlink
|
||||
local CURRENT_TARGET
|
||||
CURRENT_TARGET=$(readlink "$HOOK_FILE")
|
||||
|
||||
if [[ "$CURRENT_TARGET" == "$NIX_HOOK_PATH" ]]; then
|
||||
__log TRACE "Hook '$HOOK_NAME' already exists and points to the correct Nix store path. Doing nothing."
|
||||
return 0
|
||||
elif [[ "$CURRENT_TARGET" == $NIX_STORE_PATTERN* ]]; then
|
||||
__log TRACE "Hook '$HOOK_NAME' is a symlink to a different Nix store path. Replacing it with the new symlink."
|
||||
rm "$HOOK_FILE"
|
||||
else
|
||||
__log INFO "Hook '$HOOK_NAME' is a symlink but not to a Nix store path. Backing up to '$BACKUP_FILE'."
|
||||
mv "$HOOK_FILE" "$BACKUP_FILE"
|
||||
fi
|
||||
elif [ -f "$HOOK_FILE" ]; then # Existing hook is a regular file
|
||||
# Assumption: any non-symlink hook file is not ours
|
||||
__log INFO "Hook '$HOOK_NAME' is an existing regular file (not managed by us). Backing up to '$BACKUP_FILE'."
|
||||
mv "$HOOK_FILE" "$BACKUP_FILE"
|
||||
else # Existing hook is neither a symlink nor a regular file (e.g., directory)
|
||||
__log WARN "Hook '$HOOK_NAME' exists but is not a regular file or symlink. Please check your hooks and remove the hook manually just in case."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
__log INFO "Creating symlink for '$HOOK_NAME' to '$NIX_HOOK_PATH'."
|
||||
ln -s "$NIX_HOOK_PATH" "$HOOK_FILE"
|
||||
}
|
||||
|
||||
# Function to clean up specific Git hooks that are no longer used by Nix.
|
||||
# It removes symlinks that point to the Nix store for the given hook names
|
||||
# and restores any .old backups if they exist.
|
||||
# Usage: cleanup_git_hooks <space-separated-list-of-unused-hook-names>
|
||||
cleanup_git_hooks() {
|
||||
local UNUSED_HOOK_NAMES_STR="$1"
|
||||
local NIX_STORE_PATTERN="/nix/store/"
|
||||
|
||||
if [ -z "$UNUSED_HOOK_NAMES_STR" ]; then
|
||||
__log TRACE "No unused hooks specified for cleanup. Doing nothing."
|
||||
return 0
|
||||
fi
|
||||
|
||||
local HOOK_DIR
|
||||
HOOK_DIR=$(_get_git_hooks_dir)
|
||||
if [ $? -ne 0 ]; then
|
||||
return 1 # Error from _get_git_hooks_dir
|
||||
fi
|
||||
|
||||
if [ ! -d "$HOOK_DIR" ]; then
|
||||
__log TRACE "No hooks directory found at '$HOOK_DIR'. Nothing to clean up."
|
||||
return 0
|
||||
fi
|
||||
|
||||
__log TRACE "Cleaning up unused Git hooks in '$HOOK_DIR'..."
|
||||
for HOOK_NAME in $UNUSED_HOOK_NAMES_STR; do
|
||||
local HOOK_FILE_PATH="${HOOK_DIR}/${HOOK_NAME}"
|
||||
|
||||
if [ -L "$HOOK_FILE_PATH" ]; then # Only consider symlinks
|
||||
local TARGET
|
||||
TARGET=$(readlink "$HOOK_FILE_PATH")
|
||||
|
||||
# Check if the symlink points to a Nix store path
|
||||
if [[ "$TARGET" == $NIX_STORE_PATTERN* ]]; then
|
||||
__log INFO "Removing unused Nix-managed hook: '$HOOK_NAME' (points to '$TARGET')"
|
||||
rm "$HOOK_FILE_PATH"
|
||||
|
||||
# Check for a corresponding .old file and restore it if it exists
|
||||
local OLD_HOOK="${HOOK_FILE_PATH}.old"
|
||||
if [ -e "$OLD_HOOK" ]; then
|
||||
__log INFO "Restoring backup: '$OLD_HOOK' to '${HOOK_FILE_PATH}'"
|
||||
mv "$OLD_HOOK" "$HOOK_FILE_PATH"
|
||||
fi
|
||||
else
|
||||
__log TRACE "Hook '$HOOK_NAME' is a symlink but not to a Nix store path. Skipping cleanup (it's not our managed symlink)."
|
||||
fi
|
||||
elif [ -e "$HOOK_FILE_PATH" ]; then
|
||||
__log TRACE "Hook '$HOOK_NAME' exists but is not a symlink (not managed by us). Skipping cleanup."
|
||||
else
|
||||
__log TRACE "Hook '$HOOK_NAME' does not exist. Skipping cleanup."
|
||||
fi
|
||||
done
|
||||
}
|
||||
46
lib/modules/lefthook_test.nix
Normal file
46
lib/modules/lefthook_test.nix
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
{
|
||||
ntlib,
|
||||
devshell,
|
||||
...
|
||||
}: let
|
||||
module = ./lefthook.nix;
|
||||
in {
|
||||
suites."Lefthook" = {
|
||||
pos = __curPos;
|
||||
tests = [
|
||||
{
|
||||
name = "basic";
|
||||
type = "script";
|
||||
script = let
|
||||
shell = devshell.mkShell {
|
||||
imports = [module];
|
||||
lefthook.enable = true;
|
||||
};
|
||||
in
|
||||
# sh
|
||||
''
|
||||
${ntlib.helpers.scriptHelpers}
|
||||
assert "-f ${shell}/bin/lefthook" "/bin/lefthook should exist"
|
||||
'';
|
||||
}
|
||||
{
|
||||
name = "alias";
|
||||
type = "script";
|
||||
script = let
|
||||
shell = devshell.mkShell {
|
||||
imports = [module];
|
||||
lefthook = {
|
||||
enable = true;
|
||||
alias = "hooks";
|
||||
};
|
||||
};
|
||||
in
|
||||
# sh
|
||||
''
|
||||
${ntlib.helpers.scriptHelpers}
|
||||
assert "-f ${shell}/bin/hooks" "/bin/hooks should exist"
|
||||
'';
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
102
lib/modules/taskfile.nix
Normal file
102
lib/modules/taskfile.nix
Normal file
|
|
@ -0,0 +1,102 @@
|
|||
{
|
||||
lib,
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
inherit (lib) mapAttrs mkEnableOption mkOption mkIf types;
|
||||
cfg = config.task;
|
||||
|
||||
patchedTasks = mapAttrs (_name: value: let
|
||||
taskDir = value.dir or "";
|
||||
absolutePathOrTemplate = (builtins.substring 0 1 taskDir) == "/" || (builtins.substring 0 1 taskDir) == "{";
|
||||
in
|
||||
value
|
||||
// {
|
||||
dir =
|
||||
if absolutePathOrTemplate
|
||||
then taskDir
|
||||
else ''{{env "TASK_ROOT_DIR" | default .USER_WORKING_DIR}}/${taskDir}'';
|
||||
})
|
||||
cfg.tasks;
|
||||
|
||||
generator = name: value:
|
||||
pkgs.writeTextFile {
|
||||
inherit name;
|
||||
text = builtins.toJSON value;
|
||||
};
|
||||
# NOTE: this requires python just to convert json to yaml, since json is valid yaml we just ignore that
|
||||
# generator = (pkgs.formats.yaml {}).generate;
|
||||
taskfile = generator "taskfile" {
|
||||
version = 3;
|
||||
inherit (cfg) interval;
|
||||
tasks = patchedTasks;
|
||||
};
|
||||
# when using a , as alias for example the store path looks weird.
|
||||
# This way it can be identified as being the task alias
|
||||
taskAlias = pkgs.writeTextFile {
|
||||
name = "task-alias";
|
||||
destination = "/bin/${cfg.alias}";
|
||||
executable = true;
|
||||
text = let
|
||||
taskfileScript =
|
||||
if cfg.lazy
|
||||
then
|
||||
# sh
|
||||
"$(nix build '${builtins.unsafeDiscardOutputDependency taskfile.drvPath}^*' --no-link --print-out-paths)"
|
||||
else taskfile;
|
||||
in
|
||||
# sh
|
||||
''
|
||||
TASKFILE="${taskfileScript}"
|
||||
STATE_DIR="''${REN_STATE:-''${DEVENV_STATE:-''${PRJ_CACHE_HOME}}}"
|
||||
ROOT_DIR="''${REN_ROOT:-''${DEVENV_ROOT:-''${PRJ_ROOT}}}"
|
||||
|
||||
TASK_TEMP_DIR="''${STATE_DIR}/.task" \
|
||||
TASK_ROOT_DIR="$ROOT_DIR" \
|
||||
${pkgs.go-task}/bin/task --taskfile "$TASKFILE" ''${@:1}
|
||||
'';
|
||||
};
|
||||
in {
|
||||
options.task = {
|
||||
enable =
|
||||
mkEnableOption "Task"
|
||||
// {
|
||||
default = cfg.tasks != {};
|
||||
};
|
||||
lazy = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether the taskfile should be built on-demand/lazily.
|
||||
It will probably not land in the gcroot and thus might get cleaned up with every gc.
|
||||
On the other hand, this way loading the devshell is faster. Decide for yourself :)
|
||||
'';
|
||||
};
|
||||
alias = mkOption {
|
||||
type = types.str;
|
||||
default = "task";
|
||||
description = ''
|
||||
Alias for `task`, eg. set to `,` to be able to run `, --list-all`.
|
||||
'';
|
||||
};
|
||||
interval = mkOption {
|
||||
type = types.str;
|
||||
default = "5000ms";
|
||||
description = ''
|
||||
Interval for `task` to check for filesystem changes/watcher updates.
|
||||
'';
|
||||
};
|
||||
tasks = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
description = ''
|
||||
Configure all your tasks here.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
packages = [taskAlias];
|
||||
};
|
||||
}
|
||||
46
lib/modules/taskfile_test.nix
Normal file
46
lib/modules/taskfile_test.nix
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
{
|
||||
ntlib,
|
||||
devshell,
|
||||
...
|
||||
}: let
|
||||
module = ./taskfile.nix;
|
||||
in {
|
||||
suites."Taskfile" = {
|
||||
pos = __curPos;
|
||||
tests = [
|
||||
{
|
||||
name = "basic";
|
||||
type = "script";
|
||||
script = let
|
||||
shell = devshell.mkShell {
|
||||
imports = [module];
|
||||
task.enable = true;
|
||||
};
|
||||
in
|
||||
# sh
|
||||
''
|
||||
${ntlib.helpers.scriptHelpers}
|
||||
assert "-f ${shell}/bin/task" "/bin/task should exist"
|
||||
'';
|
||||
}
|
||||
{
|
||||
name = "alias";
|
||||
type = "script";
|
||||
script = let
|
||||
shell = devshell.mkShell {
|
||||
imports = [module];
|
||||
task = {
|
||||
enable = true;
|
||||
alias = ",";
|
||||
};
|
||||
};
|
||||
in
|
||||
# sh
|
||||
''
|
||||
${ntlib.helpers.scriptHelpers}
|
||||
assert "-f ${shell}/bin/," "/bin/, should exist"
|
||||
'';
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
34
nix/repo/ci.nix
Normal file
34
nix/repo/ci.nix
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
{inputs, ...}: let
|
||||
inherit (inputs) cilib;
|
||||
in
|
||||
cilib.mkCI {
|
||||
pipelines."default" = {
|
||||
stages = ["build" "deploy"];
|
||||
jobs = {
|
||||
"docs" = {
|
||||
stage = "build";
|
||||
script = [
|
||||
# sh
|
||||
''
|
||||
nix build .#docs:default
|
||||
mkdir -p public
|
||||
cp -r result/. public/
|
||||
''
|
||||
];
|
||||
artifacts.paths = ["public"];
|
||||
};
|
||||
"pages" = {
|
||||
nix.enable = false;
|
||||
image = "alpine:latest";
|
||||
stage = "deploy";
|
||||
script = ["true"];
|
||||
artifacts.paths = ["public"];
|
||||
rules = [
|
||||
{
|
||||
"if" = "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
60
nix/repo/devShells.nix
Normal file
60
nix/repo/devShells.nix
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
{
|
||||
inputs,
|
||||
cell,
|
||||
...
|
||||
}: let
|
||||
inherit (inputs) self pkgs devshell soonix treefmt;
|
||||
inherit (cell) ci;
|
||||
|
||||
treefmtWrapper = treefmt.mkWrapper pkgs {
|
||||
programs = {
|
||||
alejandra.enable = true;
|
||||
deadnix.enable = true;
|
||||
statix.enable = true;
|
||||
mdformat.enable = true;
|
||||
};
|
||||
};
|
||||
in {
|
||||
default = devshell.mkShell {
|
||||
imports = [
|
||||
"${self}/lib/modules"
|
||||
soonix.devshellModule
|
||||
];
|
||||
soonix.hooks.ci = ci.soonix;
|
||||
packages = [
|
||||
pkgs.hello
|
||||
treefmtWrapper
|
||||
];
|
||||
|
||||
task = {
|
||||
alias = ",";
|
||||
tasks = {
|
||||
"hello" = {
|
||||
cmd = "echo world!";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
lefthook.config = {
|
||||
skip_output = ["meta" "execution_out"];
|
||||
"pre-commit" = {
|
||||
parallel = true;
|
||||
jobs = [
|
||||
{
|
||||
name = "treefmt";
|
||||
stage_fixed = true;
|
||||
run = "${treefmtWrapper}/bin/treefmt";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
cocogitto.config.changelog = {
|
||||
path = "CHANGELOG.md";
|
||||
template = "remote";
|
||||
remote = "gitlab.com";
|
||||
repository = "devtools";
|
||||
owner = "rensa-nix";
|
||||
};
|
||||
};
|
||||
}
|
||||
68
nix/repo/docs.nix
Normal file
68
nix/repo/docs.nix
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
{inputs, ...}: let
|
||||
inherit (inputs) pkgs devtools doclib;
|
||||
|
||||
optionsDoc = doclib.mkOptionDocs {
|
||||
module = devtools.devshellModule;
|
||||
roots = [
|
||||
{
|
||||
url = "https://gitlab.com/rensa-nix/devtools/-/blob/main/lib";
|
||||
path = "${inputs.self}/lib";
|
||||
}
|
||||
];
|
||||
};
|
||||
optionsDocs = pkgs.runCommand "options-docs" {} ''
|
||||
mkdir -p $out
|
||||
ln -s ${optionsDoc} $out/options.md
|
||||
'';
|
||||
in
|
||||
(doclib.mkDocs {
|
||||
docs."default" = {
|
||||
base = "${inputs.self}";
|
||||
path = "${inputs.self}/docs";
|
||||
material = {
|
||||
enable = true;
|
||||
colors = {
|
||||
primary = "red";
|
||||
accent = "red";
|
||||
};
|
||||
umami = {
|
||||
enable = true;
|
||||
src = "https://analytics.tf/umami";
|
||||
siteId = "db90861a-0b7f-4654-b7ca-f45ce80c44b3";
|
||||
domains = ["devtools.rensa.projects.tf"];
|
||||
};
|
||||
};
|
||||
macros = {
|
||||
enable = true;
|
||||
includeDir = toString optionsDocs;
|
||||
};
|
||||
config = {
|
||||
site_name = "Devtools";
|
||||
repo_name = "rensa-nix/devtools";
|
||||
repo_url = "https://gitlab.com/rensa-nix/devtools";
|
||||
extra_css = ["style.css"];
|
||||
theme = {
|
||||
logo = "images/logo.svg";
|
||||
icon.repo = "simple/gitlab";
|
||||
favicon = "images/logo.svg";
|
||||
};
|
||||
nav = [
|
||||
{"Introduction" = "index.md";}
|
||||
{"Options" = "options.md";}
|
||||
];
|
||||
markdown_extensions = [
|
||||
{
|
||||
"pymdownx.highlight".pygments_lang_class = true;
|
||||
}
|
||||
"pymdownx.inlinehilite"
|
||||
"pymdownx.snippets"
|
||||
"pymdownx.superfences"
|
||||
"pymdownx.escapeall"
|
||||
"fenced_code"
|
||||
];
|
||||
};
|
||||
};
|
||||
}).packages
|
||||
// {
|
||||
inherit optionsDocs;
|
||||
}
|
||||
118
nix/repo/flake.lock
generated
Normal file
118
nix/repo/flake.lock
generated
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
{
|
||||
"nodes": {
|
||||
"devshell": {
|
||||
"locked": {
|
||||
"dir": "lib",
|
||||
"lastModified": 1755673398,
|
||||
"narHash": "sha256-51MmR+Eo1+bKDd/Ss77wwTqi4yAR2xgmyCSEbKWSpj0=",
|
||||
"owner": "rensa-nix",
|
||||
"repo": "devshell",
|
||||
"rev": "e76bef387e8a4574f9b6d37b1a424e706491af08",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
"dir": "lib",
|
||||
"owner": "rensa-nix",
|
||||
"repo": "devshell",
|
||||
"type": "gitlab"
|
||||
}
|
||||
},
|
||||
"nix-gitlab-ci-lib": {
|
||||
"locked": {
|
||||
"dir": "lib",
|
||||
"lastModified": 1756974596,
|
||||
"narHash": "sha256-KxQj76sUqvPNtrqzNWMZeOWqTitc0aFCYj7UZzToiEA=",
|
||||
"owner": "TECHNOFAB",
|
||||
"repo": "nix-gitlab-ci",
|
||||
"rev": "00cf5b83c6c46698fba12a54b9cc15c6d4e5a4dd",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
"dir": "lib",
|
||||
"owner": "TECHNOFAB",
|
||||
"ref": "3.0.0-alpha.2",
|
||||
"repo": "nix-gitlab-ci",
|
||||
"type": "gitlab"
|
||||
}
|
||||
},
|
||||
"nixmkdocs": {
|
||||
"locked": {
|
||||
"dir": "lib",
|
||||
"lastModified": 1757055638,
|
||||
"narHash": "sha256-KHYSkEreFe4meXzSdEbknC/HwaQSNClQkc8vzHlAsMM=",
|
||||
"owner": "TECHNOFAB",
|
||||
"repo": "nixmkdocs",
|
||||
"rev": "7840a5febdbeaf2da90babf6c94b3d0929d2bf74",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
"dir": "lib",
|
||||
"owner": "TECHNOFAB",
|
||||
"repo": "nixmkdocs",
|
||||
"type": "gitlab"
|
||||
}
|
||||
},
|
||||
"nixtest-lib": {
|
||||
"locked": {
|
||||
"dir": "lib",
|
||||
"lastModified": 1756812148,
|
||||
"narHash": "sha256-0g8KNk4zoLApA51PBHOWqPLRYpprjrQuSzNCjfBQgu8=",
|
||||
"owner": "TECHNOFAB",
|
||||
"repo": "nixtest",
|
||||
"rev": "5741109cc9ec2b6d41b56abd3f5bc51ed7a9a228",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
"dir": "lib",
|
||||
"owner": "TECHNOFAB",
|
||||
"repo": "nixtest",
|
||||
"type": "gitlab"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"devshell": "devshell",
|
||||
"nix-gitlab-ci-lib": "nix-gitlab-ci-lib",
|
||||
"nixmkdocs": "nixmkdocs",
|
||||
"nixtest-lib": "nixtest-lib",
|
||||
"soonix-lib": "soonix-lib",
|
||||
"treefmt-nix": "treefmt-nix"
|
||||
}
|
||||
},
|
||||
"soonix-lib": {
|
||||
"locked": {
|
||||
"dir": "lib",
|
||||
"lastModified": 1757424411,
|
||||
"narHash": "sha256-x99obZwqDAhUB+VUhAV9sKH00NnsVi481n/8bdvZCUY=",
|
||||
"owner": "TECHNOFAB",
|
||||
"repo": "soonix",
|
||||
"rev": "add807ef8980197bbd06652a36d937b93b2a31c7",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
"dir": "lib",
|
||||
"owner": "TECHNOFAB",
|
||||
"repo": "soonix",
|
||||
"type": "gitlab"
|
||||
}
|
||||
},
|
||||
"treefmt-nix": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1756662192,
|
||||
"narHash": "sha256-F1oFfV51AE259I85av+MAia221XwMHCOtZCMcZLK2Jk=",
|
||||
"owner": "numtide",
|
||||
"repo": "treefmt-nix",
|
||||
"rev": "1aabc6c05ccbcbf4a635fb7a90400e44282f61c4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "treefmt-nix",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
24
nix/repo/flake.nix
Normal file
24
nix/repo/flake.nix
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
inputs = {
|
||||
nixtest-lib.url = "gitlab:TECHNOFAB/nixtest?dir=lib";
|
||||
nixmkdocs.url = "gitlab:TECHNOFAB/nixmkdocs?dir=lib";
|
||||
devshell.url = "gitlab:rensa-nix/devshell?dir=lib";
|
||||
soonix-lib.url = "gitlab:TECHNOFAB/soonix?dir=lib";
|
||||
nix-gitlab-ci-lib.url = "gitlab:TECHNOFAB/nix-gitlab-ci/3.0.0-alpha.2?dir=lib";
|
||||
treefmt-nix = {
|
||||
url = "github:numtide/treefmt-nix";
|
||||
flake = false;
|
||||
};
|
||||
};
|
||||
outputs = i:
|
||||
i
|
||||
// {
|
||||
ntlib = i.nixtest-lib.lib {inherit (i.parent) pkgs;};
|
||||
doclib = i.nixmkdocs.lib {inherit (i.parent) pkgs;};
|
||||
devshell = i.devshell.lib {inherit (i.parent) pkgs;};
|
||||
soonix = i.soonix-lib.lib {inherit (i.parent) pkgs;};
|
||||
cilib = i.nix-gitlab-ci-lib.lib {inherit (i.parent) pkgs;};
|
||||
devtools = import "${i.parent.self}/lib" {inherit (i.parent) pkgs;};
|
||||
treefmt = import i.treefmt-nix;
|
||||
};
|
||||
}
|
||||
10
nix/repo/tests.nix
Normal file
10
nix/repo/tests.nix
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{inputs, ...}: let
|
||||
inherit (inputs) pkgs ntlib devshell;
|
||||
in {
|
||||
tests = ntlib.mkNixtest {
|
||||
modules = ntlib.autodiscover {dir = "${inputs.self}/lib/modules";};
|
||||
args = {
|
||||
inherit ntlib devshell pkgs;
|
||||
};
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue