{ config, lib, withSystem, self, ... }: let collectFlakeOutputs = { config, pkgs }: let inherit (pkgs) lib; collectDrvs = prefix: attrs: let drvs = lib.pipe attrs [ (lib.filterAttrs (_: lib.isDerivation)) (lib.mapAttrsToList ( name: drv: { name = lib.concatStringsSep "." (prefix ++ [ name ]); inherit drv; } )) ]; recursed = lib.pipe attrs [ (lib.filterAttrs ( _: val: (!lib.isDerivation val) && (lib.isAttrs val) && (val.recurseForDerivations or true) )) (lib.mapAttrsToList (name: collectDrvs (prefix ++ [ name ]))) ]; in drvs ++ (lib.flatten recursed); rootOutputs = builtins.removeAttrs config.onPush.default.outputs [ "effects" ]; in collectDrvs [ ] rootOutputs; in { defaultEffectSystem = "aarch64-linux"; hercules-ci = { flake-update = { enable = true; when.dayOfWeek = "Mon"; }; }; herculesCI = herculesCI: { onPush.default = { outputs.effects = { pin-cache = withSystem config.defaultEffectSystem ( { pkgs, hci-effects, ... }: let collected = collectFlakeOutputs { inherit (herculesCI) config; inherit pkgs; }; cachixCommands = lib.concatMapStringsSep "\n" ( { name, drv }: "cachix pin nrabulinski ${lib.escapeShellArg name} ${lib.escapeShellArg drv}" ) collected; in hci-effects.runIf (herculesCI.config.repo.branch == "main") ( hci-effects.mkEffect { secretsMap."cachix-token" = "cachix-token"; inputs = [ pkgs.cachix ]; userSetupScript = '' cachix authtoken $(readSecretString cachix-token .token) ''; # Discarding the context is fine here because we don't actually want to build those derivations. # They have already been built as part of this job, # we only want to pin them to make sure cachix doesn't GC them. effectScript = builtins.unsafeDiscardStringContext cachixCommands; } ) ); }; }; }; perSystem = { pkgs, lib, ... }: rec { legacyPackages.outputsList = let config = self.herculesCI { primaryRepo = { }; herculesCI = { }; }; in collectFlakeOutputs { inherit config pkgs; }; legacyPackages.github-matrix = let systems = lib.groupBy ({ drv, ... }: drv.system) legacyPackages.outputsList; in lib.concatMapStringsSep "\n" ( { name, value }: '' ${name}=${builtins.toJSON (map (d: d.name) value)} '' ) (lib.attrsToList systems); }; }