Skip to content

Commit e29a19e

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 40a418a commit e29a19e

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
@@ -219,28 +219,40 @@ fn render_pkg_readme<R: Read>(mut pkg: Archive<R>, pkg_name: &str) -> Option<Str
219219
.unwrap_or_else(|| panic!("[{}] couldn't open file: Cargo.toml", pkg_name));
220220
println!("{}", contents);
221221
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))
223223
};
224224

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

241253
#[derive(Debug, Deserialize)]
242254
struct Package {
243-
readme: Option<String>,
255+
readme: Option<toml::Value>,
244256
repository: Option<String>,
245257
}
246258

@@ -297,17 +309,67 @@ readme = "README.md"
297309
}
298310

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

0 commit comments

Comments
 (0)