Skip to content

Commit edcc9cf

Browse files
authored
Skip upload for empty README files (#6794)
1 parent 4275129 commit edcc9cf

File tree

6 files changed

+131
-25
lines changed

6 files changed

+131
-25
lines changed

src/admin/render_readmes.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,16 @@ pub fn run(opts: Opts) -> anyhow::Result<()> {
114114
let handle = thread::spawn::<_, anyhow::Result<()>>(move || {
115115
println!("[{}-{}] Rendering README...", krate_name, version.num);
116116
let readme = get_readme(base_config.uploader(), &client, &version, &krate_name)?;
117-
118-
let rt = tokio::runtime::Builder::new_current_thread()
119-
.enable_all()
120-
.build()
121-
.context("Failed to initialize tokio runtime")
122-
.unwrap();
123-
124-
rt.block_on(storage.upload_readme(&krate_name, &version.num, readme.into()))
125-
.context("Failed to upload rendered README file to S3")?;
117+
if !readme.is_empty() {
118+
let rt = tokio::runtime::Builder::new_current_thread()
119+
.enable_all()
120+
.build()
121+
.context("Failed to initialize tokio runtime")
122+
.unwrap();
123+
124+
rt.block_on(storage.upload_readme(&krate_name, &version.num, readme.into()))
125+
.context("Failed to upload rendered README file to S3")?;
126+
}
126127

127128
Ok(())
128129
});

src/controllers/krate/publish.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -236,16 +236,18 @@ pub async fn publish(app: AppState, req: BytesRequest) -> AppResult<Json<GoodCra
236236
let pkg_path_in_vcs = tarball_info.vcs_info.map(|info| info.path_in_vcs);
237237

238238
if let Some(readme) = new_crate.readme {
239-
Job::render_and_upload_readme(
240-
version.id,
241-
readme,
242-
new_crate
243-
.readme_file
244-
.unwrap_or_else(|| String::from("README.md")),
245-
repo,
246-
pkg_path_in_vcs,
247-
)
248-
.enqueue_with_priority(conn, PRIORITY_RENDER_README)?;
239+
if !readme.is_empty() {
240+
Job::render_and_upload_readme(
241+
version.id,
242+
readme,
243+
new_crate
244+
.readme_file
245+
.unwrap_or_else(|| String::from("README.md")),
246+
repo,
247+
pkg_path_in_vcs,
248+
)
249+
.enqueue_with_priority(conn, PRIORITY_RENDER_README)?;
250+
}
249251
}
250252

251253
// Upload crate tarball

src/storage.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -341,14 +341,15 @@ mod tests {
341341
async fn upload_readme() {
342342
let s = Storage::from_config(&StorageConfig::InMemory);
343343

344-
s.upload_readme("foo", "1.2.3", Bytes::new()).await.unwrap();
344+
let bytes = Bytes::from_static(b"hello world");
345+
s.upload_readme("foo", "1.2.3", bytes.clone())
346+
.await
347+
.unwrap();
345348

346349
let expected_files = vec!["readmes/foo/foo-1.2.3.html"];
347350
assert_eq!(stored_files(&s.store).await, expected_files);
348351

349-
s.upload_readme("foo", "2.0.0+foo", Bytes::new())
350-
.await
351-
.unwrap();
352+
s.upload_readme("foo", "2.0.0+foo", bytes).await.unwrap();
352353

353354
let expected_files = vec![
354355
"readmes/foo/foo-1.2.3.html",
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
[
2+
{
3+
"request": {
4+
"uri": "http://127.0.0.1:19000/crates-index-test/fo/o_/foo_readme",
5+
"method": "PUT",
6+
"headers": [
7+
[
8+
"accept",
9+
"*/*"
10+
],
11+
[
12+
"accept-encoding",
13+
"gzip"
14+
],
15+
[
16+
"content-length",
17+
"151"
18+
],
19+
[
20+
"content-type",
21+
"text/plain"
22+
]
23+
],
24+
"body": "{\"name\":\"foo_readme\",\"vers\":\"1.0.0\",\"deps\":[],\"cksum\":\"acb5604b126ac894c1eb11c4575bf2072fea61232a888e453770c79d7ed56419\",\"features\":{},\"yanked\":false}\n"
25+
},
26+
"response": {
27+
"status": 200,
28+
"headers": [
29+
[
30+
"accept-ranges",
31+
"bytes"
32+
],
33+
[
34+
"content-length",
35+
"0"
36+
],
37+
[
38+
"content-security-policy",
39+
"block-all-mixed-content"
40+
],
41+
[
42+
"date",
43+
"Tue, 13 Jun 2023 23:04:33 GMT"
44+
],
45+
[
46+
"etag",
47+
"\"cf380f14a440ced148f97ac8a6d0bc0d\""
48+
],
49+
[
50+
"server",
51+
"MinIO"
52+
],
53+
[
54+
"strict-transport-security",
55+
"max-age=31536000; includeSubDomains"
56+
],
57+
[
58+
"vary",
59+
"Accept-Encoding"
60+
],
61+
[
62+
"vary",
63+
"Origin"
64+
],
65+
[
66+
"x-amz-id-2",
67+
"dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8"
68+
],
69+
[
70+
"x-amz-request-id",
71+
"17685A6A60B5472D"
72+
],
73+
[
74+
"x-content-type-options",
75+
"nosniff"
76+
],
77+
[
78+
"x-xss-protection",
79+
"1; mode=block"
80+
]
81+
],
82+
"body": ""
83+
}
84+
}
85+
]

src/tests/krate/publish.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ fn new_krate_dependency_missing() {
634634
fn new_krate_with_readme() {
635635
let (app, _, _, token) = TestApp::full().with_token();
636636

637-
let crate_to_publish = PublishBuilder::new("foo_readme").readme("");
637+
let crate_to_publish = PublishBuilder::new("foo_readme").readme("hello world");
638638
let json = token.publish_crate(crate_to_publish).good();
639639

640640
assert_eq!(json.krate.name, "foo_readme");
@@ -650,13 +650,27 @@ fn new_krate_with_readme() {
650650
);
651651
}
652652

653+
#[test]
654+
fn new_krate_with_empty_readme() {
655+
let (app, _, _, token) = TestApp::full().with_token();
656+
657+
let crate_to_publish = PublishBuilder::new("foo_readme").readme("");
658+
let json = token.publish_crate(crate_to_publish).good();
659+
660+
assert_eq!(json.krate.name, "foo_readme");
661+
assert_eq!(json.krate.max_version, "1.0.0");
662+
663+
let files = app.stored_files();
664+
assert_eq!(files, vec!["crates/foo_readme/foo_readme-1.0.0.crate"]);
665+
}
666+
653667
#[test]
654668
fn new_krate_with_readme_and_plus_version() {
655669
let (app, _, _, token) = TestApp::full().with_token();
656670

657671
let crate_to_publish = PublishBuilder::new("foo_readme")
658672
.version("1.0.0+foo")
659-
.readme("");
673+
.readme("hello world");
660674
let json = token.publish_crate(crate_to_publish).good();
661675

662676
assert_eq!(json.krate.name, "foo_readme");

src/worker/readmes.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ pub fn perform_render_and_upload_readme(
2424
info!(?version_id, "Rendering README");
2525

2626
let rendered = text_to_html(text, readme_path, base_url, pkg_path_in_vcs);
27+
if rendered.is_empty() {
28+
return Ok(());
29+
}
2730

2831
conn.transaction(|conn| {
2932
Version::record_readme_rendering(version_id, conn)?;

0 commit comments

Comments
 (0)