klarkc / purenix-packages

PureNix package sets powered by purs-nix.
MIT License
1 stars 0 forks source link

we should not assume package-set-repo@0.0.1 #4

Open github-actions[bot] opened 1 year ago

github-actions[bot] commented 1 year ago

https://api.github.com/klarkc/purenix-packages/blob/38a3a467a7b0f328dd2dcfd70fd9eaade635078b/nix/package-set/generate.nix#L10


# this is basically purs-nix/purs-nix official generator
# but accepting arguments and adapted to purenix registry
package-set-repo: official-package-set-repo: pkgs:
let
  b = builtins;
  p = pkgs;
  l = p.lib;
  make-info-version = l.strings.removePrefix "v";
  official-packages = l.importJSON (official-package-set-repo + /packages.json);
  # FIXME we should not assume package-set-repo@0.0.1
  package-set = l.importJSON (package-set-repo + /package-sets/0.0.1.json);
  package-set-entries = l.mapAttrsToList (n: v: { inherit n v; }) package-set.packages;
  escape-reserved-word = ps-pkgs: str:
    let
      reserved-words = [ "assert" ];
    in
    if b.elem str reserved-words then
      if ps-pkgs then ''ps-pkgs."${str}"''
      else ''"${str}"''
    else
      str;
  package-set-str = b.foldl'
    (acc: { n, v }:
      let
        isOfficial = let is = b.isString v; in b.trace "${l.strings.optionalString is "Official "}${n}" is;
        package =
          if isOfficial
          then official-packages.${n}
          else (l.importJSON (repo + /${v.subdir}/purifix.json)).package;
        version =
          if isOfficial
          then v
          else make-info-version package.version;
        ref =
          if isOfficial
          then "refs/tags/v${version}"
          else v.ref;
        url =
          if isOfficial
          then official-packages.${n}.repo
          else "${v.git}?path=${v.subdir}";
        repo = b.fetchGit {
          inherit url;
          ${if isOfficial then "ref" else "rev"} = ref;
          ${if isOfficial then null else "allRefs"} = true;
        };
        assertVersion = assert (b.trace "${n} ${v} == ${version}?" v) == version; b.trace "true";
        cur = ''
          ${escape-reserved-word false n} =
            { src.git =
                { repo = "${url}";
                  rev = "${repo.rev}";
                };
              info =
                { version = "${version}";
                  dependencies =
                    [ ${b.foldl'
                          (acc: d: acc + escape-reserved-word true d + " ")
                          ""
                          package.dependencies
                      }
                    ];
                };
            };
        '';
        evaluate = c:
          if isOfficial
          then assertVersion c
          else c;
      in
      acc + evaluate cur)
    ""
    package-set-entries;
in
p.writeText "" ''
  ps-pkgs:
    with ps-pkgs;
    { ${package-set-str} }
''