diff --git a/lib/fusesocLib.nix b/lib/fusesocLib.nix index 8ef707e..28b6163 100644 --- a/lib/fusesocLib.nix +++ b/lib/fusesocLib.nix @@ -128,7 +128,7 @@ rec { in if (isNull stripped) then cond else builtins.head stripped; - resolveDeps = import ./resolveDeps.nix { inherit lib parseDependency; }; + resolveDeps = import ./resolveDeps.nix { inherit lib parseDependency unique; }; fetchProvider = core: hash: @@ -187,6 +187,18 @@ rec { } .${provider.name} or (throw "Unknown provider name: ${provider.name}"); + # uniquify by vlnv + unique = + coreList: + lib.mapAttrsToList (_: v: v) ( + builtins.listToAttrs ( + map (x: { + inherit (x.core) name; + value = x; + }) coreList + ) + ); + addCore = prevSet: coreDrv: let diff --git a/lib/resolveDeps.nix b/lib/resolveDeps.nix index b95557c..f242e3e 100644 --- a/lib/resolveDeps.nix +++ b/lib/resolveDeps.nix @@ -1,6 +1,7 @@ { lib, parseDependency, + unique, }: let parseDeps = @@ -11,15 +12,28 @@ let fetchDepsShallow = coreDrv: coreSet: - map ( - req: - let - core = coreSet.${req.vendor}.${req.library}.${req.name}; - default = core; # toplevel derivation is always the latest version - candidates = core.list; - in - lib.findFirst (dep: req.condition dep.version) default candidates - ) (parseDeps coreDrv); + builtins.filter (x: !(isNull x)) ( + map ( + req: + let + existing = builtins.filter ( + dep: + ({ inherit (dep.parsed) vendor library name; } == { inherit (req) vendor library name; }) + && (req.condition dep.version) + ) coreDrv.dependencies; + in + if existing != [ ] then + # Use existing dependency if already set + (builtins.head existing) + else + (lib.findFirst (dep: req.condition dep.version) null ( + coreSet.${req.vendor}.${req.library}.${req.name}.list or (lib.warn + "unable to find suitable dependency ${req.vendor}:${req.library}:${req.name} for core ${coreDrv.parsed.vendor}:${coreDrv.parsed.library}:${coreDrv.parsed.name}:${coreDrv.version}" + [ ] + ) + )) + ) (parseDeps coreDrv) + ); fetchDepsRecursive = coreDrv: coreSet: @@ -28,17 +42,5 @@ let in deps ++ (builtins.concatMap (dep: fetchDepsRecursive dep coreSet) deps); - # uniquify by vlnv - unique = - coreList: - lib.mapAttrsToList (_: v: v) ( - builtins.listToAttrs ( - map (x: { - inherit (x.core) name; - value = x; - }) coreList - ) - ); - in coreDrv: coreSet: unique (fetchDepsRecursive coreDrv coreSet)