15 Commits

Author SHA1 Message Date
eric
e445e49baf chore(release): v1.0.5 2026-03-04 09:35:15 +01:00
eric
ef3cf30a34 fix: expose releases as well 2026-03-04 09:35:05 +01:00
eric
86a0792b6e chore(release): v1.0.4 2026-03-04 08:48:24 +01:00
eric
d1aea76dd9 fix: formatting 2026-03-04 08:48:16 +01:00
eric
cdc9e18035 chore(release): v1.0.3 2026-03-04 08:25:29 +01:00
eric
374ba596ab fix: spacing 2026-03-04 08:25:21 +01:00
eric
ffeede1dca chore(release): v1.0.2 2026-03-04 08:21:29 +01:00
eric
a7c17bc738 feat: add more colors 2026-03-04 08:21:20 +01:00
eric
7e93c5267a chore(release): v1.0.1 2026-03-04 07:57:14 +01:00
eric
fd7a2ca07d fix: sed issue with parsing 2026-03-04 07:56:34 +01:00
eric
d7d6a42d48 feat: add tag ref to install commands 2026-03-04 07:55:03 +01:00
eric
3a5cdb5900 chore(release): v1.0.0 2026-03-04 07:47:46 +01:00
eric
d8f92486c3 feat: add VERSION to exclude list in vscode 2026-03-04 07:47:34 +01:00
eric
f6c6e97707 chore(release): v0.0.5 2026-03-04 07:36:13 +01:00
eric
c976621357 chore: re-release to test 2 2026-03-04 07:36:05 +01:00
5 changed files with 177 additions and 57 deletions

72
README.md Normal file
View File

@@ -0,0 +1,72 @@
# repo-lib
Simple Nix flake library for:
- a shared development shell (`mkDevShell`)
- an optional release command (`mkRelease`)
- a starter template (`template/`)
## Prerequisites
- [Nix](https://nixos.org/download/) with flakes enabled
- [`direnv`](https://direnv.net/) (recommended)
## Use the template (new repo)
From your new project folder:
```bash
nix flake new myapp -t 'git+https://git.dgren.dev/eric/nix-flake-lib?ref=v1.0.5#default' --refresh
```
## Use the library (existing repo)
Add this flake input:
```nix
inputs.devshell-lib.url = "git+https://git.dgren.dev/eric/nix-flake-lib?ref=v1.0.5";
inputs.devshell-lib.inputs.nixpkgs.follows = "nixpkgs";
```
Create your shell from `mkDevShell`:
```nix
env = devshell-lib.lib.mkDevShell {
inherit system;
extraPackages = [ ];
tools = [ ];
additionalHooks = { };
};
```
Expose it in `devShells` as `default` and run:
```bash
nix develop
```
## Common commands
```bash
nix fmt # format files
```
## Optional: release command
If your flake defines:
```nix
packages.${system}.release = devshell-lib.lib.mkRelease { inherit system; };
```
Run releases with:
```bash
release
release patch
release minor beta
release stable
release set 1.2.3
```
The release script uses `./VERSION` as the source of truth and creates tags like `v1.2.3`.

View File

@@ -1,3 +1,3 @@
0.0.4 1.0.5
stable stable
0 0

View File

@@ -95,6 +95,11 @@
// additionalHooks; // additionalHooks;
}; };
toolNameWidth = builtins.foldl' (
maxWidth: t: pkgs.lib.max maxWidth (builtins.stringLength t.name)
) 0 tools;
toolLabelWidth = toolNameWidth + 1;
toolBannerScript = pkgs.lib.concatMapStrings ( toolBannerScript = pkgs.lib.concatMapStrings (
t: t:
let let
@@ -102,7 +107,8 @@
in in
'' ''
if command -v ${t.bin} >/dev/null 2>&1; then if command -v ${t.bin} >/dev/null 2>&1; then
printf " $CYAN ${t.name}:$RESET\t${colorVar}%s$RESET\n" "$(${t.bin} ${t.versionCmd})" version="$(${t.bin} ${t.versionCmd} 2>/dev/null | head -n 1 | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')"
printf " $CYAN %-${toString toolLabelWidth}s$RESET ${colorVar}%s$RESET\n" "${t.name}:" "$version"
fi fi
'' ''
) tools; ) tools;
@@ -129,6 +135,12 @@
CYAN='\033[1;36m' CYAN='\033[1;36m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
BLUE='\033[1;34m' BLUE='\033[1;34m'
RED='\033[1;31m'
MAGENTA='\033[1;35m'
WHITE='\033[1;37m'
GRAY='\033[0;90m'
BOLD='\033[1m'
UNDERLINE='\033[4m'
RESET='\033[0m' RESET='\033[0m'
printf "\n$GREEN 🚀 Dev shell ready$RESET\n\n" printf "\n$GREEN 🚀 Dev shell ready$RESET\n\n"
@@ -248,8 +260,12 @@
release = [ release = [
{ {
run = '' run = ''
sed -E -i "s#^([[:space:]]*devshell-lib\\.url = \")git\\+https://git\\.dgren\\.dev/eric/nix-flake-lib[^"]*(\";)#\\1git+https://git.dgren.dev/eric/nix-flake-lib?ref=$FULL_TAG\\2#" "$ROOT_DIR/template/flake.nix" sed -E -i "s#^([[:space:]]*devshell-lib\\.url = \")git\\+https://git\\.dgren\\.dev/eric/nix-flake-lib[^\"]*(\";)#\\1git+https://git.dgren.dev/eric/nix-flake-lib?ref=$FULL_TAG\\2#" "$ROOT_DIR/template/flake.nix"
log "Updated template/flake.nix devshell-lib ref to $FULL_TAG" log "Updated template/flake.nix devshell-lib ref to $FULL_TAG"
sed -E -i "s|(nix flake new myapp -t ')git\\+https://git\\.dgren\\.dev/eric/nix-flake-lib[^']*(#default' --refresh)|\\1git+https://git.dgren.dev/eric/nix-flake-lib?ref=$FULL_TAG\\2|" "$ROOT_DIR/README.md"
sed -E -i "s#^([[:space:]]*inputs\\.devshell-lib\\.url = \")git\\+https://git\\.dgren\\.dev/eric/nix-flake-lib[^\"]*(\";)#\\1git+https://git.dgren.dev/eric/nix-flake-lib?ref=$FULL_TAG\\2#" "$ROOT_DIR/README.md"
log "Updated README.md devshell-lib refs to $FULL_TAG"
''; '';
} }
]; ];

