@@ -218,28 +218,40 @@ fn render_pkg_readme<R: Read>(mut pkg: Archive<R>, pkg_name: &str) -> Option<Str
218
218
. get ( & OsString :: from ( path) )
219
219
. unwrap_or_else ( || panic ! ( "[{}] couldn't open file: Cargo.toml" , pkg_name) ) ;
220
220
toml:: from_str ( contents)
221
- . unwrap_or_else ( |_ | panic ! ( "[{}] Syntax error in manifest file" , pkg_name) )
221
+ . unwrap_or_else ( |e | panic ! ( "[{}] Syntax error in manifest file {} " , pkg_name, e ) )
222
222
} ;
223
223
224
224
let rendered = {
225
- let readme_path = manifest
226
- . package
227
- . readme
228
- . clone ( )
229
- . unwrap_or_else ( || "README.md" . into ( ) ) ;
225
+ let readme_path = match manifest. package . readme . as_ref ( ) {
226
+ Some ( toml:: Value :: String ( readme_path) ) => readme_path,
227
+ Some ( toml:: Value :: Boolean ( true ) ) | None => {
228
+ if entries. contains_key ( & OsString :: from ( format ! ( "{}/README.md" , pkg_name) ) ) {
229
+ "README.md"
230
+ } else if entries. contains_key ( & OsString :: from ( format ! ( "{}/README.txt" , pkg_name) ) )
231
+ {
232
+ "README.txt"
233
+ } else if entries. contains_key ( & OsString :: from ( format ! ( "{}/README" , pkg_name) ) ) {
234
+ "README"
235
+ } else {
236
+ return None ;
237
+ }
238
+ }
239
+ _ => return None ,
240
+ } ;
241
+
230
242
let path = format ! ( "{}/{}" , pkg_name, readme_path) ;
231
243
let contents = entries. get ( & OsString :: from ( path) ) ?;
232
244
text_to_html (
233
245
contents,
234
- & readme_path,
246
+ readme_path,
235
247
manifest. package . repository . as_deref ( ) ,
236
248
)
237
249
} ;
238
250
return Some ( rendered) ;
239
251
240
252
#[ derive( Debug , Deserialize ) ]
241
253
struct Package {
242
- readme : Option < String > ,
254
+ readme : Option < toml :: Value > ,
243
255
repository : Option < String > ,
244
256
}
245
257
@@ -296,17 +308,67 @@ readme = "README.md"
296
308
}
297
309
298
310
#[ test]
299
- fn test_render_pkg_implicit_readme ( ) {
311
+ fn test_render_pkg_readme_false ( ) {
300
312
let mut pkg = tar:: Builder :: new ( vec ! [ ] ) ;
301
313
add_file (
302
314
& mut pkg,
303
315
"foo-0.0.1/Cargo.toml" ,
304
316
br#"
305
317
[package]
318
+ readme = false
306
319
"# ,
307
320
) ;
308
321
add_file ( & mut pkg, "foo-0.0.1/README.md" , b"readme" ) ;
309
322
let serialized_archive = pkg. into_inner ( ) . unwrap ( ) ;
323
+ assert ! ( render_pkg_readme( tar:: Archive :: new( & * serialized_archive) , "foo-0.0.1" ) . is_none( ) ) ;
324
+ }
325
+
326
+ #[ test]
327
+ fn test_render_pkg_implicit_readme_md ( ) {
328
+ let mut pkg = tar:: Builder :: new ( vec ! [ ] ) ;
329
+ add_file (
330
+ & mut pkg,
331
+ "foo-0.0.1/Cargo.toml" ,
332
+ br#"
333
+ [package]
334
+ "# ,
335
+ ) ;
336
+ add_file ( & mut pkg, "foo-0.0.1/README.md" , b"readme" ) ;
337
+ let serialized_archive = pkg. into_inner ( ) . unwrap ( ) ;
338
+ let result =
339
+ render_pkg_readme ( tar:: Archive :: new ( & * serialized_archive) , "foo-0.0.1" ) . unwrap ( ) ;
340
+ assert ! ( result. contains( "readme" ) )
341
+ }
342
+
343
+ #[ test]
344
+ fn test_render_pkg_implicit_readme_txt ( ) {
345
+ let mut pkg = tar:: Builder :: new ( vec ! [ ] ) ;
346
+ add_file (
347
+ & mut pkg,
348
+ "foo-0.0.1/Cargo.toml" ,
349
+ br#"
350
+ [package]
351
+ "# ,
352
+ ) ;
353
+ add_file ( & mut pkg, "foo-0.0.1/README.txt" , b"readme" ) ;
354
+ let serialized_archive = pkg. into_inner ( ) . unwrap ( ) ;
355
+ let result =
356
+ render_pkg_readme ( tar:: Archive :: new ( & * serialized_archive) , "foo-0.0.1" ) . unwrap ( ) ;
357
+ assert ! ( result. contains( "readme" ) )
358
+ }
359
+
360
+ #[ test]
361
+ fn test_render_pkg_implicit_readme ( ) {
362
+ let mut pkg = tar:: Builder :: new ( vec ! [ ] ) ;
363
+ add_file (
364
+ & mut pkg,
365
+ "foo-0.0.1/Cargo.toml" ,
366
+ br#"
367
+ [package]
368
+ "# ,
369
+ ) ;
370
+ add_file ( & mut pkg, "foo-0.0.1/README" , b"readme" ) ;
371
+ let serialized_archive = pkg. into_inner ( ) . unwrap ( ) ;
310
372
let result =
311
373
render_pkg_readme ( tar:: Archive :: new ( & * serialized_archive) , "foo-0.0.1" ) . unwrap ( ) ;
312
374
assert ! ( result. contains( "readme" ) )
0 commit comments