diff options
Diffstat (limited to 'nixpkgs/pkgs/tools/misc/bat-extras/default.nix')
-rw-r--r-- | nixpkgs/pkgs/tools/misc/bat-extras/default.nix | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/tools/misc/bat-extras/default.nix b/nixpkgs/pkgs/tools/misc/bat-extras/default.nix new file mode 100644 index 000000000000..36adc09cdba1 --- /dev/null +++ b/nixpkgs/pkgs/tools/misc/bat-extras/default.nix @@ -0,0 +1,145 @@ +{ stdenv, callPackage, fetchFromGitHub, bash, makeWrapper, bat +# batdiff, batgrep, and batwatch +, coreutils +, less +# 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 ? gitAndTools?delta, gitAndTools ? null +}: + +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"; + # there hasn't been a release since 2020-05-01 but there are important bugfixes + # to the test suite so we'll pull the latest commit as of 2020-06-17. + version = "20200515-dev"; # latest commit was dated 2020-05-15 + + src = fetchFromGitHub { + owner = "eth-p"; + repo = pname; + rev = "3029b6749f61f7514e9eef30e035cfab0e31eb1d"; + sha256 = "08mb94k2n182ql97c5s5j1v7np25ivynn5g0418whrx11ra41wr7"; + fetchSubmodules = true; + }; + + # bat needs to be in the PATH during building so EXECUTABLE_BAT picks it up + nativeBuildInputs = [ bash bat ]; + + dontConfigure = true; + + 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; + 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 <<<"$(bash ./test.sh --compiled --list --porcelain)" + (( ''${#test_suites[@]} != 0 )) || { + echo "Couldn't find any library test suites" + exit 1 + } + bash ./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 stdenv.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 lilyball ]; + platforms = platforms.all; + }; + }; + script = + name: # the name of the script + dependencies: # the tools we need to prefix onto PATH + stdenv.mkDerivation { + pname = "${core.pname}-${name}"; + inherit (core) version; + + src = core; + + nativeBuildInputs = [ bash 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; + 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} + '' + stdenv.lib.optionalString (dependencies != []) '' + wrapProgram $out/bin/${name} \ + --prefix PATH : ${stdenv.lib.makeBinPath dependencies} + '' + '' + runHook postInstall + ''; + + # We already patched + dontPatchShebangs = true; + + inherit (core) meta; + }; + optionalDep = cond: dep: + assert cond -> dep != null; + stdenv.lib.optional cond dep; +in +{ + batdiff = script "batdiff" ([ less coreutils gitMinimal ] ++ optionalDep withDelta gitAndTools.delta); + batgrep = script "batgrep" [ less coreutils ripgrep ]; + batman = script "batman" []; + 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); +} |