From 2e50a93f1e395b2b7d4171be48426efe16214ba8 Mon Sep 17 00:00:00 2001 From: Cyborus Date: Fri, 15 Dec 2023 11:44:21 -0500 Subject: [PATCH 1/3] add release download methods --- Cargo.lock | 1 + Cargo.toml | 1 + src/lib.rs | 18 ++++++++++++++++++ src/repository.rs | 28 ++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 61464a5..ba933cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -169,6 +169,7 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" name = "forgejo-api" version = "0.1.0" dependencies = [ + "bytes", "eyre", "reqwest", "serde", diff --git a/Cargo.toml b/Cargo.toml index eb21559..83ad83c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ url = { version = "2.4.0", features = ["serde"] } serde = { version = "1.0.168", features = ["derive"] } time = { version = "0.3.22", features = ["parsing", "serde", "formatting"] } serde_json = "1.0.108" +bytes = "1.5.0" [dev-dependencies] eyre = "0.6.9" diff --git a/src/lib.rs b/src/lib.rs index 21b0a45..4743e91 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -180,6 +180,24 @@ impl Forgejo { status => Err(ForgejoError::UnexpectedStatusCode(status)), } } + + /// Like `execute`, but returns a `String`. + async fn execute_opt_raw(&self, request: Request) -> Result, ForgejoError> { + let response = self.client.execute(request).await?; + match response.status() { + status if status.is_success() => Ok(Some(response.bytes().await?)), + StatusCode::NOT_FOUND => Ok(None), + status if status.is_client_error() => Err(ForgejoError::ApiError( + status, + response + .json::() + .await? + .message + .unwrap_or_else(|| String::from("[no message]")), + )), + status => Err(ForgejoError::UnexpectedStatusCode(status)), + } + } /// Like `execute`, but returns a `String`. async fn execute_str(&self, request: Request) -> Result { diff --git a/src/repository.rs b/src/repository.rs index 966b5e3..992f78a 100644 --- a/src/repository.rs +++ b/src/repository.rs @@ -207,6 +207,34 @@ impl Forgejo { .await } + pub async fn download_release_zip(&self, owner: &str, repo: &str, release: u64) -> Result, ForgejoError> { + let release = self.get_release(owner, repo, release).await; + let release = match release { + Ok(Some(release)) => release, + Ok(None) => return Ok(None), + Err(e) => return Err(e), + }; + let request = self.client.get(release.zipball_url).build()?; + self.execute_opt_raw(request).await + } + + pub async fn download_release_tarball(&self, owner: &str, repo: &str, release: u64) -> Result, ForgejoError> { + let release = self.get_release(owner, repo, release).await; + let release = match release { + Ok(Some(release)) => release, + Ok(None) => return Ok(None), + Err(e) => return Err(e), + }; + let request = self.client.get(release.tarball_url).build()?; + self.execute_opt_raw(request).await + } + + pub async fn download_release_attachment(&self, owner: &str, repo: &str, release: u64, attach: u64) -> Result, ForgejoError> { + let release = self.get_release_attachment(owner, repo, release, attach).await?; + let request = self.client.get(release.browser_download_url).build()?; + self.execute_opt_raw(request).await + } + pub async fn get_tags( &self, owner: &str, From e725903eb973b5eb125f0fb7ce0cfa4c48080a4a Mon Sep 17 00:00:00 2001 From: Cyborus Date: Fri, 15 Dec 2023 12:00:29 -0500 Subject: [PATCH 2/3] add download test --- tests/ci_test.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/ci_test.rs b/tests/ci_test.rs index 39acbd4..5812074 100644 --- a/tests/ci_test.rs +++ b/tests/ci_test.rs @@ -220,6 +220,14 @@ async fn repo(api: &forgejo_api::Forgejo) -> eyre::Result<()> { ) .await .wrap_err("failed to create release attachment")?; + ensure!( + api.download_release_attachment("TestingAdmin", "test", release.id, attachment.id) + .await? + .as_deref() + == Some(b"This is a file!"), + "couldn't download attachment" + ); + api.delete_release_attachment("TestingAdmin", "test", release.id, attachment.id) .await .wrap_err("failed to deleted attachment")?; From 96124821ba0f9b9cb5d1bf97be5faed1165a51b1 Mon Sep 17 00:00:00 2001 From: Cyborus Date: Fri, 15 Dec 2023 12:02:39 -0500 Subject: [PATCH 3/3] format --- src/lib.rs | 7 +++++-- src/repository.rs | 26 ++++++++++++++++++++++---- tests/ci_test.rs | 4 ++-- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4743e91..e548128 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -180,9 +180,12 @@ impl Forgejo { status => Err(ForgejoError::UnexpectedStatusCode(status)), } } - + /// Like `execute`, but returns a `String`. - async fn execute_opt_raw(&self, request: Request) -> Result, ForgejoError> { + async fn execute_opt_raw( + &self, + request: Request, + ) -> Result, ForgejoError> { let response = self.client.execute(request).await?; match response.status() { status if status.is_success() => Ok(Some(response.bytes().await?)), diff --git a/src/repository.rs b/src/repository.rs index 992f78a..d9a92b1 100644 --- a/src/repository.rs +++ b/src/repository.rs @@ -207,7 +207,12 @@ impl Forgejo { .await } - pub async fn download_release_zip(&self, owner: &str, repo: &str, release: u64) -> Result, ForgejoError> { + pub async fn download_release_zip( + &self, + owner: &str, + repo: &str, + release: u64, + ) -> Result, ForgejoError> { let release = self.get_release(owner, repo, release).await; let release = match release { Ok(Some(release)) => release, @@ -218,7 +223,12 @@ impl Forgejo { self.execute_opt_raw(request).await } - pub async fn download_release_tarball(&self, owner: &str, repo: &str, release: u64) -> Result, ForgejoError> { + pub async fn download_release_tarball( + &self, + owner: &str, + repo: &str, + release: u64, + ) -> Result, ForgejoError> { let release = self.get_release(owner, repo, release).await; let release = match release { Ok(Some(release)) => release, @@ -229,8 +239,16 @@ impl Forgejo { self.execute_opt_raw(request).await } - pub async fn download_release_attachment(&self, owner: &str, repo: &str, release: u64, attach: u64) -> Result, ForgejoError> { - let release = self.get_release_attachment(owner, repo, release, attach).await?; + pub async fn download_release_attachment( + &self, + owner: &str, + repo: &str, + release: u64, + attach: u64, + ) -> Result, ForgejoError> { + let release = self + .get_release_attachment(owner, repo, release, attach) + .await?; let request = self.client.get(release.browser_download_url).build()?; self.execute_opt_raw(request).await } diff --git a/tests/ci_test.rs b/tests/ci_test.rs index 5812074..e5cb1c2 100644 --- a/tests/ci_test.rs +++ b/tests/ci_test.rs @@ -224,10 +224,10 @@ async fn repo(api: &forgejo_api::Forgejo) -> eyre::Result<()> { api.download_release_attachment("TestingAdmin", "test", release.id, attachment.id) .await? .as_deref() - == Some(b"This is a file!"), + == Some(b"This is a file!"), "couldn't download attachment" ); - + api.delete_release_attachment("TestingAdmin", "test", release.id, attachment.id) .await .wrap_err("failed to deleted attachment")?;