Skip to content

Commit 6198360

Browse files
committed
admin::render_readmes: Support broader implicit readmes
Support readme = false, and readme omitted per https://doc.rust-lang.org/cargo/reference/manifest.html#the-readme-field
1 parent 38ce91a commit 6198360

File tree

1 file changed

+71
-9
lines changed

1 file changed

+71
-9
lines changed

src/admin/render_readmes.rs

+71-9
Original file line numberDiff line numberDiff line change
@@ -218,28 +218,40 @@ fn render_pkg_readme<R: Read>(mut pkg: Archive<R>, pkg_name: &str) -> Option<Str
218218
.get(&OsString::from(path))
219219
.unwrap_or_else(|| panic!("[{}] couldn't open file: Cargo.toml", pkg_name));
220220
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))
222222
};
223223

224224
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+
230242
let path = format!("{}/{}", pkg_name, readme_path);
231243
let contents = entries.get(&OsString::from(path))?;
232244
text_to_html(
233245
contents,
234-
&readme_path,
246+
readme_path,
235247
manifest.package.repository.as_deref(),
236248
)
237249
};
238250
return Some(rendered);
239251

240252
#[derive(Debug, Deserialize)]
241253
struct Package {
242-
readme: Option<String>,
254+
readme: Option<toml::Value>,
243255
repository: Option<String>,
244256
}
245257

@@ -296,17 +308,67 @@ readme = "README.md"
296308
}
297309

298310
#[test]
299-
fn test_render_pkg_implicit_readme() {
311+
fn test_render_pkg_readme_false() {
300312
let mut pkg = tar::Builder::new(vec![]);
301313
add_file(
302314
&mut pkg,
303315
"foo-0.0.1/Cargo.toml",
304316
br#"
305317
[package]
318+
readme = false
306319
"#,
307320
);
308321
add_file(&mut pkg, "foo-0.0.1/README.md", b"readme");
309322
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();
310372
let result =
311373
render_pkg_readme(tar::Archive::new(&*serialized_archive), "foo-0.0.1").unwrap();
312374
assert!(result.contains("readme"))

0 commit comments

Comments
 (0)