commit 06b6c858d2bf39a6007942727825fd9df1577463 Author: Raito Bezarius Date: Fri Mar 22 02:39:04 2024 +0100 flakemelt: init Signed-off-by: Raito Bezarius diff --git a/README.md b/README.md new file mode 100644 index 0000000..22dc9e1 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# `flakemelt` + +Melt your vanilla Nix expressions into a Flake. diff --git a/bootstrap.nix b/bootstrap.nix new file mode 100644 index 0000000..0735cb6 --- /dev/null +++ b/bootstrap.nix @@ -0,0 +1,3 @@ +(import ./. { + lib = (import ./npins)."nixpkgs.lib" { }; +}) diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..6bd7d24 --- /dev/null +++ b/default.nix @@ -0,0 +1,38 @@ +{ + _bootstrapImportDependency ? + source: + if source ? outPath then _bootstrapImportDependency (import source) + else + let + evil = builtins.tryEval (source {}); + in + if evil.success then evil.result else source, + sources ? (import ./npins), nixpkgs-lib ? _bootstrapImportDependency sources.nixpkgs-lib, lib ? nixpkgs-lib.lib }: +{ + lib = rec { + importDependency = _bootstrapImportDependency; + melt = defaultNixFile: flakeInputs: + let + outputFun = import defaultNixFile; + dependencies = builtins.mapAttrs (n: s: importDependency s) sources; + outputs = + if builtins.isFunction outputFun then outputFun dependencies else outputFun; + in + outputs; + }; + + # This works because static. +# checks.x86_64-linux.test = derivation { +# name = "test-derivation"; +# builder = ":"; +# system = "x86_64-linux"; +# }; + + checks = lib.genAttrs [ "x86_64-linux" ] (system: { + test = derivation { + name = "test-derivation"; + builder = ":"; + inherit system; + }; + }); +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..b641dd2 --- /dev/null +++ b/flake.nix @@ -0,0 +1,3 @@ +{ + outputs = { ... }@inputs: (import ./bootstrap.nix).lib.melt ./default.nix inputs; +} diff --git a/npins/default.nix b/npins/default.nix new file mode 100644 index 0000000..4a7c372 --- /dev/null +++ b/npins/default.nix @@ -0,0 +1,47 @@ +# Generated by npins. Do not modify; will be overwritten regularly +let + data = builtins.fromJSON (builtins.readFile ./sources.json); + version = data.version; + + mkSource = spec: + assert spec ? type; let + path = + if spec.type == "Git" then mkGitSource spec + else if spec.type == "GitRelease" then mkGitSource spec + else if spec.type == "PyPi" then mkPyPiSource spec + else if spec.type == "Channel" then mkChannelSource spec + else builtins.throw "Unknown source type ${spec.type}"; + in + spec // { outPath = path; }; + + mkGitSource = { repository, revision, url ? null, hash, ... }: + assert repository ? type; + # At the moment, either it is a plain git repository (which has an url), or it is a GitHub/GitLab repository + # In the latter case, there we will always be an url to the tarball + if url != null then + (builtins.fetchTarball { + inherit url; + sha256 = hash; # FIXME: check nix version & use SRI hashes + }) + else assert repository.type == "Git"; builtins.fetchGit { + url = repository.url; + rev = revision; + # hash = hash; + }; + + mkPyPiSource = { url, hash, ... }: + builtins.fetchurl { + inherit url; + sha256 = hash; + }; + + mkChannelSource = { url, hash, ... }: + builtins.fetchTarball { + inherit url; + sha256 = hash; + }; +in +if version == 3 then + builtins.mapAttrs (_: mkSource) data.pins +else + throw "Unsupported format version ${toString version} in sources.json. Try running `npins upgrade`" diff --git a/npins/sources.json b/npins/sources.json new file mode 100644 index 0000000..59de645 --- /dev/null +++ b/npins/sources.json @@ -0,0 +1,17 @@ +{ + "pins": { + "nixpkgs-lib": { + "type": "Git", + "repository": { + "type": "GitHub", + "owner": "RaitoBezarius", + "repo": "nixpkgs.lib" + }, + "branch": "no-flakes", + "revision": "33ea5c4f5096de9796428d5137aa009834231dc9", + "url": "https://github.com/RaitoBezarius/nixpkgs.lib/archive/33ea5c4f5096de9796428d5137aa009834231dc9.tar.gz", + "hash": "0cg8b91xcs2z8qk7v5qd40019yhln2wph18p46khi6nwqs1w0mhs" + } + }, + "version": 3 +}