commit 996bcd0fa1142f4306f522c5314d125dcae394c6 Author: Lukas Wurzinger Date: Fri Jul 25 23:45:21 2025 +0200 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b040ff2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +flendor.json +vendor/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..2f45113 --- /dev/null +++ b/README.md @@ -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" + } +} +``` diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..ecc0715 --- /dev/null +++ b/flake.lock @@ -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 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..c298f5a --- /dev/null +++ b/flake.nix @@ -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 { }; + }; + }; +} diff --git a/flendor b/flendor new file mode 100755 index 0000000..52db54e --- /dev/null +++ b/flendor @@ -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") diff --git a/package.nix b/package.nix new file mode 100644 index 0000000..bff4bda --- /dev/null +++ b/package.nix @@ -0,0 +1,13 @@ +{ + writeShellApplication, + jq, +}: +writeShellApplication { + name = "jq"; + + runtimeInputs = [ + jq + ]; + + text = builtins.readFile ./flendor; +}