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