From 462a03291788136eea1d5145fb48c9ae5c973c45 Mon Sep 17 00:00:00 2001 From: softprops Date: Sun, 25 Aug 2019 12:37:01 -0400 Subject: [PATCH] upsert releases --- src/github.rs | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/github.rs b/src/github.rs index 4fd9d0d..5c27ce4 100644 --- a/src/github.rs +++ b/src/github.rs @@ -1,4 +1,4 @@ -use reqwest::{Body, Client}; +use reqwest::{Body, Client, StatusCode}; use serde::{Deserialize, Serialize}; use std::{error::Error, fs::File}; @@ -40,22 +40,41 @@ struct ReleaseResponse { impl Releaser for Client { // https://developer.github.com/v3/repos/releases/#create-a-release + // https://developer.github.com/v3/repos/releases/#edit-a-release fn release( &self, github_token: &str, github_repo: &str, release: Release, ) -> Result> { - let response: ReleaseResponse = self - .post(&format!( - "https://api.github.com/repos/{}/releases", - github_repo - )) + let endpoint = format!("https://api.github.com/repos/{}/releases", github_repo); + let mut existing = self + .get(&format!("{}/tags/{}", endpoint, release.tag_name)) .header("Authorization", format!("bearer {}", github_token)) - .json(&release) - .send()? - .json()?; - Ok(response.id) + .send()?; + match existing.status() { + StatusCode::NOT_FOUND => Ok(self + .post(&format!( + "https://api.github.com/repos/{}/releases", + github_repo + )) + .header("Authorization", format!("bearer {}", github_token)) + .json(&release) + .send()? + .json::()? + .id), + _ => Ok(self + .patch(&format!( + "https://api.github.com/repos/{}/releases/{}", + github_repo, + existing.json::()?.id + )) + .header("Authorization", format!("bearer {}", github_token)) + .json(&release) + .send()? + .json::()? + .id), + } } }