@@ -203,18 +203,22 @@ fn render_pkg_readme<R: Read>(mut archive: Archive<R>, pkg_name: &str) -> Option
203203
204204 let manifest: Manifest = {
205205 let path = format ! ( "{}/Cargo.toml" , pkg_name) ;
206- let contents = find_file_by_path ( & mut entries, Path :: new ( & path) , pkg_name) ;
206+ let contents = find_file_by_path ( & mut entries, Path :: new ( & path) , pkg_name) . unwrap ( ) ;
207207 toml:: from_str ( & contents)
208208 . unwrap_or_else ( |_| panic ! ( "[{}] Syntax error in manifest file" , pkg_name) )
209209 } ;
210210
211211 let rendered = {
212- let readme_path = manifest. package . readme . as_ref ( ) ?;
212+ let readme_path = manifest
213+ . package
214+ . readme
215+ . clone ( )
216+ . unwrap_or_else ( || "README.md" . into ( ) ) ;
213217 let path = format ! ( "{}/{}" , pkg_name, readme_path) ;
214- let contents = find_file_by_path ( & mut entries, Path :: new ( & path) , pkg_name) ;
218+ let contents = find_file_by_path ( & mut entries, Path :: new ( & path) , pkg_name) ? ;
215219 text_to_html (
216220 & contents,
217- readme_path,
221+ & readme_path,
218222 manifest. package . repository . as_deref ( ) ,
219223 )
220224 } ;
@@ -237,7 +241,7 @@ fn find_file_by_path<R: Read>(
237241 entries : & mut tar:: Entries < ' _ , R > ,
238242 path : & Path ,
239243 pkg_name : & str ,
240- ) -> String {
244+ ) -> Option < String > {
241245 let mut file = entries
242246 . find ( |entry| match * entry {
243247 Err ( _) => false ,
@@ -248,14 +252,13 @@ fn find_file_by_path<R: Read>(
248252 } ;
249253 filepath == path
250254 }
251- } )
252- . unwrap_or_else ( || panic ! ( "[{}] couldn't open file: {}" , pkg_name, path. display( ) ) )
255+ } ) ?
253256 . unwrap_or_else ( |_| panic ! ( "[{}] file is not present: {}" , pkg_name, path. display( ) ) ) ;
254257
255258 let mut contents = String :: new ( ) ;
256259 file. read_to_string ( & mut contents)
257260 . unwrap_or_else ( |_| panic ! ( "[{}] Couldn't read file contents" , pkg_name) ) ;
258- contents
261+ Some ( contents)
259262}
260263
261264#[ cfg( test) ]
@@ -290,6 +293,37 @@ readme = "README.md"
290293 assert ! ( result. contains( "readme" ) )
291294 }
292295
296+ #[ test]
297+ fn test_render_pkg_no_readme ( ) {
298+ let mut pkg = tar:: Builder :: new ( vec ! [ ] ) ;
299+ add_file (
300+ & mut pkg,
301+ "foo-0.0.1/Cargo.toml" ,
302+ br#"
303+ [package]
304+ "# ,
305+ ) ;
306+ let serialized_archive = pkg. into_inner ( ) . unwrap ( ) ;
307+ assert ! ( render_pkg_readme( tar:: Archive :: new( & * serialized_archive) , "foo-0.0.1" ) . is_none( ) ) ;
308+ }
309+
310+ #[ test]
311+ fn test_render_pkg_implicit_readme ( ) {
312+ let mut pkg = tar:: Builder :: new ( vec ! [ ] ) ;
313+ add_file (
314+ & mut pkg,
315+ "foo-0.0.1/Cargo.toml" ,
316+ br#"
317+ [package]
318+ "# ,
319+ ) ;
320+ add_file ( & mut pkg, "foo-0.0.1/README.md" , b"readme" ) ;
321+ let serialized_archive = pkg. into_inner ( ) . unwrap ( ) ;
322+ let result =
323+ render_pkg_readme ( tar:: Archive :: new ( & * serialized_archive) , "foo-0.0.1" ) . unwrap ( ) ;
324+ assert ! ( result. contains( "readme" ) )
325+ }
326+
293327 #[ test]
294328 fn test_render_pkg_readme_w_link ( ) {
295329 let mut pkg = tar:: Builder :: new ( vec ! [ ] ) ;
0 commit comments