11use std:: io:: { BufReader , Read } ;
22use std:: path:: Path ;
33
4+ use flate2:: read:: GzDecoder ;
45use zip:: ZipArchive ;
56
67use crate :: { Error , Metadata } ;
@@ -66,7 +67,32 @@ impl Distribution {
6667 }
6768
6869 fn parse_sdist ( path : & Path , sdist_type : SDistType ) -> Result < Metadata , Error > {
69- todo ! ( )
70+ match sdist_type {
71+ SDistType :: Zip => Self :: parse_zip ( path, "PKG-INFO" ) ,
72+ SDistType :: TarGz => {
73+ let mut reader =
74+ tar:: Archive :: new ( GzDecoder :: new ( BufReader :: new ( fs_err:: File :: open ( path) ?) ) ) ;
75+ let metadata_file = reader
76+ . entries ( ) ?
77+ . map ( |entry| -> Result < _ , Error > {
78+ let entry = entry?;
79+ if entry. path ( ) ?. ends_with ( "PKG-INFO" ) {
80+ Ok ( Some ( entry) )
81+ } else {
82+ Ok ( None )
83+ }
84+ } )
85+ . find_map ( |x| x. transpose ( ) ) ;
86+ if let Some ( metadata_file) = metadata_file {
87+ let mut entry = metadata_file?;
88+ let mut buf = Vec :: new ( ) ;
89+ entry. read_to_end ( & mut buf) ?;
90+ Metadata :: parse ( & buf)
91+ } else {
92+ Err ( Error :: MetadataNotFound )
93+ }
94+ }
95+ }
7096 }
7197
7298 fn parse_egg ( path : & Path ) -> Result < Metadata , Error > {
@@ -92,6 +118,14 @@ impl Distribution {
92118 archive. by_name ( metadata_file) ?. read_to_end ( & mut buf) ?;
93119 Metadata :: parse ( & buf)
94120 }
121+ [ file1, file2]
122+ if file1. ends_with ( ".egg-info/PKG-INFO" )
123+ || file2. ends_with ( ".egg-info/PKG-INFO" ) =>
124+ {
125+ let mut buf = Vec :: new ( ) ;
126+ archive. by_name ( file1) ?. read_to_end ( & mut buf) ?;
127+ Metadata :: parse ( & buf)
128+ }
95129 _ => Err ( Error :: MultipleMetadataFiles ( metadata_files) ) ,
96130 }
97131 }
0 commit comments