@@ -204,18 +204,22 @@ fn render_pkg_readme<R: Read>(mut pkg: Archive<R>, pkg_name: &str) -> Option<Str
204
204
. unwrap_or_else ( |_| panic ! ( "[{}] Invalid tar archive entries" , pkg_name) ) ;
205
205
let manifest: Manifest = {
206
206
let path = format ! ( "{}/Cargo.toml" , pkg_name) ;
207
- let contents = find_file_by_path ( & mut entries, Path :: new ( & path) , pkg_name) ;
207
+ let contents = find_file_by_path ( & mut entries, Path :: new ( & path) , pkg_name) . unwrap ( ) ;
208
208
toml:: from_str ( & contents)
209
209
. unwrap_or_else ( |_| panic ! ( "[{}] Syntax error in manifest file" , pkg_name) )
210
210
} ;
211
211
212
212
let rendered = {
213
- let readme_path = manifest. package . readme . as_ref ( ) ?;
213
+ let readme_path = manifest
214
+ . package
215
+ . readme
216
+ . clone ( )
217
+ . unwrap_or ( "README.md" . into ( ) ) ;
214
218
let path = format ! ( "{}/{}" , pkg_name, readme_path) ;
215
- let contents = find_file_by_path ( & mut entries, Path :: new ( & path) , pkg_name) ;
219
+ let contents = find_file_by_path ( & mut entries, Path :: new ( & path) , pkg_name) ? ;
216
220
text_to_html (
217
221
& contents,
218
- readme_path,
222
+ & readme_path,
219
223
manifest. package . repository . as_deref ( ) ,
220
224
)
221
225
} ;
@@ -238,7 +242,7 @@ fn find_file_by_path<R: Read>(
238
242
entries : & mut tar:: Entries < ' _ , R > ,
239
243
path : & Path ,
240
244
pkg_name : & str ,
241
- ) -> String {
245
+ ) -> Option < String > {
242
246
let mut file = entries
243
247
. find ( |entry| match * entry {
244
248
Err ( _) => false ,
@@ -249,13 +253,12 @@ fn find_file_by_path<R: Read>(
249
253
} ;
250
254
filepath == path
251
255
}
252
- } )
253
- . unwrap_or_else ( || panic ! ( "[{}] couldn't open file: {}" , pkg_name, path. display( ) ) )
256
+ } ) ?
254
257
. unwrap_or_else ( |_| panic ! ( "[{}] file is not present: {}" , pkg_name, path. display( ) ) ) ;
255
258
let mut contents = String :: new ( ) ;
256
259
file. read_to_string ( & mut contents)
257
260
. unwrap_or_else ( |_| panic ! ( "[{}] Couldn't read file contents" , pkg_name) ) ;
258
- contents
261
+ Some ( contents)
259
262
}
260
263
261
264
#[ cfg( test) ]
@@ -290,6 +293,37 @@ readme = "README.md"
290
293
assert ! ( result. contains( "readme" ) )
291
294
}
292
295
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
+
293
327
#[ test]
294
328
fn test_render_pkg_readme_w_link ( ) {
295
329
let mut pkg = tar:: Builder :: new ( vec ! [ ] ) ;
0 commit comments