@@ -203,18 +203,23 @@ fn render_pkg_readme<R: Read>(mut archive: Archive<R>, pkg_name: &str) -> Option
203
203
204
204
let manifest: Manifest = {
205
205
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)
207
+ . unwrap_or_else ( || panic ! ( "[{}] couldn't open file: Cargo.toml" , pkg_name) ) ;
207
208
toml:: from_str ( & contents)
208
209
. unwrap_or_else ( |_| panic ! ( "[{}] Syntax error in manifest file" , pkg_name) )
209
210
} ;
210
211
211
212
let rendered = {
212
- let readme_path = manifest. package . readme . as_ref ( ) ?;
213
+ let readme_path = manifest
214
+ . package
215
+ . readme
216
+ . clone ( )
217
+ . unwrap_or_else ( || "README.md" . into ( ) ) ;
213
218
let path = format ! ( "{}/{}" , pkg_name, readme_path) ;
214
- 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) ? ;
215
220
text_to_html (
216
221
& contents,
217
- readme_path,
222
+ & readme_path,
218
223
manifest. package . repository . as_deref ( ) ,
219
224
)
220
225
} ;
@@ -237,7 +242,7 @@ fn find_file_by_path<R: Read>(
237
242
entries : & mut tar:: Entries < ' _ , R > ,
238
243
path : & Path ,
239
244
pkg_name : & str ,
240
- ) -> String {
245
+ ) -> Option < String > {
241
246
let mut file = entries
242
247
. find ( |entry| match * entry {
243
248
Err ( _) => false ,
@@ -248,14 +253,13 @@ fn find_file_by_path<R: Read>(
248
253
} ;
249
254
filepath == path
250
255
}
251
- } )
252
- . unwrap_or_else ( || panic ! ( "[{}] couldn't open file: {}" , pkg_name, path. display( ) ) )
256
+ } ) ?
253
257
. unwrap_or_else ( |_| panic ! ( "[{}] file is not present: {}" , pkg_name, path. display( ) ) ) ;
254
258
255
259
let mut contents = String :: new ( ) ;
256
260
file. read_to_string ( & mut contents)
257
261
. unwrap_or_else ( |_| panic ! ( "[{}] Couldn't read file contents" , pkg_name) ) ;
258
- contents
262
+ Some ( contents)
259
263
}
260
264
261
265
#[ cfg( test) ]
@@ -290,6 +294,37 @@ readme = "README.md"
290
294
assert ! ( result. contains( "readme" ) )
291
295
}
292
296
297
+ #[ test]
298
+ fn test_render_pkg_no_readme ( ) {
299
+ let mut pkg = tar:: Builder :: new ( vec ! [ ] ) ;
300
+ add_file (
301
+ & mut pkg,
302
+ "foo-0.0.1/Cargo.toml" ,
303
+ br#"
304
+ [package]
305
+ "# ,
306
+ ) ;
307
+ let serialized_archive = pkg. into_inner ( ) . unwrap ( ) ;
308
+ assert ! ( render_pkg_readme( tar:: Archive :: new( & * serialized_archive) , "foo-0.0.1" ) . is_none( ) ) ;
309
+ }
310
+
311
+ #[ test]
312
+ fn test_render_pkg_implicit_readme ( ) {
313
+ let mut pkg = tar:: Builder :: new ( vec ! [ ] ) ;
314
+ add_file (
315
+ & mut pkg,
316
+ "foo-0.0.1/Cargo.toml" ,
317
+ br#"
318
+ [package]
319
+ "# ,
320
+ ) ;
321
+ add_file ( & mut pkg, "foo-0.0.1/README.md" , b"readme" ) ;
322
+ let serialized_archive = pkg. into_inner ( ) . unwrap ( ) ;
323
+ let result =
324
+ render_pkg_readme ( tar:: Archive :: new ( & * serialized_archive) , "foo-0.0.1" ) . unwrap ( ) ;
325
+ assert ! ( result. contains( "readme" ) )
326
+ }
327
+
293
328
#[ test]
294
329
fn test_render_pkg_readme_w_link ( ) {
295
330
let mut pkg = tar:: Builder :: new ( vec ! [ ] ) ;
0 commit comments