From 6d8afda5dda7d6a0255b38770df0481206640557 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Wed, 29 Mar 2023 23:49:57 +0200 Subject: [PATCH] fix(gitea): Fix version data Concourse only accepts strings for values in the version data. --- images/gitea/Cargo.lock | 151 ++++++++++++++++--------------------- images/gitea/Cargo.toml | 6 +- images/gitea/src/cmd/pr.rs | 72 ++++++++++++++---- images/gitea/src/main.rs | 13 ---- images/gitea/src/types.rs | 14 ++++ 5 files changed, 135 insertions(+), 121 deletions(-) diff --git a/images/gitea/Cargo.lock b/images/gitea/Cargo.lock index af9935b..52cf3f5 100644 --- a/images/gitea/Cargo.lock +++ b/images/gitea/Cargo.lock @@ -159,6 +159,29 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" +[[package]] +name = "cli-table" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adfbb116d9e2c4be7011360d0c0bee565712c11e969c9609b25b619366dc379d" +dependencies = [ + "cli-table-derive", + "csv", + "termcolor", + "unicode-width", +] + +[[package]] +name = "cli-table-derive" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af3bfb9da627b0a6c467624fb7963921433774ed435493b5c08a3053e829ad4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "color-eyre" version = "0.6.2" @@ -217,6 +240,27 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +[[package]] +name = "csv" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b015497079b9a9d69c02ad25de6c0a6edef051ea6360a327d0bd05802ef64ad" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + [[package]] name = "encoding_rs" version = "0.8.32" @@ -331,14 +375,12 @@ name = "gitea" version = "0.1.0" dependencies = [ "clap", + "cli-table", "color-eyre", "reqwest", "serde", "serde_json", "time", - "tracing", - "tracing-error", - "tracing-subscriber", "url", ] @@ -556,15 +598,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata", -] - [[package]] name = "memchr" version = "2.5.0" @@ -598,16 +631,6 @@ dependencies = [ "windows-sys 0.45.0", ] -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - [[package]] name = "num_cpus" version = "1.15.0" @@ -639,12 +662,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "owo-colors" version = "3.5.0" @@ -687,30 +704,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "regex" -version = "1.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" -dependencies = [ - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "reqwest" version = "0.11.16" @@ -927,12 +920,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "smallvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" - [[package]] name = "socket2" version = "0.4.9" @@ -977,6 +964,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + [[package]] name = "thread_local" version = "1.1.7" @@ -1084,21 +1080,9 @@ checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "pin-project-lite", - "tracing-attributes", "tracing-core", ] -[[package]] -name = "tracing-attributes" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "tracing-core" version = "0.1.30" @@ -1119,33 +1103,15 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - [[package]] name = "tracing-subscriber" version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", "sharded-slab", - "smallvec", "thread_local", - "tracing", "tracing-core", - "tracing-log", ] [[package]] @@ -1344,6 +1310,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/images/gitea/Cargo.toml b/images/gitea/Cargo.toml index f3dbee5..51e08d7 100644 --- a/images/gitea/Cargo.toml +++ b/images/gitea/Cargo.toml @@ -11,11 +11,9 @@ color-eyre = "0.6.2" reqwest = { version = "0.11.16", default-features = false, features = ["blocking", "json", "rustls-tls-native-roots"] } serde_json = "1.0.95" serde = { version = "1.0.159", features = ["derive"] } -time = { version = "0.3.20", features = ["formatting", "macros", "serde"] } -tracing = "0.1.37" -tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } +time = { version = "0.3.20", features = ["formatting", "parsing", "serde"] } url = { version = "2.3.1", features = ["serde"] } -tracing-error = "0.2.0" +cli-table = "0.4.7" [profile.release] strip = "debuginfo" diff --git a/images/gitea/src/cmd/pr.rs b/images/gitea/src/cmd/pr.rs index b730202..2e5577f 100644 --- a/images/gitea/src/cmd/pr.rs +++ b/images/gitea/src/cmd/pr.rs @@ -2,11 +2,14 @@ use std::fs; use std::io::{self, Read}; use std::path::Path; +use cli_table::format::Justify; +use cli_table::{print_stderr, Cell, Style, Table}; use color_eyre::eyre::{self, Context}; use color_eyre::Result; use reqwest::blocking::{Client, Response}; use reqwest::header::HeaderMap; use serde::{Deserialize, Serialize}; +use serde_json::json; use time::OffsetDateTime; use url::Url; @@ -25,11 +28,26 @@ struct Source { #[derive(Deserialize, Serialize, Debug)] struct Version { - prs: Vec, - #[serde(with = "time::serde::timestamp")] + prs: String, + #[serde(with = "time::serde::iso8601")] timestamp: OffsetDateTime, } +impl<'a, I: Iterator> From for Version { + fn from(prs: I) -> Self { + Self { + prs: prs.fold(String::new(), |mut s, pr| { + if !s.is_empty() { + s.push(','); + } + s.push_str(&pr.number.to_string()); + s + }), + timestamp: OffsetDateTime::now_utc(), + } + } +} + #[derive(Deserialize, Serialize, Debug)] struct Config { /// Resource configuration. @@ -43,7 +61,6 @@ struct Config { version: Option, } -#[tracing::instrument(skip_all)] fn make_client(src: &Source) -> Result { let mut headers = HeaderMap::new(); headers.insert( @@ -58,7 +75,6 @@ fn make_client(src: &Source) -> Result { .map_err(From::from) } -#[tracing::instrument(skip_all)] fn fetch(src: &Source) -> Result { let client = make_client(&src).wrap_err("Failed to create HTTP client")?; let url = src @@ -73,14 +89,9 @@ fn fetch(src: &Source) -> Result { .map_err(From::from) } -#[tracing::instrument(skip_all)] fn action_check(conf: Config) -> Result<()> { let prs: Vec = fetch(&conf.source)?.json()?; - let mut version = Version { - prs: prs.iter().map(|pr| pr.number.to_string()).collect(), - timestamp: OffsetDateTime::now_utc(), - }; - version.prs.sort_unstable(); + let version = Version::from(prs.iter()); let out = if let Some(prev) = conf.version { if prev.prs == version.prs { @@ -92,15 +103,40 @@ fn action_check(conf: Config) -> Result<()> { vec![version] }; + let table: Vec<_> = prs + .iter() + .map(|pr| { + vec![ + pr.number.cell().justify(Justify::Center), + pr.title.clone().cell(), + pr.user.login.clone().cell(), + pr.base.r#ref.clone().cell(), + pr.head.r#ref.clone().cell(), + ] + }) + .collect(); + + let table = table + .table() + .title(vec![ + "#".cell().bold(true), + "Title".cell().bold(true), + "User".cell().bold(true), + "Base".cell().bold(true), + "Head".cell().bold(true), + ]) + .bold(true); + + let _ = print_stderr(table); + serde_json::to_writer_pretty(io::stdout(), &out) .wrap_err("Failed to write result to stdout")?; Ok(()) } -#[tracing::instrument(skip_all)] fn action_in(conf: Config, dest: impl AsRef) -> Result<()> { - let version = if let Some(version) = conf.version { + let old_version = if let Some(version) = conf.version { version } else { eyre::bail!("Version missing in 'in' action."); @@ -108,11 +144,10 @@ fn action_in(conf: Config, dest: impl AsRef) -> Result<()> { let bytes = fetch(&conf.source)?.bytes()?; let prs: Vec = serde_json::from_slice(&bytes)?; + let version = Version::from(prs.iter()); { - let mut prs: Vec<_> = prs.iter().map(|pr| pr.number.to_string()).collect(); - prs.sort_unstable(); - if version.prs != prs { + if version.prs != old_version.prs { eyre::bail!("Version to fetch does not match current resource."); } } @@ -121,10 +156,15 @@ fn action_in(conf: Config, dest: impl AsRef) -> Result<()> { let _ = fs::create_dir_all(dest); fs::write(&path, &bytes)?; + let out = json!({ + "version": version, + }); + + serde_json::to_writer_pretty(io::stdout(), &out)?; + Ok(()) } -#[tracing::instrument(skip_all)] pub(crate) fn run(action: &Action) -> Result<()> { let config: Config = { let mut buf = String::new(); diff --git a/images/gitea/src/main.rs b/images/gitea/src/main.rs index f1989f0..1f71387 100644 --- a/images/gitea/src/main.rs +++ b/images/gitea/src/main.rs @@ -2,10 +2,6 @@ use std::path::PathBuf; use clap::{Parser, Subcommand}; use color_eyre::Result; -use tracing_error::ErrorLayer; -use tracing_subscriber::fmt; -use tracing_subscriber::prelude::*; -use tracing_subscriber::EnvFilter; #[derive(Debug, Parser)] #[command(author, version, about, long_about = None)] @@ -37,15 +33,6 @@ mod cmd { // #[tracing::instrument] fn main() -> Result<()> { - let filter_layer = EnvFilter::try_from_default_env() - .or_else(|_| EnvFilter::try_new("info")) - .unwrap(); - - tracing_subscriber::registry() - .with(filter_layer) - .with(ErrorLayer::new(fmt::format::Pretty::default())) - .init(); - let cli = Cli::parse(); match &cli.command { diff --git a/images/gitea/src/types.rs b/images/gitea/src/types.rs index 09b611b..17f450e 100644 --- a/images/gitea/src/types.rs +++ b/images/gitea/src/types.rs @@ -1,6 +1,20 @@ use serde::Deserialize; +#[derive(Clone, Debug, Deserialize)] +pub struct Ref { + pub r#ref: String, +} + +#[derive(Clone, Debug, Deserialize)] +pub struct User { + pub login: String, +} + #[derive(Clone, Debug, Deserialize)] pub struct PullRequest { pub number: u64, + pub title: String, + pub user: User, + pub base: Ref, + pub head: Ref, }