Skip to content

Commit e59bfd1

Browse files
authored
Merge pull request #6848 from Turbo87/fix-readme-parsing
Fix `readme` field parsing of `Cargo.toml` files
2 parents 715505b + 186ad7e commit e59bfd1

File tree

6 files changed

+83
-8
lines changed

6 files changed

+83
-8
lines changed

Cargo.lock

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates_io_tarball/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ edition = "2021"
88
builder = []
99

1010
[dependencies]
11+
cargo_toml = "=0.15.2"
1112
derive_deref = "=1.1.1"
1213
flate2 = "=1.0.26"
1314
semver = { version = "=1.0.18", features = ["serde"] }

crates_io_tarball/src/lib.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ pub fn process_tarball<R: Read>(
103103
mod tests {
104104
use super::process_tarball;
105105
use crate::TarballBuilder;
106+
use cargo_toml::OptionalFile;
106107
use std::path::Path;
107108

108109
#[test]
@@ -170,7 +171,7 @@ repository = "https://github.com/foo/bar"
170171
let limit = 512 * 1024 * 1024;
171172
let tarball_info = assert_ok!(process_tarball("foo-0.0.1", &*tarball, limit));
172173
let manifest = assert_some!(tarball_info.manifest);
173-
assert_some_eq!(manifest.package.readme, Path::new("README.md"));
174+
assert_some_eq!(manifest.package.readme.as_path(), Path::new("README.md"));
174175
assert_some_eq!(manifest.package.repository, "https://github.com/foo/bar");
175176
assert_some_eq!(manifest.package.rust_version, "1.59");
176177
}
@@ -191,4 +192,37 @@ repository = "https://github.com/foo/bar"
191192
let manifest = assert_some!(tarball_info.manifest);
192193
assert_some_eq!(manifest.package.rust_version, "1.23");
193194
}
195+
196+
#[test]
197+
fn process_tarball_test_manifest_with_default_readme() {
198+
let tarball = TarballBuilder::new("foo", "0.0.1")
199+
.add_raw_manifest(
200+
br#"
201+
[package]
202+
"#,
203+
)
204+
.build();
205+
206+
let limit = 512 * 1024 * 1024;
207+
let tarball_info = assert_ok!(process_tarball("foo-0.0.1", &*tarball, limit));
208+
let manifest = assert_some!(tarball_info.manifest);
209+
assert_matches!(manifest.package.readme, OptionalFile::Flag(true));
210+
}
211+
212+
#[test]
213+
fn process_tarball_test_manifest_with_boolean_readme() {
214+
let tarball = TarballBuilder::new("foo", "0.0.1")
215+
.add_raw_manifest(
216+
br#"
217+
[package]
218+
readme = false
219+
"#,
220+
)
221+
.build();
222+
223+
let limit = 512 * 1024 * 1024;
224+
let tarball_info = assert_ok!(process_tarball("foo-0.0.1", &*tarball, limit));
225+
let manifest = assert_some!(tarball_info.manifest);
226+
assert_matches!(manifest.package.readme, OptionalFile::Flag(false));
227+
}
194228
}

crates_io_tarball/src/manifest.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
use cargo_toml::OptionalFile;
12
use derive_deref::Deref;
23
use serde::{de, Deserialize, Deserializer};
3-
use std::path::PathBuf;
44

55
#[derive(Debug, Deserialize)]
66
pub struct Manifest {
@@ -11,7 +11,8 @@ pub struct Manifest {
1111
#[derive(Debug, Deserialize)]
1212
#[serde(rename_all = "kebab-case")]
1313
pub struct Package {
14-
pub readme: Option<PathBuf>,
14+
#[serde(default)]
15+
pub readme: OptionalFile,
1516
pub repository: Option<String>,
1617
pub rust_version: Option<RustVersion>,
1718
}

src/admin/render_readmes.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,13 @@ fn render_pkg_readme<R: Read>(mut archive: Archive<R>, pkg_name: &str) -> anyhow
181181
};
182182

183183
let rendered = {
184-
let readme_path = manifest
185-
.package
186-
.readme
187-
.unwrap_or_else(|| Path::new("README.md").to_path_buf());
188-
let path = Path::new(pkg_name).join(&readme_path);
184+
let readme = manifest.package.readme;
185+
if !readme.is_some() {
186+
return Ok("".to_string());
187+
}
188+
189+
let readme_path = readme.as_path().unwrap_or_else(|| Path::new("README.md"));
190+
let path = Path::new(pkg_name).join(readme_path);
189191
let contents = find_file_by_path(&mut entries, Path::new(&path))
190192
.with_context(|| format!("Failed to read {} file", readme_path.display()))?;
191193

src/tests/krate/publish.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,3 +1185,29 @@ fn version_with_build_metadata_3() {
11851185
);
11861186
});
11871187
}
1188+
1189+
#[test]
1190+
fn boolean_readme() {
1191+
// see https://github.com/rust-lang/crates.io/issues/6847
1192+
1193+
let (_app, _anon, _cookie, token) = TestApp::full().with_token();
1194+
1195+
let tarball = TarballBuilder::new("foo", "1.0.0")
1196+
.add_raw_manifest(
1197+
br#"[package]
1198+
name = "foo"
1199+
version = "1.0.0"
1200+
rust-version = "1.69"
1201+
readme = false"#,
1202+
)
1203+
.build();
1204+
1205+
let response =
1206+
token.publish_crate(PublishBuilder::new("foo").version("1.0.0").tarball(tarball));
1207+
assert_eq!(response.status(), StatusCode::OK);
1208+
1209+
let response = token.get::<()>("/api/v1/crates/foo/1.0.0");
1210+
assert_eq!(response.status(), StatusCode::OK);
1211+
let json = response.into_json();
1212+
assert_some_eq!(json["version"]["rust_version"].as_str(), "1.69");
1213+
}

0 commit comments

Comments
 (0)