python312Packages.mandown: 1.10.0 -> 1.10.1 (#370595)
[NixPkgs.git] / pkgs / tools / misc / bat-extras / default.nix
blobfa2dd823ec8bde107205b0c7bb09448be608c877
2   lib,
3   stdenv,
4   fetchFromGitHub,
5   makeWrapper,
6   bat,
7   # batdiff, batgrep, and batwatch
8   coreutils,
9   getconf,
10   less,
11   # tests
12   bash,
13   zsh,
14   fish,
15   # batgrep
16   ripgrep,
17   # prettybat
18   withShFmt ? shfmt != null,
19   shfmt ? null,
20   withPrettier ? nodePackages ? prettier,
21   nodePackages ? null,
22   withClangTools ? clang-tools != null,
23   clang-tools ? null,
24   withRustFmt ? rustfmt != null,
25   rustfmt ? null,
26   # batwatch
27   withEntr ? entr != null,
28   entr ? null,
29   # batdiff
30   gitMinimal,
31   withDelta ? delta != null,
32   delta ? null,
33   # batman
34   util-linux,
37 let
38   # Core derivation that all the others are based on.
39   # This includes the complete source so the per-script derivations can run the tests.
40   core = stdenv.mkDerivation rec {
41     pname = "bat-extras";
42     version = "2024.07.10";
44     src = fetchFromGitHub {
45       owner = "eth-p";
46       repo = "bat-extras";
47       rev = "v${version}";
48       hash = "sha256-6IRAKSy5f/WcQZBcJKVSweTjHLznzdxhsyx074bXnUQ=";
49       fetchSubmodules = true;
50     };
52     # bat needs to be in the PATH during building so EXECUTABLE_BAT picks it up
53     nativeBuildInputs = [ bat ];
55     dontConfigure = true;
57     postPatch = ''
58       patchShebangs --build test.sh test/shimexec .test-framework/bin/best.sh
59     '';
61     buildPhase = ''
62       runHook preBuild
63       bash ./build.sh --minify=none --no-verify
64       runHook postBuild
65     '';
67     # Run the library tests as they don't have external dependencies
68     doCheck = true;
69     nativeCheckInputs = [
70       bash
71       fish
72       zsh
73     ] ++ (lib.optionals stdenv.hostPlatform.isDarwin [ getconf ]);
74     checkPhase = ''
75       runHook preCheck
76       # test list repeats suites. Unique them
77       declare -A test_suites
78       while read -r action arg _; do
79         [[ "$action" == "test_suite" && "$arg" == lib_* ]] &&
80         test_suites+=(["$arg"]=1)
81       done <<<"$(./test.sh --compiled --list --porcelain)"
82       (( ''${#test_suites[@]} != 0 )) || {
83         echo "Couldn't find any library test suites"
84         exit 1
85       }
86       ./test.sh --compiled $(printf -- "--suite %q\n" "''${!test_suites[@]}")
87       runHook postCheck
88     '';
90     installPhase = ''
91       runHook preInstall
92       cp -a . $out
93       runHook postInstall
94     '';
96     # A few random files have shebangs. Don't patch them, they don't make it into the final output.
97     # The per-script derivations will go ahead and patch the files they actually install.
98     dontPatchShebangs = true;
100     meta = with lib; {
101       description = "Bash scripts that integrate bat with various command line tools";
102       homepage = "https://github.com/eth-p/bat-extras";
103       license = with licenses; [ mit ];
104       maintainers = with maintainers; [ bbigras ];
105       platforms = platforms.all;
106     };
107   };
108   script =
109     name: # the name of the script
110     dependencies: # the tools we need to prefix onto PATH
111     stdenv.mkDerivation {
112       pname = name;
113       inherit (core) version;
115       src = core;
117       nativeBuildInputs = [ makeWrapper ];
118       # Make the dependencies available to the tests.
119       buildInputs = dependencies;
121       # Patch shebangs now because our tests rely on them
122       postPatch = ''
123         patchShebangs --host bin/${name}
124       '';
126       dontConfigure = true;
127       dontBuild = true; # we've already built
129       doCheck = true;
130       nativeCheckInputs = [
131         bat
132         bash
133         fish
134         zsh
135       ] ++ (lib.optionals stdenv.hostPlatform.isDarwin [ getconf ]);
136       checkPhase = ''
137         runHook preCheck
138         bash ./test.sh --compiled --suite ${name}
139         runHook postCheck
140       '';
142       installPhase =
143         ''
144           runHook preInstall
145           mkdir -p $out/bin
146           cp -p bin/${name} $out/bin/${name}
147         ''
148         + lib.optionalString (dependencies != [ ]) ''
149           wrapProgram $out/bin/${name} \
150             --prefix PATH : ${lib.makeBinPath dependencies}
151         ''
152         + ''
153           runHook postInstall
154         '';
156       # We already patched
157       dontPatchShebangs = true;
159       meta = core.meta // {
160         mainProgram = name;
161       };
162     };
163   optionalDep =
164     cond: dep:
165     assert cond -> dep != null;
166     lib.optional cond dep;
169   batdiff = script "batdiff" (
170     [
171       less
172       coreutils
173       gitMinimal
174     ]
175     ++ optionalDep withDelta delta
176   );
177   batgrep = script "batgrep" [
178     less
179     coreutils
180     ripgrep
181   ];
182   batman = script "batman" (lib.optionals stdenv.hostPlatform.isLinux [ util-linux ]);
183   batpipe = script "batpipe" [ less ];
184   batwatch = script "batwatch" (
185     [
186       less
187       coreutils
188     ]
189     ++ optionalDep withEntr entr
190   );
191   prettybat = script "prettybat" (
192     [ ]
193     ++ optionalDep withShFmt shfmt
194     ++ optionalDep withPrettier nodePackages.prettier
195     ++ optionalDep withClangTools clang-tools
196     ++ optionalDep withRustFmt rustfmt
197   );