From 604ee570a1aa0475bc8279364cc6c8fb1b52473f Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Sun, 31 May 2020 12:53:34 -0400 Subject: [PATCH] implement release command --- TODO.org | 6 ++++-- src/changelog.rs | 8 ++++++++ src/cmd/edit.rs | 5 ++--- src/cmd/mod.rs | 1 + src/cmd/release.rs | 36 ++++++++++++++++++++++++++++++++++++ src/gitea.rs | 16 ++++++++-------- src/main.rs | 19 +++++++++++-------- 7 files changed, 70 insertions(+), 21 deletions(-) create mode 100644 src/cmd/release.rs diff --git a/TODO.org b/TODO.org index 1ab6959..9f0cecb 100644 --- a/TODO.org +++ b/TODO.org @@ -9,12 +9,14 @@ CLOSED: [2020-05-30 Sat 14:49] ** DONE info CLOSED: [2020-05-30 Sat 10:52] -** TODO release +** DONE release + CLOSED: [2020-05-31 Sun 12:50] ** DONE upload CLOSED: [2020-05-30 Sat 15:15] * Core Features ** DONE Gitea API client CLOSED: [2020-05-30 Sat 10:52] -** TODO CHANGELOG.md parsing +** DONE CHANGELOG.md parsing + CLOSED: [2020-05-31 Sun 12:50] ** TODO VERSION parsing diff --git a/src/changelog.rs b/src/changelog.rs index 2ff75c5..2488d9e 100644 --- a/src/changelog.rs +++ b/src/changelog.rs @@ -73,3 +73,11 @@ where Ok(()) } + +#[cfg(test)] +mod tests { + #[test] + fn read_changelog() { + assert!(super::read("CHANGELOG.md".into(), "0.1.0".into()).is_ok()); + } +} diff --git a/src/cmd/edit.rs b/src/cmd/edit.rs index 5c25847..42fb6ba 100644 --- a/src/cmd/edit.rs +++ b/src/cmd/edit.rs @@ -33,11 +33,10 @@ pub(crate) async fn run( let resp = cli .post( - format!( + &format!( "{}/api/v1/repos/{}/{}/releases/{}", common.server, common.owner, common.repo, release.id - ) - .as_str(), + ), ) .json(&cr) .send() diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index b9eb62a..d82459f 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -2,4 +2,5 @@ pub(crate) mod delete; pub(crate) mod download; pub(crate) mod edit; pub(crate) mod info; +pub(crate) mod release; pub(crate) mod upload; diff --git a/src/cmd/release.rs b/src/cmd/release.rs new file mode 100644 index 0000000..95b8d3f --- /dev/null +++ b/src/cmd/release.rs @@ -0,0 +1,36 @@ +use crate::{gitea::*, *}; +use anyhow::Result; +use std::path::PathBuf; + +pub(crate) async fn run( + common: Common, + fname: PathBuf, + tag: String, + rm: ReleaseMeta, +) -> Result<()> { + let desc = changelog::read(fname, tag.clone())?; + let cli = client(&common)?; + let cr = CreateRelease { + body: desc, + draft: rm.draft, + name: rm.name.or(Some(format!("Version {}", tag))).unwrap(), + prerelease: rm.pre_release, + tag_name: tag.clone(), + target_commitish: tag, + }; + + let resp = cli + .post(&format!( + "{}/api/v1/repos/{}/{}/releases", + common.server, common.owner, common.repo + )) + .json(&cr) + .send() + .await?; + + if !resp.status().is_success() { + return Err(anyhow!("{:?}", resp.status())); + } + + Ok(()) +} diff --git a/src/gitea.rs b/src/gitea.rs index 72c15e6..42ba116 100644 --- a/src/gitea.rs +++ b/src/gitea.rs @@ -65,7 +65,10 @@ pub(crate) async fn get_release_by_tag( tag: &String, ) -> Result { let releases: Vec = cli - .get(format!("{}/api/v1/repos/{}/{}/releases", server, owner, repo).as_str()) + .get(&format!( + "{}/api/v1/repos/{}/{}/releases", + server, owner, repo + )) .send() .await? .json() @@ -121,13 +124,10 @@ pub(crate) async fn get_attachments_for_release( id: &i64, ) -> Result> { let attachments: Vec = cli - .get( - format!( - "{}/api/v1/repos/{}/{}/releases/{}/assets", - server, owner, repo, id - ) - .as_str(), - ) + .get(&format!( + "{}/api/v1/repos/{}/{}/releases/{}/assets", + server, owner, repo, id + )) .send() .await? .json() diff --git a/src/main.rs b/src/main.rs index 7bd2bcc..cda4db9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -68,8 +68,7 @@ pub(crate) enum Cmd { Download { #[structopt(flatten)] common: Common, - /// Folder to download release artifacts to - #[structopt(short, long)] + /// File to download fname: Option, /// The version tag to operate on #[structopt(short, long)] @@ -85,7 +84,6 @@ pub(crate) enum Cmd { #[structopt(flatten)] release_meta: ReleaseMeta, /// The version tag to operate on - #[structopt(short, long)] tag: String, }, /// Gets release info @@ -105,6 +103,8 @@ pub(crate) enum Cmd { /// Changelog file to read from to create the release description #[structopt(short, long, default_value = "./CHANGELOG.md")] changelog: PathBuf, + /// The version tag to operate on + tag: String, #[structopt(flatten)] release_meta: ReleaseMeta, }, @@ -112,12 +112,11 @@ pub(crate) enum Cmd { Upload { #[structopt(flatten)] common: Common, - /// The location of the file on the disk - #[structopt(short, long)] - fname: PathBuf, /// The version tag to operate on #[structopt(short, long)] tag: String, + /// The location of the file on the disk + fname: PathBuf, }, } @@ -136,8 +135,12 @@ async fn main() -> Result<()> { tag, } => cmd::edit::run(common, description, release_meta, tag).await, Cmd::Info { common, json, tag } => cmd::info::run(common, json, tag).await, + Cmd::Release { + common, + changelog, + tag, + release_meta, + } => cmd::release::run(common, changelog, tag, release_meta).await, Cmd::Upload { common, fname, tag } => cmd::upload::run(common, fname, tag).await, - - _ => Err(anyhow!("not implemented yet")), } }