From c5373a69fe440bada29f7e2fc41882890f7d0872 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Thu, 12 Dec 2019 23:00:20 +0000 Subject: feat(external): Implement builder function for externals Implements a builder function that calls the analysis tool on the provided source and builds up the required attribute set, including local dependencies. --- external/default.nix | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/external/default.nix b/external/default.nix index 79d559c05498..a065ab3331aa 100644 --- a/external/default.nix +++ b/external/default.nix @@ -1,8 +1,13 @@ # Copyright 2019 Google LLC. # SPDX-License-Identifier: Apache-2.0 -{ runCommand, go, jq, ripgrep, program }: +{ pkgs, program, package }: let + inherit (builtins) foldl'fromJSON head readFile replaceStrings tail throw; + inherit (pkgs) lib runCommand go jq ripgrep; + + pathToName = p: replaceStrings ["/"] ["_"] (toString p); + # Collect all non-vendored dependencies from the Go standard library # into a file that can be used to filter them out when processing # dependencies. @@ -26,4 +31,26 @@ let "main.stdlibList" = "${stdlibPackages}"; }; }; -in analyser + + mkset = path: value: + if path == [] then { gopkg = value; } + else { "${head path}" = mkset (tail path) value; }; + + toPackage = self: src: path: entry: package { + name = pathToName entry.name entry.name; + path = lib.concatStringsSep "/" ([ path ] ++ entry.locator); + srcs = map (f: src + ("/" + f)) entry.files; + deps = map (d: lib.attrByPath (d ++ [ "gopkg" ]) ( + throw "missing local dependency '${lib.concatStringsSep "." d}' in '${path}'" + ) self) entry.localDeps; + }; + +in { src, path, deps ? [] }: let + name = pathToName path; + analysisOutput = runCommand "${name}-structure.json" {} '' + ${analyser}/bin/analyser -path ${path} -source ${src} > $out + ''; + analysis = fromJSON (readFile analysisOutput); +in lib.fix(self: foldl' lib.recursiveUpdate {} ( + map (entry: mkset entry.locator (toPackage self src path entry)) analysis +)) -- cgit 1.4.1