@@ -848,6 +848,12 @@ impl<'a> Processor for BenchProcessor<'a> {
848
848
if let Some ( ref profile) = res. 1 {
849
849
store_artifact_sizes_into_stats ( & mut res. 0 , profile) ;
850
850
}
851
+ if let Profile :: Doc = data. profile {
852
+ let doc_dir = data. cwd . join ( "target/doc" ) ;
853
+ if doc_dir. is_dir ( ) {
854
+ store_documentation_size_into_stats ( & mut res. 0 , & doc_dir) ;
855
+ }
856
+ }
851
857
852
858
match data. scenario {
853
859
Scenario :: Full => {
@@ -894,6 +900,44 @@ impl<'a> Processor for BenchProcessor<'a> {
894
900
}
895
901
}
896
902
903
+ fn store_documentation_size_into_stats ( stats : & mut Stats , doc_dir : & Path ) {
904
+ match get_file_count_and_size ( doc_dir) {
905
+ Ok ( ( count, size) ) => {
906
+ stats. insert ( "size:doc_files_count" . to_string ( ) , count as f64 ) ;
907
+ stats. insert ( "size:doc_bytes" . to_string ( ) , size as f64 ) ;
908
+ }
909
+ Err ( error) => log:: error!(
910
+ "Cannot get size of documentation directory {}: {:?}" ,
911
+ doc_dir. display( ) ,
912
+ error
913
+ ) ,
914
+ }
915
+ }
916
+
917
+ /// Counts the number of files and the total size of all files within the given `path`.
918
+ /// File size is counted as the actual size in bytes, i.e. the size returned by
919
+ /// [std::path::Path::metadata].
920
+ ///
921
+ /// Returns (file_count, size).
922
+ pub fn get_file_count_and_size ( path : & Path ) -> std:: io:: Result < ( u64 , u64 ) > {
923
+ let ( count, size) = if path. is_dir ( ) {
924
+ let mut file_count = 0 ;
925
+ let mut total_size = 0 ;
926
+ for entry in fs:: read_dir ( & path) ? {
927
+ let path = entry?. path ( ) ;
928
+ let ( count, size) = get_file_count_and_size ( & path) ?;
929
+ file_count += count;
930
+ total_size += size;
931
+ }
932
+ ( file_count, total_size)
933
+ } else if path. is_file ( ) {
934
+ ( 1 , path. metadata ( ) ?. len ( ) )
935
+ } else {
936
+ ( 0 , 0 )
937
+ } ;
938
+ Ok ( ( count, size) )
939
+ }
940
+
897
941
fn store_artifact_sizes_into_stats ( stats : & mut Stats , profile : & SelfProfile ) {
898
942
for artifact in profile. artifact_sizes . iter ( ) {
899
943
stats
@@ -1758,3 +1802,31 @@ pub struct QueryData {
1758
1802
pub blocked_time : Duration ,
1759
1803
pub incremental_load_time : Duration ,
1760
1804
}
1805
+
1806
+ #[ cfg( test) ]
1807
+ mod tests {
1808
+ use crate :: execute:: get_file_count_and_size;
1809
+ use std:: path:: PathBuf ;
1810
+
1811
+ #[ test]
1812
+ fn test_get_file_count_and_size ( ) {
1813
+ let dir = tempfile:: TempDir :: new ( ) . unwrap ( ) ;
1814
+ let root = dir. path ( ) ;
1815
+
1816
+ let write = |path : PathBuf , size : usize | {
1817
+ std:: fs:: create_dir_all ( path. parent ( ) . unwrap ( ) ) . unwrap ( ) ;
1818
+ std:: fs:: write ( path, vec ! [ 0u8 ; size] . as_slice ( ) ) . unwrap ( ) ;
1819
+ } ;
1820
+
1821
+ write ( root. join ( "a/b/c.rs" ) , 1024 ) ;
1822
+ write ( root. join ( "a/b/d.rs" ) , 16 ) ;
1823
+ write ( root. join ( "a/x.rs" ) , 32 ) ;
1824
+ write ( root. join ( "b/x.rs" ) , 64 ) ;
1825
+ write ( root. join ( "b/x2.rs" ) , 64 ) ;
1826
+ write ( root. join ( "x.rs" ) , 128 ) ;
1827
+
1828
+ let ( files, size) = get_file_count_and_size ( root) . unwrap ( ) ;
1829
+ assert_eq ! ( files, 6 ) ;
1830
+ assert_eq ! ( size, 1024 + 16 + 32 + 64 + 64 + 128 ) ;
1831
+ }
1832
+ }
0 commit comments