release to forgejo works in an early state
cargo devel CI / cargo CI (push) Failing after 1m41s Details

This commit is contained in:
Christoph J. Scherr 2024-04-25 15:44:55 +02:00
parent 0e4d694b35
commit 378b269fa0
8 changed files with 57 additions and 62 deletions

View File

@ -1,5 +1,5 @@
version: version:
!text "echo foo" !cargo
changelog: changelog:
enable: true enable: true
git-log: true git-log: true
@ -13,13 +13,13 @@ uses:
- cscherr - cscherr
api: api:
github: # github:
type: github # type: github
repository: autocrate # repository: autocrate
auth: # auth:
user: PlexSheep # user: PlexSheep
pass: # pass:
!env TOKEN_GH # !env TOKEN_GH
cscherr: cscherr:
type: forgejo type: forgejo
endpoint: https://git.cscherr.de endpoint: https://git.cscherr.de

View File

@ -1,6 +1,6 @@
[package] [package]
name = "autocrate" name = "autocrate"
version = "0.1.0-prealpha.3" version = "0.1.0-prealpha.4"
edition = "2021" edition = "2021"
publish = true publish = true
authors = ["Christoph J. Scherr <software@cscherr.de>"] authors = ["Christoph J. Scherr <software@cscherr.de>"]
@ -25,11 +25,13 @@ async-trait = "0.1.77"
# cargo = "0.76.0" # cargo = "0.76.0"
clap = { version = "4.4.18", features = ["derive", "help"] } clap = { version = "4.4.18", features = ["derive", "help"] }
clap-verbosity-flag = "2.1.2" clap-verbosity-flag = "2.1.2"
forgejo-api = "0.1.0"
futures = "0.3.30" futures = "0.3.30"
git2 = "0.18.1" git2 = "0.18.1"
libpt = { version = "0.3.11", features = ["log"] } libpt = { version = "0.3.11", features = ["log"] }
reqwest = "0.11.24" reqwest = "0.11.24"
serde = { version = "1.0.195", features = ["derive"] } serde = { version = "1.0.195", features = ["derive"] }
serde_json = "1.0.116"
serde_yaml = "0.9.30" serde_yaml = "0.9.30"
tempfile = "3.9.0" tempfile = "3.9.0"
thiserror = "1.0.56" thiserror = "1.0.56"

View File

@ -17,6 +17,7 @@ impl Changelog {
Ok(Changelog { git_log }) Ok(Changelog { git_log })
} }
// TODO: use libgit2 instead of the cli interface
fn make_git_log(cfg: &Config) -> Result<Option<String>> { fn make_git_log(cfg: &Config) -> Result<Option<String>> {
if !cfg.yaml.changelog.enable { if !cfg.yaml.changelog.enable {
return Ok(None); return Ok(None);

View File

@ -194,7 +194,22 @@ impl Version {
} }
} }
} }
Self::Cargo => todo!(), Self::Cargo => {
match Command::new("/bin/bash")
.arg("-c")
.arg(r#"cat Cargo.toml | rg '^\s*version\s*=\s*"([^"]*)"\s*$' -or '$1'"#)
.output()
{
Ok(output) => {
// TODO: check status
String::from_utf8(output.stdout).unwrap().trim().to_owned()
}
Err(err) => {
panic!("{err:?}");
}
}
},
} }
} }
} }

View File

