about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJonathan Pallant <jonathan.pallant@ferrous-systems.com>2024-08-06 11:02:11 +0100
committerJonathan Pallant <jonathan.pallant@ferrous-systems.com>2024-08-06 11:11:09 +0100
commit5277b67b6977e3fcef64b0ce21cecd3a5dc9c22a (patch)
treef6c3d4ebcde87bcfcc5bc1e9c5793ec4f9515968
parent30ac7c9a817793a86d870eeab5a8238acb29b186 (diff)
downloadrust-5277b67b6977e3fcef64b0ce21cecd3a5dc9c22a.tar.gz
rust-5277b67b6977e3fcef64b0ce21cecd3a5dc9c22a.zip
generate-copyright: gather files inside interesting folders
-rw-r--r--src/tools/generate-copyright/src/cargo_metadata.rs50
1 files changed, 33 insertions, 17 deletions
diff --git a/src/tools/generate-copyright/src/cargo_metadata.rs b/src/tools/generate-copyright/src/cargo_metadata.rs
index d02b9eeb6f9..c85e4aa371a 100644
--- a/src/tools/generate-copyright/src/cargo_metadata.rs
+++ b/src/tools/generate-copyright/src/cargo_metadata.rs
@@ -2,7 +2,7 @@
 
 use std::collections::BTreeMap;
 use std::ffi::OsStr;
-use std::path::Path;
+use std::path::{Path, PathBuf};
 
 /// Describes how this module can fail
 #[derive(Debug, thiserror::Error)]
@@ -15,6 +15,8 @@ pub enum Error {
     LaunchingVendor(std::io::Error),
     #[error("Failed to complete cargo vendor")]
     RunningVendor,
+    #[error("Bad path {0:?} whilst scraping files")]
+    Scraping(PathBuf),
 }
 
 /// Uniquely describes a package on crates.io
@@ -150,24 +152,38 @@ fn load_important_files(
         let entry = entry?;
         let metadata = entry.metadata()?;
         let path = entry.path();
-        if let Some(filename) = path.file_name() {
-            let lc_filename = filename.to_ascii_lowercase();
-            let lc_filename_str = lc_filename.to_string_lossy();
-            let mut keep = false;
-            for m in ["copyright", "licence", "license", "author", "notice"] {
-                if lc_filename_str.contains(m) {
-                    keep = true;
-                    break;
-                }
+        let Some(filename) = path.file_name() else {
+            return Err(Error::Scraping(path));
+        };
+        let lc_filename = filename.to_ascii_lowercase();
+        let lc_filename_str = lc_filename.to_string_lossy();
+        let mut keep = false;
+        for m in ["copyright", "licence", "license", "author", "notice"] {
+            if lc_filename_str.contains(m) {
+                keep = true;
+                break;
             }
-            if keep {
-                if metadata.is_dir() {
-                    // scoop up whole directory
-                } else if metadata.is_file() {
-                    let filename = filename.to_string_lossy();
-                    println!("Scraping {}", filename);
-                    dep.notices.insert(filename.to_string(), std::fs::read_to_string(path)?);
+        }
+        if keep {
+            if metadata.is_dir() {
+                for inner_entry in std::fs::read_dir(entry.path())? {
+                    let inner_entry = inner_entry?;
+                    if inner_entry.metadata()?.is_file() {
+                        let inner_filename = inner_entry.file_name();
+                        let inner_filename_str = inner_filename.to_string_lossy();
+                        let qualified_filename =
+                            format!("{}/{}", lc_filename_str, inner_filename_str);
+                        println!("Scraping {}", qualified_filename);
+                        dep.notices.insert(
+                            qualified_filename.to_string(),
+                            std::fs::read_to_string(inner_entry.path())?,
+                        );
+                    }
                 }
+            } else if metadata.is_file() {
+                let filename = filename.to_string_lossy();
+                println!("Scraping {}", filename);
+                dep.notices.insert(filename.to_string(), std::fs::read_to_string(path)?);
             }
         }
     }