Unverified Commit 58c1eb6e authored by SchweGELBin's avatar SchweGELBin
Browse files

mpv{,-unwrapped,Scripts}: move to by-name

parent b0543c3a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -373,8 +373,8 @@ pkgs/development/python-modules/buildcatrust/ @ajs124 @lukegb @mweinelt
/pkgs/development/lua-modules         @NixOS/lua

# mpvScripts
/pkgs/applications/video/mpv/scripts            @uninsane
/pkgs/applications/video/mpv/scripts.nix        @uninsane
/pkgs/by-name/mp/mpv/scripts     @uninsane
/pkgs/by-name/mp/mpv/scripts.nix @uninsane

# Neovim
/pkgs/applications/editors/neovim      @NixOS/neovim
+1 −1
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@

### Deprecations {#sec-nixpkgs-release-26.05-lib-deprecations}

- Create the first release note entry in this section!
- `mpv-unwrapped.scripts` and `mpv-unwrapped.wrapper` have been removed. Please use `mpvScripts` and `mpv.override` accordingly.


### Additions and Improvements {#sec-nixpkgs-release-26.05-lib-additions-improvements}
+0 −163
Original line number Diff line number Diff line
# Arguments that this derivation gets when it is created with `callPackage`
{
  stdenv,
  buildEnv,
  lib,
  makeBinaryWrapper,
  mpvScripts,
  symlinkJoin,
  writeTextDir,
  yt-dlp,
# the unwrapped mpv derivation
}:

let
  # arguments to the function (exposed as `mpv-unwrapped.wrapper` in top-level)
  wrapper =
    {
      mpv,
      extraMakeWrapperArgs ? [ ],
      youtubeSupport ? true,
      # a set of derivations (probably from `mpvScripts`) where each is expected
      # to have a `scriptName` passthru attribute that points to the name of the
      # script that would reside in the script's derivation's
      # `$out/share/mpv/scripts/`.
      #
      # A script can optionally also provide `passthru.extraWrapperArgs`
      # attribute.
      scripts ? [ ],
      extraUmpvWrapperArgs ? [ ],
    }:
    let
      binPath = lib.makeBinPath (
        [
          mpv.luaEnv
        ]
        ++ lib.optionals mpv.vapoursynthSupport [
          mpv.vapoursynth.python3
        ]
      );

      # With some tools, we want to prioritize tools that are in PATH. For example, users may want
      # to quickly expose a newer version of yt-dlp through the nix shell because it needs to be
      # kept up-to-date for it to work.
      fallbackBinPath = lib.makeBinPath (lib.optionals youtubeSupport [ yt-dlp ]);

      # All arguments besides the input and output binaries (${mpv}/bin/mpv and
      # $out/bin/mpv). These are used by the darwin specific makeWrapper call
      # used to wrap $out/Applications/mpv.app/Contents/MacOS/mpv as well.
      mostMakeWrapperArgs = lib.strings.escapeShellArgs (
        [
          "--inherit-argv0"
          # These are always needed (TODO: Explain why)
          "--prefix"
          "LUA_CPATH"
          ";"
          "${mpv.luaEnv}/lib/lua/${mpv.lua.luaversion}/?.so"
          "--prefix"
          "LUA_PATH"
          ";"
          "${mpv.luaEnv}/share/lua/${mpv.lua.luaversion}/?.lua"
        ]
        ++ lib.optionals mpv.vapoursynthSupport [
          "--prefix"
          "PYTHONPATH"
          ":"
          "${mpv.vapoursynth}/${mpv.vapoursynth.python3.sitePackages}"
        ]
        ++ lib.optionals (binPath != "") [
          "--prefix"
          "PATH"
          ":"
          binPath
        ]
        ++ lib.optionals (fallbackBinPath != "") [
          "--suffix"
          "PATH"
          ":"
          fallbackBinPath
        ]
        ++ (lib.lists.flatten (
          map
            # For every script in the `scripts` argument, add the necessary flags to the wrapper
            (
              script:
              let
                mkScriptArgs = script: scriptName: [
                  "--add-flags"
                  "--script=${script}/share/mpv/scripts/${scriptName}"
                ];
              in
              # Here we rely on the existence of the `scriptName` passthru
              # attribute of the script derivation from the `scripts`
              (mkScriptArgs script script.scriptName)
              # scripts might need others to be explicitly loaded
              ++ (map (extraScriptName: mkScriptArgs script extraScriptName) (script.extraScriptsToLoad or [ ]))
              # scripts can also set the `extraWrapperArgs` passthru
              ++ (script.extraWrapperArgs or [ ])
            )
            scripts
        ))
        ++ extraMakeWrapperArgs
      );
      umpvWrapperArgs = lib.strings.escapeShellArgs (
        [
          "--inherit-argv0"
          "--set"
          "MPV"
          "${placeholder "out"}/bin/mpv"
        ]
        ++ extraUmpvWrapperArgs
      );
    in
    symlinkJoin {
      name = "mpv-with-scripts-${mpv.version}";

      # TODO: don't link all mpv outputs and convert package to mpv-unwrapped?
      paths = [ mpv.all ];

      nativeBuildInputs = [ makeBinaryWrapper ];

      passthru.unwrapped = mpv;

      passthru.tests.mpv-scripts-should-not-collide = buildEnv {
        name = "mpv-scripts-env";
        paths = lib.pipe mpvScripts [
          # filters "override" "overrideDerivation" "recurseForDerivations"
          (lib.filterAttrs (key: script: lib.isDerivation script))
          # replaces unfree and meta.broken scripts with decent placeholders
          (lib.mapAttrsToList (
            key: script:
            if (builtins.tryEval script.outPath).success then
              script
            else
              writeTextDir "share/mpv/scripts/${script.scriptName}" "placeholder of ${script.name}"
          ))
        ];
      };

      postBuild = ''
        # wrapProgram can't operate on symlinks
        rm "$out/bin/mpv"
        makeWrapper "${mpv}/bin/mpv" "$out/bin/mpv" ${mostMakeWrapperArgs}
        rm "$out/bin/umpv"
        makeWrapper "${mpv}/bin/umpv" "$out/bin/umpv" ${umpvWrapperArgs}
      ''
      + lib.optionalString stdenv.hostPlatform.isDarwin ''
        # wrapProgram can't operate on symlinks
        rm "$out/Applications/mpv.app/Contents/MacOS/mpv"
        makeWrapper "${mpv}/Applications/mpv.app/Contents/MacOS/mpv" "$out/Applications/mpv.app/Contents/MacOS/mpv" ${mostMakeWrapperArgs}
      '';

      meta = {
        inherit (mpv.meta)
          homepage
          description
          longDescription
          maintainers
          ;
        mainProgram = "mpv";
      };
    };
