From 4b72c662a010fea03e08b16d18a118ea27612bbc Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Wed, 3 Jun 2026 17:12:54 -0700 Subject: [PATCH 1/6] Skip reupload when server already has package --- src/reqwest_result_ext.rs | 11 +++++++++++ src/subcommand/upload.rs | 10 ++++++++-- tests/upload.rs | 19 +++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/reqwest_result_ext.rs b/src/reqwest_result_ext.rs index 2588859b..ee16490b 100644 --- a/src/reqwest_result_ext.rs +++ b/src/reqwest_result_ext.rs @@ -2,6 +2,7 @@ use super::*; pub(crate) trait ReqwestResultExt { fn check_status(self) -> Result; + fn found(self) -> Result>; } impl ReqwestResultExt for reqwest::Result { @@ -21,4 +22,14 @@ impl ReqwestResultExt for reqwest::Result { Ok(response) } + + fn found(self) -> Result> { + let response = self.context(error::Request)?; + + if response.status() == StatusCode::NOT_FOUND { + Ok(None) + } else { + Ok(Some(Ok(response).check_status()?)) + } + } } diff --git a/src/subcommand/upload.rs b/src/subcommand/upload.rs index 96418a2f..ffcfbbc7 100644 --- a/src/subcommand/upload.rs +++ b/src/subcommand/upload.rs @@ -166,14 +166,20 @@ impl Upload { let fingerprint = archive.fingerprint().context(error_context)?; + let client = client()?; + + let url = self.server.join(&format!("package/{fingerprint}")).unwrap(); + + if client.head(url).send().found()?.is_some() { + return Ok(()); + } + let manifest = archive.unpack().context(error_context)?; let files = manifest.files().len().into_u64(); let bytes = manifest.total_size_u64(); - let client = client()?; - let progress_bar = progress_bar::with_files(&options, bytes, files); let mut context = Context { diff --git a/tests/upload.rs b/tests/upload.rs index f1708082..b32a483e 100644 --- a/tests/upload.rs +++ b/tests/upload.rs @@ -43,6 +43,25 @@ fn restricted_upload_succeeds_with_auth() { server.terminate().success(); } +#[test] +fn reupload_package_skips_when_server_has_package() { + let server = Test::new().serve().spawn(); + + let test = Test::new() + .write("foo", "aaa") + .args(["create", "."]) + .success() + .args(["upload", "--server", &server.address(), "manifest.filepack"]) + .success() + .write("foo", "bar"); + + test + .args(["upload", "--server", &server.address(), "manifest.filepack"]) + .success(); + + server.terminate().success(); +} + #[test] fn reupload_package_succeeds() { let server = Test::new() From 1db35fee37b17a16bbe4efec48686973b7200733 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Wed, 3 Jun 2026 17:14:48 -0700 Subject: [PATCH 2/6] Enhance --- src/reqwest_result_ext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reqwest_result_ext.rs b/src/reqwest_result_ext.rs index ee16490b..55bb0ccf 100644 --- a/src/reqwest_result_ext.rs +++ b/src/reqwest_result_ext.rs @@ -29,7 +29,7 @@ impl ReqwestResultExt for reqwest::Result { if response.status() == StatusCode::NOT_FOUND { Ok(None) } else { - Ok(Some(Ok(response).check_status()?)) + Ok(response).check_status().map(Some) } } } From 3f1741c4c2711b3c7dccf8104186a69577cd5d95 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Wed, 3 Jun 2026 17:22:13 -0700 Subject: [PATCH 3/6] Adjust --- src/subcommand/upload.rs | 4 ++++ tests/upload.rs | 17 +++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/subcommand/upload.rs b/src/subcommand/upload.rs index ffcfbbc7..651fed33 100644 --- a/src/subcommand/upload.rs +++ b/src/subcommand/upload.rs @@ -171,6 +171,10 @@ impl Upload { let url = self.server.join(&format!("package/{fingerprint}")).unwrap(); if client.head(url).send().found()?.is_some() { + if !options.quiet { + eprintln!("package already uploaded"); + } + return Ok(()); } diff --git a/tests/upload.rs b/tests/upload.rs index b32a483e..7cd324e0 100644 --- a/tests/upload.rs +++ b/tests/upload.rs @@ -52,11 +52,11 @@ fn reupload_package_skips_when_server_has_package() { .args(["create", "."]) .success() .args(["upload", "--server", &server.address(), "manifest.filepack"]) - .success() - .write("foo", "bar"); + .success(); test .args(["upload", "--server", &server.address(), "manifest.filepack"]) + .stderr("package already uploaded\n") .success(); server.terminate().success(); @@ -72,20 +72,21 @@ fn reupload_package_succeeds() { .assert_file(&format!("files/{}", Hash::bytes(b"ddd")), "ddd") .spawn(); - let mut test = Test::new() + let test = Test::new() .write("foo", "aaa") .write("bar", "bbb") .create_dir("empty") .write("sub/baz", "ccc") .write("sub/qux", "ddd") .args(["create", "."]) + .success() + .args(["upload", "--server", &server.address(), "manifest.filepack"]) .success(); - for _ in 0..2 { - test = test - .args(["upload", "--server", &server.address(), "manifest.filepack"]) - .success(); - } + test + .args(["upload", "--server", &server.address(), "manifest.filepack"]) + .stderr("package already uploaded\n") + .success(); server.terminate().success(); } From 94dcd384f71811d20c4740feb8b43c1bf38b2313 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Wed, 3 Jun 2026 17:23:51 -0700 Subject: [PATCH 4/6] Reform --- tests/upload.rs | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/tests/upload.rs b/tests/upload.rs index 7cd324e0..dbeeacd9 100644 --- a/tests/upload.rs +++ b/tests/upload.rs @@ -43,25 +43,6 @@ fn restricted_upload_succeeds_with_auth() { server.terminate().success(); } -#[test] -fn reupload_package_skips_when_server_has_package() { - let server = Test::new().serve().spawn(); - - let test = Test::new() - .write("foo", "aaa") - .args(["create", "."]) - .success() - .args(["upload", "--server", &server.address(), "manifest.filepack"]) - .success(); - - test - .args(["upload", "--server", &server.address(), "manifest.filepack"]) - .stderr("package already uploaded\n") - .success(); - - server.terminate().success(); -} - #[test] fn reupload_package_succeeds() { let server = Test::new() From 991ffc8db78ce8e8b7278422085e8f92a7cc56fe Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Wed, 3 Jun 2026 17:28:57 -0700 Subject: [PATCH 5/6] Reform --- src/subcommand/upload.rs | 2 +- tests/upload.rs | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/subcommand/upload.rs b/src/subcommand/upload.rs index 651fed33..d629b9e3 100644 --- a/src/subcommand/upload.rs +++ b/src/subcommand/upload.rs @@ -172,7 +172,7 @@ impl Upload { if client.head(url).send().found()?.is_some() { if !options.quiet { - eprintln!("package already uploaded"); + eprintln!("server already has package"); } return Ok(()); diff --git a/tests/upload.rs b/tests/upload.rs index dbeeacd9..ff863bc3 100644 --- a/tests/upload.rs +++ b/tests/upload.rs @@ -53,7 +53,7 @@ fn reupload_package_succeeds() { .assert_file(&format!("files/{}", Hash::bytes(b"ddd")), "ddd") .spawn(); - let test = Test::new() + Test::new() .write("foo", "aaa") .write("bar", "bbb") .create_dir("empty") @@ -63,10 +63,8 @@ fn reupload_package_succeeds() { .success() .args(["upload", "--server", &server.address(), "manifest.filepack"]) .success(); - - test .args(["upload", "--server", &server.address(), "manifest.filepack"]) - .stderr("package already uploaded\n") + .stderr("server already has package\n") .success(); server.terminate().success(); From bd43ec849adb4e9e81c1bdae58a7932c0a25cf32 Mon Sep 17 00:00:00 2001 From: Casey Rodarmor Date: Wed, 3 Jun 2026 17:29:03 -0700 Subject: [PATCH 6/6] Adjust --- tests/upload.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/upload.rs b/tests/upload.rs index ff863bc3..9eccbd60 100644 --- a/tests/upload.rs +++ b/tests/upload.rs @@ -62,7 +62,7 @@ fn reupload_package_succeeds() { .args(["create", "."]) .success() .args(["upload", "--server", &server.address(), "manifest.filepack"]) - .success(); + .success() .args(["upload", "--server", &server.address(), "manifest.filepack"]) .stderr("server already has package\n") .success();