on ef3e398 help sign in
20 files changed+37−187
since splitsnapshots
unifiedsplit
.github/ISSUE_TEMPLATE/question.md−2 .github/workflows/CICD.yml+1−13 CHANGELOG.md+6−35 Cargo.lock+10−5 Cargo.toml+4−3 assets/acknowledgements.bin assets/syntaxes.bin assets/syntaxes/02_Extra/INI.sublime-syntax+2−2 assets/themes.bin doc/release-checklist.md+6−7 src/assets.rs+4−71 src/error.rs+1−4 src/printer.rs+1−1 tests/integration_tests.rs−14 tests/syntax-tests/highlighted/INI/test.inf−5 tests/syntax-tests/highlighted/Svelte/App.svelte+1−5 tests/syntax-tests/highlighted/Vue/example.vue−5 tests/syntax-tests/source/INI/test.inf−5 tests/syntax-tests/source/Svelte/App.svelte+1−5 tests/syntax-tests/source/Vue/example.vue−5
.github/ISSUE_TEMPLATE/question.md−2
@@ -7,5 +7,3 @@ assignees: ''
77
88---
99
10−<!-- Using a normal ticket is still fine, but feel free to ask your
11−questions about bat on https://github.com/sharkdp/bat/discussions instead. -->
.github/workflows/CICD.yml+1−13
@@ -118,18 +118,6 @@ jobs:
118118 toolchain: stable
119119 default: true
120120 profile: minimal
121− - name: Print -h
122− uses: actions-rs/cargo@v1
123− with:
124− command: run
125− args: --locked -- -h
126− - name: Print --help
127− uses: actions-rs/cargo@v1
128− with:
129− command: run
130− args: --locked -- --help
131− - name: Show man page
132− run: man $(find . -name bat.1)
133121 - name: Check documentation
134122 env:
135123 RUSTDOCFLAGS: -D warnings
@@ -154,7 +142,7 @@ jobs:
154142 - { target: x86_64-apple-darwin , os: macos-10.15 }
155143 - { target: x86_64-pc-windows-gnu , os: windows-2019 }
156144 - { target: x86_64-pc-windows-msvc , os: windows-2019 }
157− - { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04, use-cross: true }
145+ - { target: x86_64-unknown-linux-gnu , os: ubuntu-20.04 }
158146 - { target: x86_64-unknown-linux-musl , os: ubuntu-20.04, use-cross: true }
159147 steps:
160148 - name: Checkout source code
CHANGELOG.md+6−35
@@ -2,43 +2,18 @@
22
33## Features
44
5−- Make the default macOS theme depend on Dark Mode. See #2197, #1746 (@Enselic)
6−
7−## Bugfixes
8−
9−## Other
10−
11−- Relaxed glibc requirements on amd64, see #2106 and #2194 (@sharkdp)
12−
13−## Syntaxes
14−
15−## Themes
16−
17−## `bat` as a library
18−
19−
20−# v0.21.0
21−
22−## Features
23−
24−- Correctly render tab stops in `--show-all`, see #2038 (@Synthetica9)
25−- Add a `--style=default` option and make it the default. It is less verbose than `full`, see #2061 (@IsaacHorvath)
26−- Enable BusyBox `less` as pager, see #2162 (@nfisher1226)
27−- File extensions are now matched case-insensitively. See #1854, #2181 (@Enselic)
5+- Correctly render tab stops in --show-all, see #2038 (@Synthetica9)
6+- Add a `--style=default` option, less verbose than `full`, see #2061 (@IsaacHorvath)
7+- Enable BusyBox less as pager, see #2162 (@nfisher1226)
288
299## Bugfixes
3010
3111- Bump `regex` dependency from 1.5.4 to 1.5.5 to fix [CVE-2022-24713](https://blog.rust-lang.org/2022/03/08/cve-2022-24713.html), see #2145, #2139 (@Enselic)
32−- `bat` no longer crashes when encountering files that references missing syntaxes. See #915, #2181 (@Enselic)
33−
34−## Performance
35−
36−- Skip syntax highlighting on long lines (> 16384 chars) to help improve performance. See #2165 (@keith-hall)
37−- Vastly improve startup time by lazy-loading syntaxes via syntect 5.0.0. This makes bat display small files ~75% faster than before. See #951, #2181 (@Enselic)
3812
3913## Other
4014
4115- Include info about custom assets in `--diagnostics` if used. See #2107, #2144 (@Enselic)
16+- Skip syntax highlighting on long lines (> 16384 chars) to help improve performance. See #2165 (@keith-hall)
4217
4318## Syntaxes
4419
@@ -47,16 +22,12 @@
4722- Associate `/var/spool/mail/*` and `/var/mail/*` with the `Email` syntax. See #2156 (@cyqsimon)
4823- Added cmd-help syntax to scope --help messages. See #2148 (@victor-gp)
4924- Slightly adjust Zig syntax. See #2136 (@Enselic)
50−- Associate `.inf` files with the `INI` syntax. See #2190 (@Enselic)
25+
26+## Themes
5127
5228## `bat` as a library
5329
5430- Allow configuration of `show_nonprintable` with `PrettyPrinter`, see #2142
55−- The binary format of syntaxes.bin has been changed due to syntaxes now being lazy-loaded via syntect 5.0.0. See #2181 (@Enselic)
56−- Mark `bat::error::Error` enum as `#[non_exhaustive]` to allow adding new variants without future semver breakage. See #2181 (@Enselic)
57−- Change `Error::SyntectError(syntect::LoadingError)` to `Error::SyntectError(syntect::Error)`. See #2181 (@Enselic)
58−- Add `Error::SyntectLoadingError(syntect::LoadingError)` enum variant. See #2181 (@Enselic)
59−
6031
6132# v0.20.0
6233
Cargo.lock+10−5
@@ -74,7 +74,7 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
7474
7575[[package]]
7676name = "bat"
77−version = "0.21.0"
77+version = "0.20.0"
7878dependencies = [
7979 "ansi_colours",
8080 "ansi_term",
@@ -580,6 +580,12 @@ version = "1.4.0"
580580source = "registry+https://github.com/rust-lang/crates.io-index"
581581checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
582582
583+[[package]]
584+name = "lazycell"
585+version = "1.3.0"
586+source = "registry+https://github.com/rust-lang/crates.io-index"
587+checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
588+
583589[[package]]
584590name = "libc"
585591version = "0.2.125"
@@ -1065,9 +1071,9 @@ dependencies = [
10651071
10661072[[package]]
10671073name = "syntect"
1068−version = "5.0.0"
1074+version = "4.6.0"
10691075source = "registry+https://github.com/rust-lang/crates.io-index"
1070−checksum = "c6c454c27d9d7d9a84c7803aaa3c50cd088d2906fe3c6e42da3209aa623576a8"
1076+checksum = "8b20815bbe80ee0be06e6957450a841185fcf690fe0178f14d77a05ce2caa031"
10711077dependencies = [
10721078 "bincode",
10731079 "bitflags",
@@ -1075,14 +1081,13 @@ dependencies = [
10751081 "flate2",
10761082 "fnv",
10771083 "lazy_static",
1078− "once_cell",
1084+ "lazycell",
10791085 "onig",
10801086 "plist",
10811087 "regex-syntax",
10821088 "serde",
10831089 "serde_derive",
10841090 "serde_json",
1085− "thiserror",
10861091 "walkdir",
10871092 "yaml-rust",
10881093]
Cargo.toml+4−3
@@ -6,7 +6,7 @@ homepage = "https://github.com/sharkdp/bat"
66license = "MIT/Apache-2.0"
77name = "bat"
88repository = "https://github.com/sharkdp/bat"
9−version = "0.21.0"
9+version = "0.20.0"
1010exclude = ["assets/syntaxes/*", "assets/themes/*"]
1111build = "build.rs"
1212edition = '2018'
@@ -33,7 +33,8 @@ minimal-application = [
3333]
3434git = ["git2"] # Support indicating git modifications
3535paging = ["shell-words", "grep-cli"] # Support applying a pager on the output
36−build-assets = ["syntect/yaml-load", "syntect/plist-load", "regex", "walkdir"]
36+# Add "syntect/plist-load" when https://github.com/trishume/syntect/pull/345 reaches us
37+build-assets = ["syntect/yaml-load", "syntect/dump-create", "regex", "walkdir"]
3738
3839# You need to use one of these if you depend on bat as a library:
3940regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine
@@ -72,7 +73,7 @@ optional = true
7273default-features = false
7374
7475[dependencies.syntect]
75−version = "5.0.0"
76+version = "4.6.0"
7677default-features = false
7778features = ["parsing"]
7879
assets/acknowledgements.bin

Binary file not shown.

assets/syntaxes.bin

Binary file not shown.

assets/syntaxes/02_Extra/INI.sublime-syntax+2−2
@@ -5,8 +5,8 @@ name: INI
55file_extensions:
66 - ini
77 - INI
8− - "inf"
9− - "INF"
8+ - inf
9+ - INF
1010 - reg
1111 - REG
1212 - lng
assets/themes.bin

Binary file not shown.

doc/release-checklist.md+6−7
@@ -7,22 +7,21 @@
77- [ ] Find the current min. supported Rust version by running
88 `grep '^\s*MIN_SUPPORTED_RUST_VERSION' .github/workflows/CICD.yml`.
99- [ ] Update the version and the min. supported Rust version in `README.md` and
10− `doc/README-*.md`. Check with
11− `git grep -i -e 'rust.*1\.' -e '1\..*rust' | grep README | grep -v tests/`.
10+ `doc/README-*.md`. Check with `git grep -i 'rust.*1\.'` and
11+ `git grep -i '1\..*rust'`.
1212- [ ] Update `CHANGELOG.md`. Introduce a section for the new release.
1313
1414## Update syntaxes and themes (build assets)
1515
16−- [ ] Install the latest master version (`cargo clean && cargo install --locked -f --path .`) and make
16+- [ ] Install the latest master version (`cargo clean && cargo install -f --path .`) and make
1717 sure that it is available on the `PATH` (`bat --version` should show the
1818 new version).
1919- [ ] Run `assets/create.sh` and check in the binary asset files.
2020
2121## Documentation
2222
23−- [ ] Review `-h`, `--help`, and the `man` page. All of these are shown in
24− the output of the CI job called *Documentation*, so look there.
25− The CI workflow corresponding to the tip of the master branch is a good place to look.
23+- [ ] Review the `-h` and `--help` texts
24+- [ ] Review the `man` page (`man $(fd -HIp target/release/build.*out/assets/manual/bat.1) | tee`)
2625
2726## Pre-release checks
2827
@@ -31,7 +30,7 @@
3130- [ ] Optional: manually test the new features and command-line options. To do
3231 this, install the latest `bat` version again (to include the new syntaxes
3332 and themes).
34−- [ ] Run `cargo publish --dry-run` to make sure that it will
33+- [ ] Run `cargo publish --dry-run --allow-dirty` to make sure that it will
3534 succeed later (after creating the GitHub release).
3635
3736## Release
src/assets.rs+4−71
@@ -43,9 +43,8 @@ pub struct SyntaxReferenceInSet<'a> {
4343 pub syntax_set: &'a SyntaxSet,
4444}
4545
46−/// Lazy-loaded syntaxes are already compressed, and we don't want to compress
47−/// already compressed data.
48−pub(crate) const COMPRESS_SYNTAXES: bool = false;
46+/// Compress for size of ~700 kB instead of ~4600 kB at the cost of ~30% longer deserialization time
47+pub(crate) const COMPRESS_SYNTAXES: bool = true;
4948
5049/// We don't want to compress our [LazyThemeSet] since the lazy-loaded themes
5150/// within it are already compressed, and compressing another time just makes
@@ -69,57 +68,10 @@ impl HighlightingAssets {
6968 }
7069 }
7170
72− /// The default theme.
73− ///
74− /// ### Windows and Linux
75− ///
76− /// Windows and most Linux distributions has a dark terminal theme by
77− /// default. On these platforms, this function always returns a theme that
78− /// looks good on a dark background.
79− ///
80− /// ### macOS
81− ///
82− /// On macOS the default terminal background is light, but it is common that
83− /// Dark Mode is active, which makes the terminal background dark. On this
84− /// platform, the default theme depends on
85− /// ```bash
86− /// defaults read -globalDomain AppleInterfaceStyle
87− /// ````
88− /// To avoid the overhead of the check on macOS, simply specify a theme
89− /// explicitly via `--theme`, `BAT_THEME`, or `~/.config/bat`.
90− ///
91− /// See <https://github.com/sharkdp/bat/issues/1746> and
92− /// <https://github.com/sharkdp/bat/issues/1928> for more context.
9371 pub fn default_theme() -> &'static str {
94− #[cfg(not(target_os = "macos"))]
95− {
96− Self::default_dark_theme()
97− }
98− #[cfg(target_os = "macos")]
99− {
100− if macos_dark_mode_active() {
101− Self::default_dark_theme()
102− } else {
103− Self::default_light_theme()
104− }
105− }
106− }
107−
108− /**
109− * The default theme that looks good on a dark background.
110− */
111− fn default_dark_theme() -> &'static str {
11272 "Monokai Extended"
11373 }
11474
115− /**
116− * The default theme that looks good on a light background.
117− */
118− #[cfg(target_os = "macos")]
119− fn default_light_theme() -> &'static str {
120− "Monokai Extended Light"
121− }
122−
12375 pub fn from_cache(cache_path: &Path) -> Result<Self> {
12476 Ok(HighlightingAssets::new(
12577 SerializedSyntaxSet::FromFile(cache_path.join("syntaxes.bin")),
@@ -399,16 +351,6 @@ fn asset_from_cache<T: serde::de::DeserializeOwned>(
399351 .map_err(|_| format!("Could not parse cached {}", description).into())
400352}
401353
402−#[cfg(target_os = "macos")]
403−fn macos_dark_mode_active() -> bool {
404− let mut defaults_cmd = std::process::Command::new("defaults");
405− defaults_cmd.args(&["read", "-globalDomain", "AppleInterfaceStyle"]);
406− match defaults_cmd.output() {
407− Ok(output) => output.stdout == b"Dark\n",
408− Err(_) => true,
409− }
410−}
411−
412354#[cfg(test)]
413355mod tests {
414356 use super::*;
@@ -639,22 +581,13 @@ mod tests {
639581 }
640582
641583 #[test]
642− fn syntax_detection_is_case_insensitive() {
584+ fn syntax_detection_is_case_sensitive() {
643585 let mut test = SyntaxDetectionTest::new();
644586
645− assert_eq!(test.syntax_for_file("README.md"), "Markdown");
646− assert_eq!(test.syntax_for_file("README.mD"), "Markdown");
647− assert_eq!(test.syntax_for_file("README.Md"), "Markdown");
648− assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
649−
650− // Adding a mapping for "MD" in addition to "md" should not break the mapping
587+ assert_ne!(test.syntax_for_file("README.MD"), "Markdown");
651588 test.syntax_mapping
652589 .insert("*.MD", MappingTarget::MapTo("Markdown"))
653590 .ok();
654−
655− assert_eq!(test.syntax_for_file("README.md"), "Markdown");
656− assert_eq!(test.syntax_for_file("README.mD"), "Markdown");
657− assert_eq!(test.syntax_for_file("README.Md"), "Markdown");
658591 assert_eq!(test.syntax_for_file("README.MD"), "Markdown");
659592 }
660593
src/error.rs+1−4
@@ -2,14 +2,11 @@ use std::io::Write;
22use thiserror::Error;
33
44#[derive(Error, Debug)]
5−#[non_exhaustive]
65pub enum Error {
76 #[error(transparent)]
87 Io(#[from] ::std::io::Error),
98 #[error(transparent)]
10− SyntectError(#[from] ::syntect::Error),
11− #[error(transparent)]
12− SyntectLoadingError(#[from] ::syntect::LoadingError),
9+ SyntectError(#[from] ::syntect::LoadingError),
1310 #[error(transparent)]
1411 ParseIntError(#[from] ::std::num::ParseIntError),
1512 #[error(transparent)]
src/printer.rs+1−1
@@ -453,7 +453,7 @@ impl<'a> Printer for InteractivePrinter<'a> {
453453
454454 let mut highlighted_line = highlighter_from_set
455455 .highlighter
456− .highlight_line(for_highlighting, highlighter_from_set.syntax_set)?;
456+ .highlight(for_highlighting, highlighter_from_set.syntax_set);
457457
458458 if too_long {
459459 highlighted_line[0].1 = &line;
tests/integration_tests.rs−14
@@ -1427,8 +1427,6 @@ fn ansi_passthrough_emit() {
14271427fn ignored_suffix_arg() {
14281428 bat()
14291429 .arg("-f")
1430− .arg("--theme")
1431− .arg("Monokai Extended")
14321430 .arg("-p")
14331431 .arg("test.json~")
14341432 .assert()
@@ -1438,8 +1436,6 @@ fn ignored_suffix_arg() {
14381436
14391437 bat()
14401438 .arg("-f")
1441− .arg("--theme")
1442− .arg("Monokai Extended")
14431439 .arg("-p")
14441440 .arg("--ignored-suffix=.suffix")
14451441 .arg("test.json.suffix")
@@ -1450,8 +1446,6 @@ fn ignored_suffix_arg() {
14501446
14511447 bat()
14521448 .arg("-f")
1453− .arg("--theme")
1454− .arg("Monokai Extended")
14551449 .arg("-p")
14561450 .arg("test.json.suffix")
14571451 .assert()
@@ -1469,8 +1463,6 @@ fn highlighting_is_skipped_on_long_lines() {
14691463
14701464 bat()
14711465 .arg("-f")
1472− .arg("--theme")
1473− .arg("Monokai Extended")
14741466 .arg("-p")
14751467 .arg("longline.json")
14761468 .assert()
@@ -1490,8 +1482,6 @@ fn all_global_git_config_locations_syntax_mapping_work() {
14901482 bat()
14911483 .env("XDG_CONFIG_HOME", fake_home.join(".config").as_os_str())
14921484 .arg("-f")
1493− .arg("--theme")
1494− .arg("Monokai Extended")
14951485 .arg("-p")
14961486 .arg("git/.config/git/config")
14971487 .assert()
@@ -1502,8 +1492,6 @@ fn all_global_git_config_locations_syntax_mapping_work() {
15021492 bat()
15031493 .env("HOME", fake_home.as_os_str())
15041494 .arg("-f")
1505− .arg("--theme")
1506− .arg("Monokai Extended")
15071495 .arg("-p")
15081496 .arg("git/.config/git/config")
15091497 .assert()
@@ -1514,8 +1502,6 @@ fn all_global_git_config_locations_syntax_mapping_work() {
15141502 bat()
15151503 .env("HOME", fake_home.as_os_str())
15161504 .arg("-f")
1517− .arg("--theme")
1518− .arg("Monokai Extended")
15191505 .arg("-p")
15201506 .arg("git/.gitconfig")
15211507 .assert()
tests/syntax-tests/highlighted/INI/test.infdeleted−5
@@ -1,5 +0,0 @@
1−[section]
2−key=value
3−# This file is just for testing that the INI syntax is registered to handle
4−# the .inf file extension, it is not testing the syntax highlighting capabilities
5−# of the INI syntax itself
tests/syntax-tests/highlighted/Svelte/App.svelte+1−5
@@ -27,13 +27,9 @@
2727</script>
2828
2929<script type="text/livescript">
30− // This block is a regression test for a bat panic when a LiveScript syntax definition is missing
30+ // This block is a regression test for a bat panic when a LiveScript syntax definition is missing
3131</script>
3232
33−<style lang="text/postcss">
34− /* This block is a regression test for a bat panic when a PostCSS syntax definition is missing */
35−</style>
36−
3733<style>
3834 main {
3935 position: relative;
tests/syntax-tests/highlighted/Vue/example.vue−5
@@ -8,11 +8,6 @@
88 </div>
99</template>
1010
11−<template lang='pug'>
12− #container.col
13− p This shall be formatted as Plain Text as long as a Pug syntax definition is missing
14−</template>
15−
1611<script>
1712import AppHeader from "@/components/AppHeader";
1813import AppLoadingIndicator from "@/components/AppLoadingIndicator";
tests/syntax-tests/source/INI/test.infdeleted−5
@@ -1,5 +0,0 @@
1−[section]
2−key=value
3−# This file is just for testing that the INI syntax is registered to handle
4−# the .inf file extension, it is not testing the syntax highlighting capabilities
5−# of the INI syntax itself
tests/syntax-tests/source/Svelte/App.svelte+1−5
@@ -27,13 +27,9 @@
2727</script>
2828
2929<script type="text/livescript">
30− // This block is a regression test for a bat panic when a LiveScript syntax definition is missing
30+ // This block is a regression test for a bat panic when a LiveScript syntax definition is missing
3131</script>
3232
33−<style lang="text/postcss">
34− /* This block is a regression test for a bat panic when a PostCSS syntax definition is missing */
35−</style>
36−
3733<style>
3834 main {
3935 position: relative;
tests/syntax-tests/source/Vue/example.vue−5
@@ -8,11 +8,6 @@
88 </div>
99</template>
1010
11−<template lang='pug'>
12− #container.col
13− p This shall be formatted as Plain Text as long as a Pug syntax definition is missing
14−</template>
15−
1611<script>
1712import AppHeader from "@/components/AppHeader";
1813import AppLoadingIndicator from "@/components/AppLoadingIndicator";