bat-extras: heavily refactor (#379380)

This commit is contained in:
Yohann Boniface
2025-04-26 00:34:37 +02:00
committed by GitHub
11 changed files with 266 additions and 199 deletions
@@ -0,0 +1,77 @@
{
lib,
stdenv,
core,
bash,
bat,
fish,
getconf,
makeWrapper,
zsh,
}:
let
cleanArgs = lib.flip builtins.removeAttrs [
"dependencies"
"meta"
];
in
{
name,
dependencies,
meta ? { },
...
}@args:
stdenv.mkDerivation (
finalAttrs:
cleanArgs args
// {
inherit (core) version;
src = core;
nativeBuildInputs = [ makeWrapper ];
# Make the dependencies available to the tests.
buildInputs = dependencies;
# Patch shebangs now because our tests rely on them
postPatch = ''
patchShebangs --host bin/${name}
'';
dontConfigure = true;
dontBuild = true; # we've already built
doCheck = true;
nativeCheckInputs = [
bat
bash
fish
zsh
] ++ (lib.optionals stdenv.hostPlatform.isDarwin [ getconf ]);
checkPhase = ''
runHook preCheck
bash ./test.sh --compiled --suite ${name}
runHook postCheck
'';
installPhase =
''
runHook preInstall
mkdir -p $out/bin
cp -p bin/${name} $out/bin/${name}
''
+ lib.optionalString (dependencies != [ ]) ''
wrapProgram $out/bin/${name} \
--prefix PATH : ${lib.makeBinPath dependencies}
''
+ ''
runHook postInstall
'';
# We already patched
dontPatchShebangs = true;
meta = core.meta // { mainProgram = name; } // meta;
}
)
+10 -198
View File
@@ -1,200 +1,12 @@
{
lib,
stdenv,
fetchFromGitHub,
makeWrapper,
bat,
# batdiff, batgrep, and batwatch
coreutils,
getconf,
less,
# tests
bash,
zsh,
fish,
# batgrep
ripgrep,
# prettybat
withShFmt ? shfmt != null,
shfmt ? null,
withPrettier ? nodePackages ? prettier,
nodePackages ? null,
withClangTools ? clang-tools != null,
clang-tools ? null,
withRustFmt ? rustfmt != null,
rustfmt ? null,
# batwatch
withEntr ? entr != null,
entr ? null,
# batdiff
gitMinimal,
withDelta ? delta != null,
delta ? null,
# batman
util-linux,
}:
{ }:
self: {
buildBatExtrasPkg = self.callPackage ./buildBatExtrasPkg.nix { };
let
# Core derivation that all the others are based on.
# This includes the complete source so the per-script derivations can run the tests.
core = stdenv.mkDerivation rec {
pname = "bat-extras";
version = "2024.07.10";
src = fetchFromGitHub {
owner = "eth-p";
repo = "bat-extras";
rev = "v${version}";
hash = "sha256-6IRAKSy5f/WcQZBcJKVSweTjHLznzdxhsyx074bXnUQ=";
fetchSubmodules = true;
};
# bat needs to be in the PATH during building so EXECUTABLE_BAT picks it up
nativeBuildInputs = [ bat ];
dontConfigure = true;
patches = [ ./disable-theme-tests.patch ];
postPatch = ''
patchShebangs --build test.sh test/shimexec .test-framework/bin/best.sh
'';
buildPhase = ''
runHook preBuild
bash ./build.sh --minify=none --no-verify
runHook postBuild
'';
# Run the library tests as they don't have external dependencies
doCheck = true;
nativeCheckInputs = [
bash
fish
zsh
] ++ (lib.optionals stdenv.hostPlatform.isDarwin [ getconf ]);
checkPhase = ''
runHook preCheck
# test list repeats suites. Unique them
declare -A test_suites
while read -r action arg _; do
[[ "$action" == "test_suite" && "$arg" == lib_* ]] &&
test_suites+=(["$arg"]=1)
done <<<"$(./test.sh --compiled --list --porcelain)"
(( ''${#test_suites[@]} != 0 )) || {
echo "Couldn't find any library test suites"
exit 1
}
./test.sh --compiled $(printf -- "--suite %q\n" "''${!test_suites[@]}")
runHook postCheck
'';
installPhase = ''
runHook preInstall
cp -a . $out
runHook postInstall
'';
# A few random files have shebangs. Don't patch them, they don't make it into the final output.
# The per-script derivations will go ahead and patch the files they actually install.
dontPatchShebangs = true;
meta = with lib; {
description = "Bash scripts that integrate bat with various command line tools";
homepage = "https://github.com/eth-p/bat-extras";
license = with licenses; [ mit ];
maintainers = with maintainers; [ bbigras ];
platforms = platforms.all;
};
};
script =
name: # the name of the script
dependencies: # the tools we need to prefix onto PATH
stdenv.mkDerivation {
pname = name;
inherit (core) version;
src = core;
nativeBuildInputs = [ makeWrapper ];
# Make the dependencies available to the tests.
buildInputs = dependencies;
# Patch shebangs now because our tests rely on them
postPatch = ''
patchShebangs --host bin/${name}
'';
dontConfigure = true;
dontBuild = true; # we've already built
doCheck = true;
nativeCheckInputs = [
bat
bash
fish
zsh
] ++ (lib.optionals stdenv.hostPlatform.isDarwin [ getconf ]);
checkPhase = ''
runHook preCheck
bash ./test.sh --compiled --suite ${name}
runHook postCheck
'';
installPhase =
''
runHook preInstall
mkdir -p $out/bin
cp -p bin/${name} $out/bin/${name}
''
+ lib.optionalString (dependencies != [ ]) ''
wrapProgram $out/bin/${name} \
--prefix PATH : ${lib.makeBinPath dependencies}
''
+ ''
runHook postInstall
'';
# We already patched
dontPatchShebangs = true;
meta = core.meta // {
mainProgram = name;
};
};
optionalDep =
cond: dep:
assert cond -> dep != null;
lib.optional cond dep;
in
{
batdiff = script "batdiff" (
[
less
coreutils
gitMinimal
]
++ optionalDep withDelta delta
);
batgrep = script "batgrep" [
less
coreutils
ripgrep
];
batman = script "batman" (lib.optionals stdenv.hostPlatform.isLinux [ util-linux ]);
batpipe = script "batpipe" [ less ];
batwatch = script "batwatch" (
[
less
coreutils
]
++ optionalDep withEntr entr
);
prettybat = script "prettybat" (
[ ]
++ optionalDep withShFmt shfmt
++ optionalDep withPrettier nodePackages.prettier
++ optionalDep withClangTools clang-tools
++ optionalDep withRustFmt rustfmt
);
core = self.callPackage ./modules/core.nix { };
batdiff = self.callPackage ./modules/batdiff.nix { };
batgrep = self.callPackage ./modules/batgrep.nix { };
batman = self.callPackage ./modules/batman.nix { };
batpipe = self.callPackage ./modules/batpipe.nix { };
batwatch = self.callPackage ./modules/batwatch.nix { };
prettybat = self.callPackage ./modules/prettybat.nix { };
}
@@ -0,0 +1,18 @@
{
lib,
buildBatExtrasPkg,
less,
coreutils,
gitMinimal,
delta,
withDelta ? true,
}:
buildBatExtrasPkg {
name = "batdiff";
dependencies = [
less
coreutils
gitMinimal
] ++ lib.optional withDelta delta;
meta.description = "Diff a file against the current git index, or display the diff between two files";
}
@@ -0,0 +1,15 @@
{
buildBatExtrasPkg,
less,
coreutils,
ripgrep,
}:
buildBatExtrasPkg {
name = "batgrep";
dependencies = [
less
coreutils
ripgrep
];
meta.description = "Quickly search through and highlight files using ripgrep";
}
@@ -0,0 +1,11 @@
{
lib,
stdenv,
buildBatExtrasPkg,
util-linux,
}:
buildBatExtrasPkg {
name = "batman";
dependencies = lib.optional stdenv.targetPlatform.isLinux util-linux;
meta.description = "Read system manual pages (man) using bat as the manual page formatter";
}
@@ -0,0 +1,9 @@
{
buildBatExtrasPkg,
less,
}:
buildBatExtrasPkg {
name = "batpipe";
dependencies = [ less ];
meta.description = "less (and soon bat) preprocessor for viewing more types of files in the terminal";
}
@@ -0,0 +1,17 @@
{
lib,
buildBatExtrasPkg,
less,
coreutils,
entr,
withEntr ? true,
}:
buildBatExtrasPkg {
name = "batwatch";
dependencies = [
less
coreutils
] ++ lib.optional withEntr entr;
meta.description = "Watch for changes in one or more files, and print them with bat";
}
@@ -0,0 +1,86 @@
{
lib,
fetchFromGitHub,
stdenv,
bash,
bat,
fish,
getconf,
nix-update-script,
zsh,
}:
stdenv.mkDerivation rec {
pname = "bat-extras";
version = "2024.08.24";
src = fetchFromGitHub {
owner = "eth-p";
repo = "bat-extras";
tag = "v${version}";
hash = "sha256-xkND/w6UNC58dC8WrsifwjqU9ZI4yUUq+ZljkhhUNT8=";
fetchSubmodules = true;
};
# bat needs to be in the PATH during building so EXECUTABLE_BAT picks it up
nativeBuildInputs = [ bat ];
dontConfigure = true;
patches = [ ../patches/disable-theme-tests.patch ];
postPatch = ''
patchShebangs --build test.sh test/shimexec .test-framework/bin/best.sh
'';
buildPhase = ''
runHook preBuild
bash ./build.sh --minify=none --no-verify
runHook postBuild
'';
# Run the library tests as they don't have external dependencies
doCheck = true;
nativeCheckInputs = [
bash
fish
zsh
] ++ (lib.optionals stdenv.hostPlatform.isDarwin [ getconf ]);
checkPhase = ''
runHook preCheck
# test list repeats suites. Unique them
declare -A test_suites
while read -r action arg _; do
[[ "$action" == "test_suite" && "$arg" == lib_* ]] &&
test_suites+=(["$arg"]=1)
done <<<"$(./test.sh --compiled --list --porcelain)"
(( ''${#test_suites[@]} != 0 )) || {
echo "Couldn't find any library test suites"
exit 1
}
./test.sh --compiled $(printf -- "--suite %q\n" "''${!test_suites[@]}")
runHook postCheck
'';
installPhase = ''
runHook preInstall
cp -a . $out
runHook postInstall
'';
# A few random files have shebangs. Don't patch them, they don't make it into the final output.
# The per-script derivations will go ahead and patch the files they actually install.
dontPatchShebangs = true;
passthru.updateScript = nix-update-script { };
meta = {
description = "Bash scripts that integrate bat with various command line tools";
homepage = "https://github.com/eth-p/bat-extras";
license = with lib.licenses; [ mit ];
maintainers = with lib.maintainers; [
bbigras
perchun
];
platforms = lib.platforms.all;
};
}
@@ -0,0 +1,22 @@
{
lib,
buildBatExtrasPkg,
shfmt,
nodePackages,
clang-tools,
rustfmt,
withShFmt ? true,
withPrettier ? true,
withClangTools ? true,
withRustFmt ? true,
}:
buildBatExtrasPkg {
name = "prettybat";
dependencies =
lib.optional withShFmt shfmt
++ lib.optional withPrettier nodePackages.prettier
++ lib.optional withClangTools clang-tools
++ lib.optional withRustFmt rustfmt;
meta.description = "Pretty-print source code and highlight it with bat";
}
+1 -1
View File
@@ -2055,7 +2055,7 @@ with pkgs;
babelfish = callPackage ../shells/fish/babelfish.nix { };
bat-extras = recurseIntoAttrs (callPackages ../tools/misc/bat-extras { });
bat-extras = recurseIntoAttrs (lib.makeScope newScope (callPackage ../tools/misc/bat-extras { }));
beauty-line-icon-theme = callPackage ../data/icons/beauty-line-icon-theme {
inherit (plasma5Packages) breeze-icons;