@ -32,6 +32,8 @@ pub enum ServerApiError {
InvalidHeaderValue(#[from] reqwest::header::InvalidHeaderValue), InvalidHeaderValue(#[from] reqwest::header::InvalidHeaderValue),
#[error(transparent)] #[error(transparent)]
ReqwestErr(#[from] reqwest::Error), ReqwestErr(#[from] reqwest::Error),
#[error(transparent)]
ForgejoApiError(#[from] forgejo_api::ForgejoError)
} }
#[derive(Error, Debug)] #[derive(Error, Debug)]

View File

@ -22,8 +22,8 @@ pub async fn tag(cfg: &Config) -> Result<git2::Tag> {
let tag = cfg let tag = cfg
.repo .repo
.tag( .tag(
// &cfg.yaml.version.get_version(), &cfg.yaml.version.get_version(),
"importantversion", // "importantversion",
&target, &target,
&tagger, &tagger,
&message, &message,

View File

@ -1,4 +1,5 @@
use crate::{ use crate::{
changelog,
config::Config, config::Config,
error::*, error::*,
git::{get_commit_sig, push, tag}, git::{get_commit_sig, push, tag},
@ -20,6 +21,7 @@ pub struct ReleaseContext {
pub async fn release(cfg: &Config, apis: &mut ApiCollection) -> Result<()> { pub async fn release(cfg: &Config, apis: &mut ApiCollection) -> Result<()> {
// TODO: Error handling // TODO: Error handling
let changelog = crate::changelog::Changelog::build(cfg)?.to_string();
let tag = tag(cfg).await?.name().unwrap().to_string(); let tag = tag(cfg).await?.name().unwrap().to_string();
let commit_sig = get_commit_sig(cfg).await?; let commit_sig = get_commit_sig(cfg).await?;
push(cfg).await?; // we assume that we only need to push the current branch to the singular push(cfg).await?; // we assume that we only need to push the current branch to the singular
@ -39,7 +41,7 @@ pub async fn release(cfg: &Config, apis: &mut ApiCollection) -> Result<()> {
.expect("no auth but trying to publish") .expect("no auth but trying to publish")
.user, .user,
repository: api.get_cfg().repository.clone(), repository: api.get_cfg().repository.clone(),
text: String::from("TODO: ADD TEXT VARIABLE SOMEHOW"), text: changelog.clone(),
tag: tag.clone(), tag: tag.clone(),
commit_sig: commit_sig.clone(), commit_sig: commit_sig.clone(),
}; };

View File

@ -6,35 +6,29 @@ use crate::{
serverapi::{PublishContext, ReleaseContext, ServerApi}, serverapi::{PublishContext, ReleaseContext, ServerApi},
}; };
use async_trait::async_trait; use async_trait::async_trait;
use forgejo_api;
use libpt::log::debug;
use reqwest::{ use reqwest::{
header::{HeaderMap, HeaderValue}, header::{HeaderMap, HeaderValue},
Client, Url, Client, Url,
}; };
use serde_json;
pub struct Forgejo { pub struct Forgejo {
cfg: Api, cfg: Api,
client: Client, api_wrapper: forgejo_api::Forgejo,
} }
impl Forgejo { impl Forgejo {
pub async fn build(api: &Api) -> Result<Self> { pub async fn build(api: &Api) -> Result<Self> {
let mut headers: HeaderMap = HeaderMap::new(); let api_wrapper: forgejo_api::Forgejo = forgejo_api::Forgejo::new(
// may be left empty if we only do reads from publically accessible urls forgejo_api::Auth::Token(&api.auth.clone().unwrap().pass.get_pass()?),
if api.auth.is_some() { api.endpoint.clone().unwrap(),
let _ = headers.insert( )
"Authorization", .map_err(ServerApiError::from)?;
// HeaderValue::from_str(api.auth.clone().unwrap().pass.get_pass()?.as_str())
// .map_err(ServerApiError::from)?,
HeaderValue::from_str("hardcoded").map_err(ServerApiError::from)?,
);
}
let client = super::client_builder()
.default_headers(headers)
.build()
.map_err(ServerApiError::from)?;
Ok(Self { Ok(Self {
cfg: api.clone(), cfg: api.clone(),
client, api_wrapper,
}) })
} }
} }
@ -45,38 +39,17 @@ impl ServerApi for Forgejo {
Ok(()) Ok(())
} }
async fn push_release(&mut self, rc: ReleaseContext) -> Result<()> { async fn push_release(&mut self, rc: ReleaseContext) -> Result<()> {
let url: Url = match &self.cfg.endpoint { let body: forgejo_api::structs::CreateReleaseOption =
Some(url) => url.clone(), forgejo_api::structs::CreateReleaseOption {
None => self body: Some(rc.text),
.cfg draft: Some(rc.draft),
.server_type name: Some(rc.tag.clone()),
.default_endpoint() prerelease: Some(rc.prerelease),
.expect("no default endpoint for this api type"), tag_name: rc.tag,
}; target_commitish: Some(rc.commit_sig),
url.join("/api/v1/repos/{}/{}/releases"); };
let body = format!( self.api_wrapper
r#" .repo_create_release(&rc.username, &rc.repository, body)
{{
"body": "{}",
"draft": {},
"name": "{}",
"prerelease": {},
"tag_name": "{}",
"target_commitish": "{}"
}}
"#,
rc.text, rc.draft, rc.tag, rc.prerelease, rc.tag, rc.commit_sig
);
let request = self
.client
.post(url)
.body(body)
.build()
.map_err(ServerApiError::from)?;
let _response = self
.client
.execute(request)
.await .await
.map_err(ServerApiError::from)?; .map_err(ServerApiError::from)?;
Ok(()) Ok(())