| // Copyright 2023 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| use anyhow::anyhow; |
| use clap::Parser as _; |
| use file_header::{ |
| add_headers_recursively, check_headers_recursively, |
| license::spdx::{YearCopyrightOwnerValue, APACHE_2_0}, |
| }; |
| use globset::{Glob, GlobSet, GlobSetBuilder}; |
| use std::{env, path::PathBuf}; |
| |
| fn main() -> anyhow::Result<()> { |
| let rust_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?); |
| let ignore_globset = ignore_globset()?; |
| // Note: when adding headers, there is a bug where the line spacing is off for Apache 2.0 (see https://github.com/spdx/license-list-XML/issues/2127) |
| let header = APACHE_2_0.build_header(YearCopyrightOwnerValue::new(2023, "Google LLC".into())); |
| |
| let cli = Cli::parse(); |
| |
| match cli.subcommand { |
| Subcommand::CheckAll => { |
| let result = |
| check_headers_recursively(&rust_dir, |p| !ignore_globset.is_match(p), header, 4)?; |
| if result.has_failure() { |
| return Err(anyhow!( |
| "The following files do not have headers: {result:?}" |
| )); |
| } |
| } |
| Subcommand::AddAll => { |
| let files_with_new_header = |
| add_headers_recursively(&rust_dir, |p| !ignore_globset.is_match(p), header)?; |
| files_with_new_header |
| .iter() |
| .for_each(|path| println!("Added header to: {path:?}")); |
| } |
| } |
| Ok(()) |
| } |
| |
| fn ignore_globset() -> anyhow::Result<GlobSet> { |
| Ok(GlobSetBuilder::new() |
| .add(Glob::new("**/.idea/**")?) |
| .add(Glob::new("**/target/**")?) |
| .add(Glob::new("**/.gitignore")?) |
| .add(Glob::new("**/CHANGELOG.md")?) |
| .add(Glob::new("**/Cargo.lock")?) |
| .add(Glob::new("**/Cargo.toml")?) |
| .add(Glob::new("**/README.md")?) |
| .add(Glob::new("*.bin")?) |
| .build()?) |
| } |
| |
| #[derive(clap::Parser)] |
| struct Cli { |
| #[clap(subcommand)] |
| subcommand: Subcommand, |
| } |
| |
| #[derive(clap::Subcommand, Debug, Clone)] |
| enum Subcommand { |
| /// Checks if a license is present in files that are not in the ignore list. |
| CheckAll, |
| /// Adds a license as needed to files that are not in the ignore list. |
| AddAll, |
| } |