diff --git a/src/reqwest_result_ext.rs b/src/reqwest_result_ext.rs index 2588859b..55bb0ccf 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(response).check_status().map(Some) + } + } } diff --git a/src/subcommand/upload.rs b/src/subcommand/upload.rs index 96418a2f..d629b9e3 100644 --- a/src/subcommand/upload.rs +++ b/src/subcommand/upload.rs @@ -166,14 +166,24 @@ 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() { + if !options.quiet { + eprintln!("server already has package"); + } + + 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..9eccbd60 100644 --- a/tests/upload.rs +++ b/tests/upload.rs @@ -53,21 +53,20 @@ fn reupload_package_succeeds() { .assert_file(&format!("files/{}", Hash::bytes(b"ddd")), "ddd") .spawn(); - let mut test = Test::new() + 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() + .args(["upload", "--server", &server.address(), "manifest.filepack"]) + .stderr("server already has package\n") .success(); - for _ in 0..2 { - test = test - .args(["upload", "--server", &server.address(), "manifest.filepack"]) - .success(); - } - server.terminate().success(); }