From 382fa2bf9cf66da5f5b1a897d22961bf8f06071c Mon Sep 17 00:00:00 2001 From: Martin Nordholts Date: Sun, 5 Dec 2021 13:03:02 +0100 Subject: [PATCH 1/8] Give credit to syntax definition and theme authors with new `--acknowledgements` option The text that is printed is generated when building assets, by analyzing LICENSE and NOTICE files that comes with syntaxes and themes. --- CHANGELOG.md | 1 + Cargo.lock | 2 + Cargo.toml | 4 +- assets/acknowledgements.bin | Bin 0 -> 12542 bytes src/assets.rs | 10 + src/assets/build_assets.rs | 23 ++- src/assets/build_assets/acknowledgements.rs | 202 ++++++++++++++++++++ src/bin/bat/clap_app.rs | 6 + src/bin/bat/main.rs | 3 + tests/integration_tests.rs | 28 +++ 10 files changed, 277 insertions(+), 2 deletions(-) create mode 100644 assets/acknowledgements.bin create mode 100644 src/assets/build_assets/acknowledgements.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index c91be47285..2298e5825b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Support for `--ignored-suffix` argument. See #1892 (@bojan88) - `$BAT_CONFIG_DIR` is now a recognized environment variable. It has precedence over `$XDG_CONFIG_HOME`, see #1727 (@billrisher) - Support for `x:+delta` syntax in line ranges (e.g. `20:+10`). See #1810 (@bojan88) +- Add new `--acknowledgements` argument that gives credit to theme and syntax definition authors. See #1971 (@Enselic) ## Bugfixes diff --git a/Cargo.lock b/Cargo.lock index 9f4b809378..ca5cdbead2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -105,6 +105,7 @@ dependencies = [ "once_cell", "path_abs", "predicates", + "regex", "semver", "serde", "serde_yaml", @@ -115,6 +116,7 @@ dependencies = [ "thiserror", "unicode-width", "wait-timeout", + "walkdir", "wild", ] diff --git a/Cargo.toml b/Cargo.toml index 293cc5021c..aa1075803f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,7 @@ minimal-application = [ git = ["git2"] # Support indicating git modifications paging = ["shell-words", "grep-cli"] # Support applying a pager on the output # Add "syntect/plist-load" when https://github.com/trishume/syntect/pull/345 reaches us -build-assets = ["syntect/yaml-load", "syntect/dump-create"] +build-assets = ["syntect/yaml-load", "syntect/dump-create", "regex", "walkdir"] # You need to use one of these if you depend on bat as a library: regex-onig = ["syntect/regex-onig"] # Use the "oniguruma" regex engine @@ -63,6 +63,8 @@ clircle = "0.3" bugreport = { version = "0.4", optional = true } dirs-next = { version = "2.0.0", optional = true } grep-cli = { version = "0.1.6", optional = true } +regex = { version = "1.0", optional = true } +walkdir = { version = "2.0", optional = true } [dependencies.git2] version = "0.13" diff --git a/assets/acknowledgements.bin b/assets/acknowledgements.bin new file mode 100644 index 0000000000000000000000000000000000000000..be7df475607f7edb83b5b0ee021d90afbc5ed82a GIT binary patch literal 12542 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 literal 0 HcmV?d00001 diff --git a/src/assets.rs b/src/assets.rs index 206664ccaa..5732dc6781 100644 --- a/src/assets.rs +++ b/src/assets.rs @@ -46,6 +46,9 @@ pub(crate) const COMPRESS_SYNTAXES: bool = true; /// Compress for size of ~20 kB instead of ~200 kB at the cost of ~30% longer deserialization time pub(crate) const COMPRESS_THEMES: bool = true; +/// Compress for size of ~10 kB instead of ~120 kB +pub(crate) const COMPRESS_ACKNOWLEDGEMENTS: bool = true; + impl HighlightingAssets { fn new(serialized_syntax_set: SerializedSyntaxSet, theme_set: ThemeSet) -> Self { HighlightingAssets { @@ -295,6 +298,13 @@ pub(crate) fn get_integrated_themeset() -> ThemeSet { from_binary(include_bytes!("../assets/themes.bin"), COMPRESS_THEMES) } +pub fn get_acknowledgements() -> String { + from_binary( + include_bytes!("../assets/acknowledgements.bin"), + COMPRESS_ACKNOWLEDGEMENTS, + ) +} + pub(crate) fn from_binary(v: &[u8], compressed: bool) -> T { asset_from_contents(v, "n/a", compressed) .expect("data integrated in binary is never faulty, but make sure `compressed` is in sync!") diff --git a/src/assets/build_assets.rs b/src/assets/build_assets.rs index 34fa150bf1..9c3327e913 100644 --- a/src/assets/build_assets.rs +++ b/src/assets/build_assets.rs @@ -3,6 +3,9 @@ use syntect::highlighting::ThemeSet; use syntect::parsing::{SyntaxSet, SyntaxSetBuilder}; use crate::assets::*; +use acknowledgements::build_acknowledgements; + +mod acknowledgements; pub fn build( source_dir: &Path, @@ -16,9 +19,17 @@ pub fn build( let syntax_set = syntax_set_builder.build(); + let acknowledgements = build_acknowledgements(source_dir, include_integrated_assets)?; + print_unlinked_contexts(&syntax_set); - write_assets(&theme_set, &syntax_set, target_dir, current_version) + write_assets( + &theme_set, + &syntax_set, + &acknowledgements, + target_dir, + current_version, + ) } fn build_theme_set(source_dir: &Path, include_integrated_assets: bool) -> ThemeSet { @@ -87,6 +98,7 @@ fn print_unlinked_contexts(syntax_set: &SyntaxSet) { fn write_assets( theme_set: &ThemeSet, syntax_set: &SyntaxSet, + acknowledgements: &Option, target_dir: &Path, current_version: &str, ) -> Result<()> { @@ -104,6 +116,15 @@ fn write_assets( COMPRESS_SYNTAXES, )?; + if let Some(acknowledgements) = acknowledgements { + asset_to_cache( + acknowledgements, + &target_dir.join("acknowledgements.bin"), + "acknowledgements", + COMPRESS_ACKNOWLEDGEMENTS, + )?; + } + print!( "Writing metadata to folder {} ... ", target_dir.to_string_lossy() diff --git a/src/assets/build_assets/acknowledgements.rs b/src/assets/build_assets/acknowledgements.rs new file mode 100644 index 0000000000..2232962ea8 --- /dev/null +++ b/src/assets/build_assets/acknowledgements.rs @@ -0,0 +1,202 @@ +use std::fs::read_to_string; +use std::path::Path; + +use crate::error::*; + +// Sourced from the License section in the README.md +const PREAMBLE: &str = "Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat). + +bat is made available under the terms of either the MIT License or the Apache +License 2.0, at your option. + +See the LICENSE-APACHE and LICENSE-MIT files for license details. +"; + +/// Looks for LICENSE and NOTICE files in `source_dir`, does some rudimentary +/// analysis, and compiles them together in a single string that is meant to be +/// used in the output to `--acknowledgements` +pub fn build_acknowledgements( + source_dir: &Path, + include_integrated_assets: bool, +) -> Result> { + if include_integrated_assets { + return Ok(None); + } + + let mut acknowledgements = String::new(); + acknowledgements.push_str(PREAMBLE); + + // Sort entries so the order is stable over time + let entries = walkdir::WalkDir::new(source_dir).sort_by(|a, b| a.path().cmp(b.path())); + for entry in entries { + let entry = match entry { + Ok(entry) => entry, + Err(_) => continue, + }; + + let path = entry.path(); + let stem = match path.file_stem().and_then(|s| s.to_str()) { + Some(stem) => stem, + None => continue, + }; + + handle_file(&mut acknowledgements, path, stem)? + } + + Ok(Some(acknowledgements)) +} + +fn handle_file(acknowledgements: &mut String, path: &Path, stem: &str) -> Result<()> { + if stem == "NOTICE" { + handle_notice(acknowledgements, path)?; + } else if stem.to_ascii_uppercase() == "LICENSE" { + handle_license(acknowledgements, path)?; + } + + Ok(()) +} + +fn handle_notice(acknowledgements: &mut String, path: &Path) -> Result<()> { + // Assume NOTICE as defined by Apache License 2.0. These must be part of acknowledgements. + let license_text = read_to_string(path)?; + append_to_acknowledgements(acknowledgements, &license_text) +} + +fn handle_license(acknowledgements: &mut String, path: &Path) -> Result<()> { + let license_text = read_to_string(path)?; + + if include_license_in_acknowledgments(&license_text) { + append_to_acknowledgements(acknowledgements, &license_text) + } else if license_not_needed_in_acknowledgements(&license_text) { + Ok(()) + } else { + Err(format!("ERROR: License is of unknown type: {:?}", path).into()) + } +} + +fn include_license_in_acknowledgments(license_text: &str) -> bool { + let markers = vec![ + // MIT + "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", + + // BSD + "Redistributions in binary form must reproduce the above copyright notice,", + + // Apache 2.0 + "Apache License Version 2.0, January 2004 http://www.apache.org/licenses/", + "Licensed under the Apache License, Version 2.0 (the \"License\");", + ]; + + license_contains_marker(license_text, &markers) +} + +fn license_not_needed_in_acknowledgements(license_text: &str) -> bool { + let markers = vec![ + // Public domain + "This is free and unencumbered software released into the public domain.", + + // Special license of assets/syntaxes/01_Packages/LICENSE + "Permission to copy, use, modify, sell and distribute this software is granted. This software is provided \"as is\" without express or implied warranty, and with no claim as to its suitability for any purpose." + ]; + + license_contains_marker(license_text, &markers) +} + +fn license_contains_marker(license_text: &str, markers: &[&str]) -> bool { + let normalized_license_text = normalize_license_text(license_text); + for marker in markers { + if normalized_license_text.contains(marker) { + return true; + } + } + false +} + +fn append_to_acknowledgements(acknowledgements: &mut String, license_text: &str) -> Result<()> { + // Most license texts wrap at 80 chars so our horizontal divider is 80 chars + acknowledgements.push_str( + "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", + ); + + // Now add the license text itself + acknowledgements.push_str(license_text); + + // Make sure the last char is a newline to not mess up formatting later + if acknowledgements + .chars() + .last() + .expect("acknowledgements is not the empty string") + != '\n' + { + acknowledgements.push('\n'); + } + + Ok(()) +} + +/// Replaces newlines with a space character, and replaces multiple spaces with one space. +/// This makes the text easier to analyze. +fn normalize_license_text(license_text: &str) -> String { + use regex::Regex; + + let whitespace_and_newlines = Regex::new(r"\s").unwrap(); + let as_single_line = whitespace_and_newlines.replace_all(license_text, " "); + + let many_spaces = Regex::new(" +").unwrap(); + many_spaces.replace_all(&as_single_line, " ").to_string() +} + +#[cfg(test)] +mod tests { + #[cfg(test)] + use super::*; + + #[test] + fn test_normalize_license_text() { + let license_text = "This is a license text with these terms: + * Complicated multi-line + term with indentation"; + + assert_eq!( + "This is a license text with these terms: * Complicated multi-line term with indentation".to_owned(), + normalize_license_text(license_text), + ); + } + + #[test] + fn test_normalize_license_text_with_windows_line_endings() { + let license_text = "This license text includes windows line endings\r +and we need to handle that."; + + assert_eq!( + "This license text includes windows line endings and we need to handle that." + .to_owned(), + normalize_license_text(license_text), + ); + } + + #[test] + fn test_append_to_acknowledgements_adds_newline_if_missing() { + let mut acknowledgements = "preamble\n".to_owned(); + + append_to_acknowledgements(&mut acknowledgements, "line without newline").unwrap(); + assert_eq!( + "preamble +―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― +line without newline +", + acknowledgements + ); + + append_to_acknowledgements(&mut acknowledgements, "line with newline\n").unwrap(); + assert_eq!( + "preamble +―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― +line without newline +―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― +line with newline +", + acknowledgements + ); + } +} diff --git a/src/bin/bat/clap_app.rs b/src/bin/bat/clap_app.rs index 1a618bb292..b12e7c87e4 100644 --- a/src/bin/bat/clap_app.rs +++ b/src/bin/bat/clap_app.rs @@ -508,6 +508,12 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> { .hidden_short_help(true) .help("Show diagnostic information for bug reports.") ) + .arg( + Arg::with_name("acknowledgements") + .long("acknowledgements") + .hidden_short_help(true) + .help("Show acknowledgements."), + ) .arg( Arg::with_name("ignored-suffix") .number_of_values(1) diff --git a/src/bin/bat/main.rs b/src/bin/bat/main.rs index d4ce33d994..e2c34c765a 100644 --- a/src/bin/bat/main.rs +++ b/src/bin/bat/main.rs @@ -324,6 +324,9 @@ fn run() -> Result { } else if app.matches.is_present("cache-dir") { writeln!(io::stdout(), "{}", cache_dir())?; Ok(true) + } else if app.matches.is_present("acknowledgements") { + writeln!(io::stdout(), "{}", bat::assets::get_acknowledgements())?; + Ok(true) } else { run_controller(inputs, &config) } diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 17e9dc4e1f..17a044c2c1 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -1,4 +1,5 @@ use assert_cmd::cargo::CommandCargoExt; +use predicates::boolean::PredicateBooleanExt; use predicates::{prelude::predicate, str::PredicateStrExt}; use serial_test::serial; use std::path::Path; @@ -1256,3 +1257,30 @@ fn ignored_suffix_arg() { .stdout("\u{1b}[38;5;231m{\"test\": \"value\"}\u{1b}[0m") .stderr(""); } + +#[test] +fn acknowledgements() { + bat() + .arg("--acknowledgements") + .assert() + .success() + .stdout( + // Just some sanity checking that avoids names of persons, except our own Keith Hall :) + predicate::str::contains( + "Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat).", + ) + .and(predicate::str::contains( + "Copyright (c) 2012-2020 The Sublime CMake authors", + )) + .and(predicate::str::contains( + "Copyright 2014-2015 SaltStack Team", + )) + .and(predicate::str::contains( + "Copyright (c) 2013-present Dracula Theme", + )) + .and(predicate::str::contains("Copyright (c) 2017 b123400")) + .and(predicate::str::contains("Copyright (c) 2021 Keith Hall")) + .and(predicate::str::contains("Copyright 2014 Clams")), + ) + .stderr(""); +} From 1d72508899cb7f810aee973d31470da2439fffda Mon Sep 17 00:00:00 2001 From: Martin Nordholts Date: Sun, 5 Dec 2021 17:16:28 +0100 Subject: [PATCH 2/8] Require --acknowledgements to build acknowledgements.bin --- CHANGELOG.md | 2 +- assets/create.sh | 2 +- src/assets/build_assets.rs | 3 ++- src/assets/build_assets/acknowledgements.rs | 7 ++----- src/bin/bat/clap_app.rs | 6 ++++++ src/bin/bat/main.rs | 10 +++++++--- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2298e5825b..9f4e89399e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,7 +44,7 @@ ## `bat` as a library - Deprecate `HighlightingAssets::syntaxes()` and `HighlightingAssets::syntax_for_file_name()`. Use `HighlightingAssets::get_syntaxes()` and `HighlightingAssets::get_syntax_for_path()` instead. They return a `Result` which is needed for upcoming lazy-loading work to improve startup performance. They also return which `SyntaxSet` the returned `SyntaxReference` belongs to. See #1747, #1755, #1776, #1862 (@Enselic) -- Remove `HighlightingAssets::from_files` and `HighlightingAssets::save_to_cache`. Instead of calling the former and then the latter you now make a single call to `bat::assets::build`. See #1802 (@Enselic) +- Remove `HighlightingAssets::from_files` and `HighlightingAssets::save_to_cache`. Instead of calling the former and then the latter you now make a single call to `bat::assets::build`. See #1802, #1971 (@Enselic) - Replace the `error::Error(error::ErrorKind, _)` struct and enum with an `error::Error` enum. `Error(ErrorKind::UnknownSyntax, _)` becomes `Error::UnknownSyntax`, etc. Also remove the `error::ResultExt` trait. These changes stem from replacing `error-chain` with `thiserror`. See #1820 (@Enselic) - Add new `MappingTarget` enum variant `MapExtensionToUnknown`. Refer to its docummentation for more information. Clients are adviced to treat `MapExtensionToUnknown` the same as `MapToUnknown` in exhaustive matches. See #1703 (@cbolgiano) diff --git a/assets/create.sh b/assets/create.sh index 65533934da..103fdb7681 100755 --- a/assets/create.sh +++ b/assets/create.sh @@ -53,7 +53,7 @@ bat cache --clear done ) -bat cache --build --blank --source="$ASSET_DIR" --target="$ASSET_DIR" +bat cache --build --blank --acknowledgements --source="$ASSET_DIR" --target="$ASSET_DIR" ( cd "$ASSET_DIR" diff --git a/src/assets/build_assets.rs b/src/assets/build_assets.rs index 9c3327e913..56c7ecb99a 100644 --- a/src/assets/build_assets.rs +++ b/src/assets/build_assets.rs @@ -10,6 +10,7 @@ mod acknowledgements; pub fn build( source_dir: &Path, include_integrated_assets: bool, + acknowledgements: bool, target_dir: &Path, current_version: &str, ) -> Result<()> { @@ -19,7 +20,7 @@ pub fn build( let syntax_set = syntax_set_builder.build(); - let acknowledgements = build_acknowledgements(source_dir, include_integrated_assets)?; + let acknowledgements = build_acknowledgements(source_dir, acknowledgements)?; print_unlinked_contexts(&syntax_set); diff --git a/src/assets/build_assets/acknowledgements.rs b/src/assets/build_assets/acknowledgements.rs index 2232962ea8..ea4f5e823a 100644 --- a/src/assets/build_assets/acknowledgements.rs +++ b/src/assets/build_assets/acknowledgements.rs @@ -15,11 +15,8 @@ See the LICENSE-APACHE and LICENSE-MIT files for license details. /// Looks for LICENSE and NOTICE files in `source_dir`, does some rudimentary /// analysis, and compiles them together in a single string that is meant to be /// used in the output to `--acknowledgements` -pub fn build_acknowledgements( - source_dir: &Path, - include_integrated_assets: bool, -) -> Result> { - if include_integrated_assets { +pub fn build_acknowledgements(source_dir: &Path, acknowledgements: bool) -> Result> { + if !acknowledgements { return Ok(None); } diff --git a/src/bin/bat/clap_app.rs b/src/bin/bat/clap_app.rs index b12e7c87e4..94ddce55f0 100644 --- a/src/bin/bat/clap_app.rs +++ b/src/bin/bat/clap_app.rs @@ -584,6 +584,12 @@ pub fn build_app(interactive_output: bool) -> ClapApp<'static, 'static> { "Create completely new syntax and theme sets \ (instead of appending to the default sets).", ), + ) + .arg( + Arg::with_name("acknowledgements") + .long("acknowledgements") + .requires("build") + .help("Build acknowledgements.bin."), ), ) } diff --git a/src/bin/bat/main.rs b/src/bin/bat/main.rs index e2c34c765a..2d9f31641a 100644 --- a/src/bin/bat/main.rs +++ b/src/bin/bat/main.rs @@ -47,9 +47,13 @@ fn build_assets(matches: &clap::ArgMatches) -> Result<()> { .map(Path::new) .unwrap_or_else(|| PROJECT_DIRS.cache_dir()); - let blank = matches.is_present("blank"); - - bat::assets::build(source_dir, !blank, target_dir, clap::crate_version!()) + bat::assets::build( + source_dir, + !matches.is_present("blank"), + matches.is_present("acknowledgements"), + target_dir, + clap::crate_version!(), + ) } fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> { From 50a83de108cdf6cbc3ba7cd4cd7d548f7afd39fe Mon Sep 17 00:00:00 2001 From: Martin Nordholts Date: Thu, 9 Dec 2021 08:19:11 +0100 Subject: [PATCH 3/8] argument -> option --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f4e89399e..6d65956ace 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ - Support for `--ignored-suffix` argument. See #1892 (@bojan88) - `$BAT_CONFIG_DIR` is now a recognized environment variable. It has precedence over `$XDG_CONFIG_HOME`, see #1727 (@billrisher) - Support for `x:+delta` syntax in line ranges (e.g. `20:+10`). See #1810 (@bojan88) -- Add new `--acknowledgements` argument that gives credit to theme and syntax definition authors. See #1971 (@Enselic) +- Add new `--acknowledgements` option that gives credit to theme and syntax definition authors. See #1971 (@Enselic) ## Bugfixes From 363637aa81a8b60b8c7335185c5533e8b4db1bfd Mon Sep 17 00:00:00 2001 From: Martin Nordholts Date: Thu, 9 Dec 2021 08:23:26 +0100 Subject: [PATCH 4/8] Add and use a NOTICE file --- NOTICE | 6 ++++++ src/assets/build_assets/acknowledgements.rs | 12 +----------- 2 files changed, 7 insertions(+), 11 deletions(-) create mode 100644 NOTICE diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000000..97ff2fc8ec --- /dev/null +++ b/NOTICE @@ -0,0 +1,6 @@ +Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat). + +bat is made available under the terms of either the MIT License or the Apache +License 2.0, at your option. + +See the LICENSE-APACHE and LICENSE-MIT files for license details. diff --git a/src/assets/build_assets/acknowledgements.rs b/src/assets/build_assets/acknowledgements.rs index ea4f5e823a..cbb6e6e11a 100644 --- a/src/assets/build_assets/acknowledgements.rs +++ b/src/assets/build_assets/acknowledgements.rs @@ -3,15 +3,6 @@ use std::path::Path; use crate::error::*; -// Sourced from the License section in the README.md -const PREAMBLE: &str = "Copyright (c) 2018-2021 bat-developers (https://github.com/sharkdp/bat). - -bat is made available under the terms of either the MIT License or the Apache -License 2.0, at your option. - -See the LICENSE-APACHE and LICENSE-MIT files for license details. -"; - /// Looks for LICENSE and NOTICE files in `source_dir`, does some rudimentary /// analysis, and compiles them together in a single string that is meant to be /// used in the output to `--acknowledgements` @@ -20,8 +11,7 @@ pub fn build_acknowledgements(source_dir: &Path, acknowledgements: bool) -> Resu return Ok(None); } - let mut acknowledgements = String::new(); - acknowledgements.push_str(PREAMBLE); + let mut acknowledgements = include_str!("../../../NOTICE").to_string(); // Sort entries so the order is stable over time let entries = walkdir::WalkDir::new(source_dir).sort_by(|a, b| a.path().cmp(b.path())); From 04aaeeec2881bda96e930e71b59da09f7aa1998c Mon Sep 17 00:00:00 2001 From: Martin Nordholts Date: Thu, 9 Dec 2021 08:29:26 +0100 Subject: [PATCH 5/8] acknowledgements -> include_acknowledgements --- src/assets/build_assets.rs | 4 ++-- src/assets/build_assets/acknowledgements.rs | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/assets/build_assets.rs b/src/assets/build_assets.rs index 56c7ecb99a..48690e806b 100644 --- a/src/assets/build_assets.rs +++ b/src/assets/build_assets.rs @@ -10,7 +10,7 @@ mod acknowledgements; pub fn build( source_dir: &Path, include_integrated_assets: bool, - acknowledgements: bool, + include_acknowledgements: bool, target_dir: &Path, current_version: &str, ) -> Result<()> { @@ -20,7 +20,7 @@ pub fn build( let syntax_set = syntax_set_builder.build(); - let acknowledgements = build_acknowledgements(source_dir, acknowledgements)?; + let acknowledgements = build_acknowledgements(source_dir, include_acknowledgements)?; print_unlinked_contexts(&syntax_set); diff --git a/src/assets/build_assets/acknowledgements.rs b/src/assets/build_assets/acknowledgements.rs index cbb6e6e11a..8f2702cc01 100644 --- a/src/assets/build_assets/acknowledgements.rs +++ b/src/assets/build_assets/acknowledgements.rs @@ -6,8 +6,11 @@ use crate::error::*; /// Looks for LICENSE and NOTICE files in `source_dir`, does some rudimentary /// analysis, and compiles them together in a single string that is meant to be /// used in the output to `--acknowledgements` -pub fn build_acknowledgements(source_dir: &Path, acknowledgements: bool) -> Result> { - if !acknowledgements { +pub fn build_acknowledgements( + source_dir: &Path, + include_acknowledgements: bool, +) -> Result> { + if !include_acknowledgements { return Ok(None); } From f25c3bf7354b2d76989b9bb5f26cde27ec23c0b1 Mon Sep 17 00:00:00 2001 From: Martin Nordholts Date: Thu, 9 Dec 2021 08:35:25 +0100 Subject: [PATCH 6/8] Simplify with markers.iter().any(|m| normalized_license_text.contains(m)) --- src/assets/build_assets/acknowledgements.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/assets/build_assets/acknowledgements.rs b/src/assets/build_assets/acknowledgements.rs index 8f2702cc01..4c05b9bc9c 100644 --- a/src/assets/build_assets/acknowledgements.rs +++ b/src/assets/build_assets/acknowledgements.rs @@ -94,12 +94,7 @@ fn license_not_needed_in_acknowledgements(license_text: &str) -> bool { fn license_contains_marker(license_text: &str, markers: &[&str]) -> bool { let normalized_license_text = normalize_license_text(license_text); - for marker in markers { - if normalized_license_text.contains(marker) { - return true; - } - } - false + markers.iter().any(|m| normalized_license_text.contains(m)) } fn append_to_acknowledgements(acknowledgements: &mut String, license_text: &str) -> Result<()> { From b9b71bd8a3f3e2f8ffadf78e1e2e756125b90d75 Mon Sep 17 00:00:00 2001 From: Martin Nordholts Date: Thu, 9 Dec 2021 11:07:12 +0100 Subject: [PATCH 7/8] Rearrange the code to include the license paths in the output --- assets/acknowledgements.bin | Bin 12542 -> 9653 bytes src/assets/build_assets/acknowledgements.rs | 119 +++++++++++++------- tests/integration_tests.rs | 9 ++ 3 files changed, 85 insertions(+), 43 deletions(-) diff --git a/assets/acknowledgements.bin b/assets/acknowledgements.bin index be7df475607f7edb83b5b0ee021d90afbc5ed82a..b3d31ea7145da0def788fcb7b70c50f6c0964e7d 100644 GIT binary patch literal 9653 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 literal 12542 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 diff --git a/src/assets/build_assets/acknowledgements.rs b/src/assets/build_assets/acknowledgements.rs index 4c05b9bc9c..333d16d8c6 100644 --- a/src/assets/build_assets/acknowledgements.rs +++ b/src/assets/build_assets/acknowledgements.rs @@ -1,8 +1,16 @@ use std::fs::read_to_string; -use std::path::Path; +use std::path::{Path, PathBuf}; + +use walkdir::DirEntry; use crate::error::*; +struct PathAndStem { + path: PathBuf, + stem: String, + relative_path: String, +} + /// Looks for LICENSE and NOTICE files in `source_dir`, does some rudimentary /// analysis, and compiles them together in a single string that is meant to be /// used in the output to `--acknowledgements` @@ -14,51 +22,63 @@ pub fn build_acknowledgements( return Ok(None); } - let mut acknowledgements = include_str!("../../../NOTICE").to_string(); + let mut acknowledgements = format!("{}\n\n", include_str!("../../../NOTICE")); // Sort entries so the order is stable over time let entries = walkdir::WalkDir::new(source_dir).sort_by(|a, b| a.path().cmp(b.path())); - for entry in entries { - let entry = match entry { - Ok(entry) => entry, - Err(_) => continue, - }; - - let path = entry.path(); - let stem = match path.file_stem().and_then(|s| s.to_str()) { - Some(stem) => stem, - None => continue, - }; - - handle_file(&mut acknowledgements, path, stem)? + for path_and_stem in entries + .into_iter() + .flatten() + .map(|entry| to_path_and_stem(source_dir, entry)) + .flatten() + { + if let Some(license_text) = handle_file(&path_and_stem)? { + append_to_acknowledgements( + &mut acknowledgements, + &path_and_stem.relative_path, + &license_text, + ) + } } Ok(Some(acknowledgements)) } -fn handle_file(acknowledgements: &mut String, path: &Path, stem: &str) -> Result<()> { - if stem == "NOTICE" { - handle_notice(acknowledgements, path)?; - } else if stem.to_ascii_uppercase() == "LICENSE" { - handle_license(acknowledgements, path)?; - } +fn to_path_and_stem(source_dir: &Path, entry: DirEntry) -> Option { + let path = entry.path(); + + Some(PathAndStem { + path: path.to_owned(), + stem: path.file_stem().map(|s| s.to_string_lossy().to_string())?, + relative_path: path + .strip_prefix(source_dir) + .map(|p| p.to_string_lossy().to_string()) + .ok()?, + }) +} - Ok(()) +fn handle_file(path_and_stem: &PathAndStem) -> Result> { + if path_and_stem.stem == "NOTICE" { + handle_notice(&path_and_stem.path) + } else if path_and_stem.stem.to_ascii_uppercase() == "LICENSE" { + handle_license(&path_and_stem.path) + } else { + Ok(None) + } } -fn handle_notice(acknowledgements: &mut String, path: &Path) -> Result<()> { +fn handle_notice(path: &Path) -> Result> { // Assume NOTICE as defined by Apache License 2.0. These must be part of acknowledgements. - let license_text = read_to_string(path)?; - append_to_acknowledgements(acknowledgements, &license_text) + Ok(Some(read_to_string(path)?)) } -fn handle_license(acknowledgements: &mut String, path: &Path) -> Result<()> { +fn handle_license(path: &Path) -> Result> { let license_text = read_to_string(path)?; if include_license_in_acknowledgments(&license_text) { - append_to_acknowledgements(acknowledgements, &license_text) + Ok(Some(license_text)) } else if license_not_needed_in_acknowledgements(&license_text) { - Ok(()) + Ok(None) } else { Err(format!("ERROR: License is of unknown type: {:?}", path).into()) } @@ -97,14 +117,12 @@ fn license_contains_marker(license_text: &str, markers: &[&str]) -> bool { markers.iter().any(|m| normalized_license_text.contains(m)) } -fn append_to_acknowledgements(acknowledgements: &mut String, license_text: &str) -> Result<()> { - // Most license texts wrap at 80 chars so our horizontal divider is 80 chars - acknowledgements.push_str( - "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――\n", - ); - - // Now add the license text itself - acknowledgements.push_str(license_text); +fn append_to_acknowledgements( + acknowledgements: &mut String, + relative_path: &str, + license_text: &str, +) { + acknowledgements.push_str(&format!("## {}\n\n{}", relative_path, license_text)); // Make sure the last char is a newline to not mess up formatting later if acknowledgements @@ -116,7 +134,9 @@ fn append_to_acknowledgements(acknowledgements: &mut String, license_text: &str) acknowledgements.push('\n'); } - Ok(()) + // Add two more newlines to make it easy to distinguish where this text ends + // and the next starts + acknowledgements.push_str("\n\n"); } /// Replaces newlines with a space character, and replaces multiple spaces with one space. @@ -162,24 +182,37 @@ and we need to handle that."; #[test] fn test_append_to_acknowledgements_adds_newline_if_missing() { - let mut acknowledgements = "preamble\n".to_owned(); + let mut acknowledgements = "preamble\n\n\n".to_owned(); - append_to_acknowledgements(&mut acknowledgements, "line without newline").unwrap(); + append_to_acknowledgements(&mut acknowledgements, "some/path", "line without newline"); assert_eq!( "preamble -―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― + + +## some/path + line without newline + + ", acknowledgements ); - append_to_acknowledgements(&mut acknowledgements, "line with newline\n").unwrap(); + append_to_acknowledgements(&mut acknowledgements, "another/path", "line with newline\n"); assert_eq!( "preamble -―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― + + +## some/path + line without newline -―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― + + +## another/path + line with newline + + ", acknowledgements ); diff --git a/tests/integration_tests.rs b/tests/integration_tests.rs index 17a044c2c1..8dc11f166a 100644 --- a/tests/integration_tests.rs +++ b/tests/integration_tests.rs @@ -1278,6 +1278,15 @@ fn acknowledgements() { .and(predicate::str::contains( "Copyright (c) 2013-present Dracula Theme", )) + .and(predicate::str::contains( + "## syntaxes/01_Packages/Rust/LICENSE.txt", + )) + .and(predicate::str::contains( + "## syntaxes/02_Extra/http-request-response/LICENSE", + )) + .and(predicate::str::contains( + "## themes/dracula-sublime/LICENSE", + )) .and(predicate::str::contains("Copyright (c) 2017 b123400")) .and(predicate::str::contains("Copyright (c) 2021 Keith Hall")) .and(predicate::str::contains("Copyright 2014 Clams")), From 0e52ed1fe24b6c2d045a9a90e563117e1970d304 Mon Sep 17 00:00:00 2001 From: Martin Nordholts Date: Sat, 11 Dec 2021 13:39:29 +0100 Subject: [PATCH 8/8] Replace .map() and .flatten() with .flat_map() --- src/assets/build_assets/acknowledgements.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/assets/build_assets/acknowledgements.rs b/src/assets/build_assets/acknowledgements.rs index 333d16d8c6..742e3791bd 100644 --- a/src/assets/build_assets/acknowledgements.rs +++ b/src/assets/build_assets/acknowledgements.rs @@ -29,8 +29,7 @@ pub fn build_acknowledgements( for path_and_stem in entries .into_iter() .flatten() - .map(|entry| to_path_and_stem(source_dir, entry)) - .flatten() + .flat_map(|entry| to_path_and_stem(source_dir, entry)) { if let Some(license_text) = handle_file(&path_and_stem)? { append_to_acknowledgements(