Skip to content

Commit 84495e3

Browse files
committed
Auto merge of #3970 - nipunn1313:rerender_readme3, r=Turbo87
Support admin render_readme with Cargo.toml without optional readme field Depends on #3969 (Because of community/community#4477 (comment) - github ends up rendering both diffs together. Go to the commits tab and just look at the most recent commit to review). https://doc.rust-lang.org/cargo/reference/manifest.html#the-readme-field
2 parents 20d51c0 + 824055f commit 84495e3

File tree

1 file changed

+43
-8
lines changed

1 file changed

+43
-8
lines changed

src/admin/render_readmes.rs

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -203,18 +203,23 @@ fn render_pkg_readme<R: Read>(mut archive: Archive<R>, pkg_name: &str) -> Option
203203

204204
let manifest: Manifest = {
205205
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));
207208
toml::from_str(&contents)
208209
.unwrap_or_else(|_| panic!("[{}] Syntax error in manifest file", pkg_name))
209210
};
210211

211212
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());
213218
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)?;
215220
text_to_html(
216221
&contents,
217-
readme_path,
222+
&readme_path,
218223
manifest.package.repository.as_deref(),
219224
)
220225
};
@@ -237,7 +242,7 @@ fn find_file_by_path<R: Read>(
237242
entries: &mut tar::Entries<'_, R>,
238243
path: &Path,
239244
pkg_name: &str,
240-
) -> String {
245+
) -> Option<String> {
241246
let mut file = entries
242247
.find(|entry| match *entry {
243248
Err(_) => false,
@@ -248,14 +253,13 @@ fn find_file_by_path<R: Read>(
248253
};
249254
filepath == path
250255
}
251-
})
252-
.unwrap_or_else(|| panic!("[{}] couldn't open file: {}", pkg_name, path.display()))
256+
})?
253257
.unwrap_or_else(|_| panic!("[{}] file is not present: {}", pkg_name, path.display()));
254258

255259
let mut contents = String::new();
256260
file.read_to_string(&mut contents)
257261
.unwrap_or_else(|_| panic!("[{}] Couldn't read file contents", pkg_name));
258-
contents
262+
Some(contents)
259263
}
260264

261265
#[cfg(test)]
@@ -290,6 +294,37 @@ readme = "README.md"
290294
assert!(result.contains("readme"))
291295
}
292296

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+
293328
#[test]
294329
fn test_render_pkg_readme_w_link() {
295330
let mut pkg = tar::Builder::new(vec![]);

0 commit comments

Comments
 (0)