about summary refs log tree commit diff
path: root/nixpkgs/pkgs/tools/misc/bat-extras/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/tools/misc/bat-extras/default.nix')
-rw-r--r--nixpkgs/pkgs/tools/misc/bat-extras/default.nix145
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);
+}