in
lib.makeOverridable wrapper
+3 −4
Original line number Diff line number Diff line
@@ -5,11 +5,9 @@
  alsa-lib,
  bash,
  buildPackages,
  callPackage,
  config,
  docutils,
  fetchFromGitHub,
  fetchpatch,
  ffmpeg,
  freefont_ttf,
  freetype,
@@ -301,8 +299,9 @@ stdenv.mkDerivation (finalAttrs: {
      vapoursynth
      ;

    wrapper = callPackage ./wrapper.nix { };
    scripts = callPackage ./scripts.nix { };
    # Should be removed in the future. These can't be added to `pkgs/top-level/aliases.nix`.
    scripts = throw "'mpv-unwrapped.scripts' has been removed. Please use 'mpvScripts' instead."; # Added 2025-12-29
    wrapper = throw "'mpv-unwrapped.wrapper' has been removed. Please use 'mpv.override' instead."; # Added 2025-12-29

    tests = {
      inherit (nixosTests) mpv;
+154 −0
Original line number Diff line number Diff line
{
  stdenv,
  buildEnv,
  lib,
  makeBinaryWrapper,
  mpvScripts,
  mpv-unwrapped,
  symlinkJoin,
  writeTextDir,
  yt-dlp,
  extraMakeWrapperArgs ? [ ],
  youtubeSupport ? true,
  # a set of derivations (probably from `mpvScripts`) where each is expected
  # to have a `scriptName` passthru attribute that points to the name of the
  # script that would reside in the script's derivation's
  # `$out/share/mpv/scripts/`.
  #
  # A script can optionally also provide `passthru.extraWrapperArgs`
  # attribute.
  scripts ? [ ],
  extraUmpvWrapperArgs ? [ ],
}:

let
  binPath = lib.makeBinPath (
    [
      mpv-unwrapped.luaEnv
    ]
    ++ lib.optionals mpv-unwrapped.vapoursynthSupport [
      mpv-unwrapped.vapoursynth.python3
    ]
  );

  # With some tools, we want to prioritize tools that are in PATH. For example, users may want
  # to quickly expose a newer version of yt-dlp through the nix shell because it needs to be
  # kept up-to-date for it to work.
  fallbackBinPath = lib.makeBinPath (lib.optionals youtubeSupport [ yt-dlp ]);

  # All arguments besides the input and output binaries (${mpv-unwrapped}/bin/mpv and
  # $out/bin/mpv). These are used by the darwin specific makeWrapper call
  # used to wrap $out/Applications/mpv.app/Contents/MacOS/mpv as well.
  mostMakeWrapperArgs = lib.strings.escapeShellArgs (
    [
      "--inherit-argv0"
      # These are always needed (TODO: Explain why)
      "--prefix"
      "LUA_CPATH"
      ";"
      "${mpv-unwrapped.luaEnv}/lib/lua/${mpv-unwrapped.lua.luaversion}/?.so"
      "--prefix"
      "LUA_PATH"
      ";"
      "${mpv-unwrapped.luaEnv}/share/lua/${mpv-unwrapped.lua.luaversion}/?.lua"
    ]
    ++ lib.optionals mpv-unwrapped.vapoursynthSupport [
      "--prefix"
      "PYTHONPATH"
      ":"
      "${mpv-unwrapped.vapoursynth}/${mpv-unwrapped.vapoursynth.python3.sitePackages}"
    ]
    ++ lib.optionals (binPath != "") [
      "--prefix"
      "PATH"
      ":"
      binPath
    ]
    ++ lib.optionals (fallbackBinPath != "") [
      "--suffix"
      "PATH"
      ":"
      fallbackBinPath
    ]
    ++ (lib.lists.flatten (
      map
        # For every script in the `scripts` argument, add the necessary flags to the wrapper
        (
          script:
          let
            mkScriptArgs = script: scriptName: [
              "--add-flags"
              "--script=${script}/share/mpv/scripts/${scriptName}"
            ];
          in
          # Here we rely on the existence of the `scriptName` passthru
          # attribute of the script derivation from the `scripts`
          (mkScriptArgs script script.scriptName)
          # scripts might need others to be explicitly loaded
          ++ (map (extraScriptName: mkScriptArgs script extraScriptName) (script.extraScriptsToLoad or [ ]))
          # scripts can also set the `extraWrapperArgs` passthru
          ++ (script.extraWrapperArgs or [ ])
        )
        scripts
    ))
    ++ extraMakeWrapperArgs
  );
  umpvWrapperArgs = lib.strings.escapeShellArgs (
    [
      "--inherit-argv0"
      "--set"
      "MPV"
      "${placeholder "out"}/bin/mpv"
    ]
    ++ extraUmpvWrapperArgs
  );
in
symlinkJoin {
  name = "mpv-with-scripts-${mpv-unwrapped.version}";

  # TODO: don't link all mpv outputs
  paths = [ mpv-unwrapped.all ];

  nativeBuildInputs = [ makeBinaryWrapper ];

  passthru.unwrapped = mpv-unwrapped;

  passthru.tests.mpv-scripts-should-not-collide = buildEnv {
    name = "mpv-scripts-env";
    paths = lib.pipe mpvScripts [
      # filters "override" "overrideDerivation" "recurseForDerivations"
      (lib.filterAttrs (key: script: lib.isDerivation script))
      # replaces unfree and meta.broken scripts with decent placeholders
      (lib.mapAttrsToList (
        key: script:
        if (builtins.tryEval script.outPath).success then
          script
        else
          writeTextDir "share/mpv/scripts/${script.scriptName}" "placeholder of ${script.name}"
      ))
    ];
  };

  postBuild = ''
    # wrapProgram can't operate on symlinks
    rm "$out/bin/mpv"
    makeWrapper "${mpv-unwrapped}/bin/mpv" "$out/bin/mpv" ${mostMakeWrapperArgs}
    rm "$out/bin/umpv"
    makeWrapper "${mpv-unwrapped}/bin/umpv" "$out/bin/umpv" ${umpvWrapperArgs}
  ''
  + lib.optionalString stdenv.hostPlatform.isDarwin ''
    # wrapProgram can't operate on symlinks
    rm "$out/Applications/mpv.app/Contents/MacOS/mpv"
    makeWrapper "${mpv-unwrapped}/Applications/mpv.app/Contents/MacOS/mpv" "$out/Applications/mpv.app/Contents/MacOS/mpv" ${mostMakeWrapperArgs}
  '';

  meta = {
    inherit (mpv-unwrapped.meta)
      homepage
      description
      longDescription
      maintainers
      ;
    mainProgram = "mpv";
  };
}
Loading