on master help sign in
Make 'build-assets' an optional capability for application

Also structure features a bit more clever to avoid duplication of feature dependency declarations.

commit25fa577cd06c9753756d116410aaa19735c95085 authorMartin Nordholts <enselic@gmail.com> dateTue 10 Aug 2021, 22:18 (5 years ago) parentdeddc81
8 files changed+45−44
.github/workflows/CICD.yml+2−2 Cargo.toml+8−14 src/assets.rs+9−11 src/assets_metadata.rs+2 src/bin/bat/main.rs+21−15 src/config.rs+1−1 src/error.rs+1−1 src/lib.rs+1
.github/workflows/CICD.yml+2−2
@@ -246,12 +246,12 @@ jobs:
246246 command: check
247247 args: --locked --target=${{ matrix.job.target }} --verbose --lib --no-default-features --features regex-onig,git,paging
248248
249− - name: "Feature check: quick-build-application"
249+ - name: "Feature check: minimal-application"
250250 uses: actions-rs/cargo@v1
251251 with:
252252 use-cross: ${{ matrix.job.use-cross }}
253253 command: check
254− args: --locked --target=${{ matrix.job.target }} --verbose --no-default-features --features quick-build-application
254+ args: --locked --target=${{ matrix.job.target }} --verbose --no-default-features --features minimal-application
255255
256256 - name: Create tarball
257257 id: package
Cargo.toml+8−14
@@ -12,25 +12,18 @@ build = "build.rs"
1212edition = '2018'
1313
1414[features]
15−default = ["full-application"]
15+default = ["application"]
1616# Feature required for bat the application. Should be disabled when depending on
1717# bat as a library.
18−full-application = [
19− "application",
20− "atty",
18+application = [
2119 "bugreport",
22− "clap",
23− "dirs-next",
20+ "build-assets",
2421 "git",
25− "lazy_static",
26− "paging",
27− "regex-onig",
28− "wild",
22+ "minimal-application",
2923]
3024# Mainly for developers that want to iterate quickly
3125# Be aware that the included features might change in the future
32−quick-build-application = [
33− "application",
26+minimal-application = [
3427 "atty",
3528 "clap",
3629 "dirs-next",
@@ -39,9 +32,10 @@ quick-build-application = [
3932 "regex-onig",
4033 "wild",
4134]
42−application = []
4335git = ["git2"] # Support indicating git modifications
4436paging = ["shell-words"] # Support applying a pager on the output
37+# Add "syntect/plist-load" when https://github.com/trishume/syntect/pull/345 reaches us
38+build-assets = ["syntect/yaml-load", "syntect/dump-create"]
4539
4640# You need to use one of these if you depend on bat as a library:
4741regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine
@@ -77,7 +71,7 @@ default-features = false
7771[dependencies.syntect]
7872version = "4.6.0"
7973default-features = false
80−features = ["parsing", "yaml-load", "dump-load", "dump-create"]
74+features = ["parsing", "dump-load"]
8175
8276[dependencies.clap]
8377version = "2.33"
src/assets.rs+9−11
@@ -4,13 +4,12 @@ use std::path::{Path, PathBuf};
44
55use lazycell::LazyCell;
66
7−use syntect::dumps::{dump_to_file, from_binary, from_reader};
7+use syntect::dumps::{from_binary, from_reader};
88use syntect::highlighting::{Theme, ThemeSet};
9−use syntect::parsing::{SyntaxReference, SyntaxSet, SyntaxSetBuilder};
9+use syntect::parsing::{SyntaxReference, SyntaxSet};
1010
1111use path_abs::PathAbs;
1212
13−use crate::assets_metadata::AssetsMetadata;
1413use crate::bat_warning;
1514use crate::error::*;
1615use crate::input::{InputReader, OpenedInput, OpenedInputKind};
@@ -72,6 +71,7 @@ impl HighlightingAssets {
7271 "Monokai Extended"
7372 }
7473
74+ #[cfg(feature = "build-assets")]
7575 pub fn from_files(source_dir: &Path, include_integrated_assets: bool) -> Result<Self> {
7676 let mut theme_set = if include_integrated_assets {
7777 get_integrated_themeset()
@@ -97,11 +97,11 @@ impl HighlightingAssets {
9797 }
9898
9999 let mut syntax_set_builder = if !include_integrated_assets {
100− let mut builder = SyntaxSetBuilder::new();
100+ let mut builder = syntect::parsing::SyntaxSetBuilder::new();
101101 builder.add_plain_text_syntax();
102102 builder
103103 } else {
104− get_integrated_syntaxset().into_builder()
104+ from_binary::<SyntaxSet>(get_serialized_integrated_syntaxset()).into_builder()
105105 };
106106
107107 let syntax_dir = source_dir.join("syntaxes");
@@ -152,6 +152,7 @@ impl HighlightingAssets {
152152 )
153153 }
154154
155+ #[cfg(feature = "build-assets")]
155156 pub fn save_to_cache(&self, target_dir: &Path, current_version: &str) -> Result<()> {
156157 let _ = fs::create_dir_all(target_dir);
157158 asset_to_cache(
@@ -169,7 +170,7 @@ impl HighlightingAssets {
169170 "Writing metadata to folder {} ... ",
170171 target_dir.to_string_lossy()
171172 );
172− AssetsMetadata::new(current_version).save_to_folder(target_dir)?;
173+ crate::assets_metadata::AssetsMetadata::new(current_version).save_to_folder(target_dir)?;
173174 println!("okay");
174175
175176 Ok(())
@@ -416,17 +417,14 @@ fn get_serialized_integrated_syntaxset() -> &'static [u8] {
416417 include_bytes!("../assets/syntaxes.bin")
417418}
418419
419−fn get_integrated_syntaxset() -> SyntaxSet {
420− from_binary(get_serialized_integrated_syntaxset())
421−}
422−
423420fn get_integrated_themeset() -> ThemeSet {
424421 from_binary(include_bytes!("../assets/themes.bin"))
425422}
426423
424+#[cfg(feature = "build-assets")]
427425fn asset_to_cache<T: serde::Serialize>(asset: &T, path: &Path, description: &str) -> Result<()> {
428426 print!("Writing {} to {} ... ", description, path.to_string_lossy());
429− dump_to_file(asset, &path).chain_err(|| {
427+ syntect::dumps::dump_to_file(asset, &path).chain_err(|| {
430428 format!(
431429 "Could not save {} to {}",
432430 description,
src/assets_metadata.rs+2
@@ -16,6 +16,7 @@ pub struct AssetsMetadata {
1616const FILENAME: &str = "metadata.yaml";
1717
1818impl AssetsMetadata {
19+ #[cfg(feature = "build-assets")]
1920 pub(crate) fn new(current_version: &str) -> AssetsMetadata {
2021 AssetsMetadata {
2122 bat_version: Some(current_version.to_owned()),
@@ -23,6 +24,7 @@ impl AssetsMetadata {
2324 }
2425 }
2526
27+ #[cfg(feature = "build-assets")]
2628 pub(crate) fn save_to_folder(&self, path: &Path) -> Result<()> {
2729 let file = File::create(path.join(FILENAME))?;
2830 serde_yaml::to_writer(file, self)?;
src/bin/bat/main.rs+21−15
@@ -23,12 +23,10 @@ use crate::{
2323};
2424
2525use assets::{assets_from_cache_or_binary, cache_dir, clear_assets, config_dir};
26−use clap::crate_version;
2726use directories::PROJECT_DIRS;
2827use globset::GlobMatcher;
2928
3029use bat::{
31− assets::HighlightingAssets,
3230 config::Config,
3331 controller::Controller,
3432 error::*,
@@ -39,21 +37,29 @@ use bat::{
3937
4038const THEME_PREVIEW_DATA: &[u8] = include_bytes!("../../../assets/theme_preview.rs");
4139
40+#[cfg(feature = "build-assets")]
41+fn build_assets(matches: &clap::ArgMatches) -> Result<()> {
42+ let source_dir = matches
43+ .value_of("source")
44+ .map(Path::new)
45+ .unwrap_or_else(|| PROJECT_DIRS.config_dir());
46+ let target_dir = matches
47+ .value_of("target")
48+ .map(Path::new)
49+ .unwrap_or_else(|| PROJECT_DIRS.cache_dir());
50+
51+ let blank = matches.is_present("blank");
52+
53+ let assets = bat::assets::HighlightingAssets::from_files(source_dir, !blank)?;
54+ assets.save_to_cache(target_dir, clap::crate_version!())
55+}
56+
4257fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
4358 if matches.is_present("build") {
44− let source_dir = matches
45− .value_of("source")
46− .map(Path::new)
47− .unwrap_or_else(|| PROJECT_DIRS.config_dir());
48− let target_dir = matches
49− .value_of("target")
50− .map(Path::new)
51− .unwrap_or_else(|| PROJECT_DIRS.cache_dir());
52−
53− let blank = matches.is_present("blank");
54−
55− let assets = HighlightingAssets::from_files(source_dir, !blank)?;
56− assets.save_to_cache(target_dir, crate_version!())?;
59+ #[cfg(feature = "build-assets")]
60+ build_assets(matches)?;
61+ #[cfg(not(feature = "build-assets"))]
62+ println!("bat has been built without the 'build-assets' feature. The 'cache --build' option is not available.");
5763 } else if matches.is_present("clear") {
5864 clear_assets();
5965 }
src/config.rs+1−1
@@ -88,7 +88,7 @@ pub struct Config<'a> {
8888 pub use_custom_assets: bool,
8989}
9090
91−#[cfg(all(feature = "application", feature = "paging"))]
91+#[cfg(all(feature = "minimal-application", feature = "paging"))]
9292pub fn get_pager_executable(config_pager: Option<&str>) -> Option<String> {
9393 if let Ok(Some(pager)) = crate::pager::get_pager(config_pager) {
9494 Some(pager.bin)
src/error.rs+1−1
@@ -3,7 +3,7 @@ use std::io::Write;
33
44error_chain! {
55 foreign_links {
6− Clap(::clap::Error) #[cfg(feature = "application")];
6+ Clap(::clap::Error) #[cfg(feature = "minimal-application")];
77 Io(::std::io::Error);
88 SyntectError(::syntect::LoadingError);
99 ParseIntError(::std::num::ParseIntError);
src/lib.rs+1
@@ -40,6 +40,7 @@ mod preprocessor;
4040mod pretty_printer;
4141pub(crate) mod printer;
4242pub mod style;
43+#[cfg(feature = "build-assets")]
4344mod syntax_dependencies;
4445pub(crate) mod syntax_mapping;
4546mod terminal;