This commit is contained in:
Lukas Wurzinger 2025-07-25 23:45:21 +02:00
commit 996bcd0fa1
No known key found for this signature in database
6 changed files with 329 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
flendor.json
vendor/

20
README.md Normal file
View file

@ -0,0 +1,20 @@
# flendor
Super simple flake input vendoring.
Example `flendor.json`:
```json
{
"vendor": "vendor",
"flakes": {
"musicomp": "git+https://forgejo.helveticanonstandard.net/helvetica/musicomp.git",
"hxwrap": "git+https://forgejo.helveticanonstandard.net/helvetica/hxwrap.git",
"myphps": "git+https://forgejo.helveticanonstandard.net/helvetica/myphps.git",
"forgesync": "git+https://forgejo.helveticanonstandard.net/helvetica/forgesync.git",
"nini": "git+https://forgejo.helveticanonstandard.net/helvetica/nini.git",
"xenumenu": "git+https://forgejo.helveticanonstandard.net/helvetica/xenumenu.git",
"mympv": "git+https://forgejo.helveticanonstandard.net/helvetica/mympv.git"
}
}
```

142
flake.lock generated Normal file
View file

@ -0,0 +1,142 @@
{
"nodes": {
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1753121425,
"narHash": "sha256-TVcTNvOeWWk1DXljFxVRp+E0tzG1LhrVjOGGoMHuXio=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "644e0fc48951a860279da645ba77fe4a6e814c5e",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1709087332,
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"hooks": {
"inputs": {
"flake-compat": "flake-compat",
"gitignore": "gitignore",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1750779888,
"narHash": "sha256-wibppH3g/E2lxU43ZQHC5yA/7kIKLGxVEnsnVK1BtRg=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "16ec914f6fb6f599ce988427d9d94efddf25fe6d",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1753250450,
"narHash": "sha256-i+CQV2rPmP8wHxj0aq4siYyohHwVlsh40kV89f3nw1s=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "fc02ee70efb805d3b2865908a13ddd4474557ecf",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1751159883,
"narHash": "sha256-urW/Ylk9FIfvXfliA1ywh75yszAbiTEVgpPeinFyVZo=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "14a40a1d7fb9afa4739275ac642ed7301a9ba1ab",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"root": {
"inputs": {
"flake-parts": "flake-parts",
"hooks": "hooks",
"nixpkgs": "nixpkgs",
"treefmt": "treefmt"
}
},
"treefmt": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1753439394,
"narHash": "sha256-Bv9h1AJegLI8uAhiJ1sZ4XAndYxhgf38tMgCQwiEpmc=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "2673921c03d6e75fdf4aa93e025772608d1482cf",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

62
flake.nix Normal file
View file

@ -0,0 +1,62 @@
{
description = "flendor";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-parts.url = "github:hercules-ci/flake-parts";
hooks = {
url = "github:cachix/git-hooks.nix";
inputs.nixpkgs.follows = "nixpkgs";
};
treefmt = {
url = "github:numtide/treefmt-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
{
self,
nixpkgs,
flake-parts,
hooks,
treefmt,
}@inputs:
flake-parts.lib.mkFlake { inherit inputs; } {
imports = [
hooks.flakeModule
treefmt.flakeModule
];
systems = nixpkgs.lib.systems.flakeExposed;
perSystem =
{
config,
pkgs,
...
}:
{
treefmt = {
projectRootFile = "flake.nix";
programs.nixfmt = {
enable = true;
package = pkgs.nixfmt-rfc-style;
};
};
pre-commit.settings.hooks = {
treefmt.enable = true;
};
devShells.default = pkgs.mkShellNoCC {
shellHook = ''
${config.pre-commit.installationScript}
'';
};
packages.default = pkgs.callPackage ./package.nix { };
};
};
}

90
flendor Executable file
View file

@ -0,0 +1,90 @@
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
progname=$0
warn() {
local line
for line in "$@"; do
echo "$progname: $line" 1>&2
done
}
error() {
warn "$@"
exit 1
}
args=$(
getopt \
--options t:rv \
--longoptions vendor:,refresh,verbose \
--name "$progname" \
-- "$@"
)
eval set -- "$args"
nixflags=()
rmflags=()
mkdirflags=()
cpflags=()
prefetchflags=()
verbose=false
while true; do
case $1 in
-d | --vendor)
vendor=$2
shift 2
;;
-r | --refresh)
prefetchflags+=(--refresh)
shift
;;
-v | --verbose)
nixflags+=(--verbose)
rmflags+=(--verbose)
mkdirflags+=(--verbose)
cpflags+=(--verbose)
verbose=true
shift
;;
--)
shift
break
;;
esac
done
if (($# > 0)); then
error 'too many arguments'
fi
json=$(< flendor.json)
if [[ ! -v vendor ]]; then
vendor=$(jq --exit-status --raw-output '.vendor' <<<"$json")
fi
while IFS= read -r k; do
name=$(jq --null-input --argjson k "$k" --raw-output '$k')
flake=$(jq --argjson k "$k" --raw-output '.flakes.[$k]' <<<"$json")
dest="$vendor/$name"
if [[ $verbose == true ]]; then
warn "copying flake $flake to $dest"
fi
rm --recursive --force "${rmflags[@]}" -- "$dest"
src=$(nix flake prefetch --json "${prefetchflags[@]}" -- "$flake" | jq --exit-status --raw-output '.storePath')
mkdir --parents "${mkdirflags[@]}" -- "$(dirname -- "$dest")"
cp --recursive --no-preserve all "${cpflags[@]}" -- "$src/." "$dest"
done < <(jq '.flakes | keys[]' <<<"$json")

13
package.nix Normal file
View file

@ -0,0 +1,13 @@
{
writeShellApplication,
jq,
}:
writeShellApplication {
name = "jq";
runtimeInputs = [
jq
];
text = builtins.readFile ./flendor;
}