10
template/.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,10 @@
{
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/.DS_Store": true,
"**/Thumbs.db": true,
"VERSION": true
}
}

View File

@@ -4,7 +4,7 @@
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
devshell-lib.url = "git+https://git.dgren.dev/eric/nix-flake-lib?ref=v0.0.2"; devshell-lib.url = "git+https://git.dgren.dev/eric/nix-flake-lib?ref=v1.0.5";
devshell-lib.inputs.nixpkgs.follows = "nixpkgs"; devshell-lib.inputs.nixpkgs.follows = "nixpkgs";
}; };
@@ -23,81 +23,102 @@
"aarch64-darwin" "aarch64-darwin"
]; ];
forAllSystems = nixpkgs.lib.genAttrs supportedSystems; forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
mkDevShellConfig = pkgs: {
# includeStandardPackages = false; # opt out of nixfmt/gitlint/gitleaks/shfmt defaults
extraPackages = with pkgs; [
# add your tools here, e.g.:
# go
# bun
# rustc
];
features = {
# oxfmt = true; # enables oxfmt + oxlint from nixpkgs
};
formatters = {
# shfmt.enable = true;
# gofmt.enable = true;
};
formatterSettings = {
# shfmt.options = [ "-i" "2" "-s" "-w" ];
# oxfmt.includes = [ "*.ts" "*.tsx" "*.js" "*.json" ];
};
additionalHooks = {
tests = {
enable = true;
entry = "echo 'No tests defined yet.'"; # replace with your test command
pass_filenames = false;
stages = [ "pre-push" ];
};
# my-hook = {
# enable = true;
# entry = "${pkgs.some-tool}/bin/some-tool";
# pass_filenames = false;
# };
};
tools = [
# { name = "Bun"; bin = "${pkgs.bun}/bin/bun"; versionCmd = "--version"; color = "YELLOW"; }
# { name = "Go"; bin = "${pkgs.go}/bin/go"; versionCmd = "version"; color = "CYAN"; }
# { name = "Rust"; bin = "${pkgs.rustc}/bin/rustc"; versionCmd = "--version"; color = "YELLOW"; }
];
extraShellHook = ''
# any repo-specific shell setup here
'';
};
in in
{ {
devShells = forAllSystems ( devShells = forAllSystems (
system: system:
let let
pkgs = import nixpkgs { inherit system; }; pkgs = import nixpkgs { inherit system; };
env = devshell-lib.lib.mkDevShell { config = mkDevShellConfig pkgs;
inherit system; env = devshell-lib.lib.mkDevShell (
({ inherit system; } // config)
# includeStandardPackages = false; # opt out of nixfmt/gitlint/gitleaks/shfmt defaults // {
extraPackages = config.extraPackages ++ [ self.packages.${system}.release ];
extraPackages = with pkgs; [ }
# add your tools here, e.g.: );
# go
# bun
# rustc
];
features = {
# oxfmt = true; # enables oxfmt + oxlint from nixpkgs
};
formatters = {
# shfmt.enable = true;
# gofmt.enable = true;
};
formatterSettings = {
# shfmt.options = [ "-i" "2" "-s" "-w" ];
# oxfmt.includes = [ "*.ts" "*.tsx" "*.js" "*.json" ];
};
additionalHooks = {
tests = {
enable = true;
entry = "echo 'No tests defined yet.'"; # replace with your test command
pass_filenames = false;
stages = [ "pre-push" ];
};
# my-hook = {
# enable = true;
# entry = "${pkgs.some-tool}/bin/some-tool";
# pass_filenames = false;
# };
};
tools = [
# { name = "Bun"; bin = "${pkgs.bun}/bin/bun"; versionCmd = "--version"; color = "YELLOW"; }
# { name = "Go"; bin = "${pkgs.go}/bin/go"; versionCmd = "version"; color = "CYAN"; }
# { name = "Rust"; bin = "${pkgs.rustc}/bin/rustc"; versionCmd = "--version"; color = "YELLOW"; }
];
extraShellHook = ''
# any repo-specific shell setup here
'';
};
in in
{ {
default = env.shell; default = env.shell;
} }
); );
packages = forAllSystems (system: {
release = devshell-lib.lib.mkRelease {
inherit system;
};
});
checks = forAllSystems ( checks = forAllSystems (
system: system:
let let
env = devshell-lib.lib.mkDevShell { inherit system; }; pkgs = import nixpkgs { inherit system; };
config = mkDevShellConfig pkgs;
env = devshell-lib.lib.mkDevShell ({ inherit system; } // config);
in in
{ {
inherit (env) pre-commit-check; inherit (env) pre-commit-check;
} }
); );
formatter = forAllSystems (system: (devshell-lib.lib.mkDevShell { inherit system; }).formatter); formatter = forAllSystems (
system:
let
pkgs = import nixpkgs { inherit system; };
config = mkDevShellConfig pkgs;
in
(devshell-lib.lib.mkDevShell ({ inherit system; } // config)).formatter
);
# Optional: release command (`release`) # Release command (`release`)
# #
# The release script always updates VERSION first, then: # The release script always updates VERSION first, then:
# 1) runs release steps in order (file writes and scripts) # 1) runs release steps in order (file writes and scripts)
@@ -107,6 +128,7 @@
# Runtime env vars available in release.run/postVersion: # Runtime env vars available in release.run/postVersion:
# BASE_VERSION, CHANNEL, PRERELEASE_NUM, FULL_VERSION, FULL_TAG # BASE_VERSION, CHANNEL, PRERELEASE_NUM, FULL_VERSION, FULL_TAG
# #
# To customize release behavior in your repo, edit:
# packages = forAllSystems ( # packages = forAllSystems (
# system: # system:
# { # {