diff options
author | Matthias Beyer <matthias.beyer@atos.net> | 2021-02-26 14:26:29 +0100 |
---|---|---|
committer | Matthias Beyer <matthias.beyer@atos.net> | 2021-03-01 08:25:48 +0100 |
commit | 19cc89dd3f03defe6a8f545b938ebfdc26ab3bc0 (patch) | |
tree | d90dc7c91b01646927d856921ff1cac65108fc20 /src | |
parent | ea54f4309db4a16bc7d19da7c51c614b3e34ccdf (diff) |
Implement "db releases" subcommand
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/cli.rs | 10 | ||||
-rw-r--r-- | src/commands/db.rs | 49 | ||||
-rw-r--r-- | src/commands/release.rs | 5 |
3 files changed, 62 insertions, 2 deletions
@@ -254,6 +254,16 @@ pub fn cli<'a>() -> App<'a> { .arg(script_arg_highlight()) .arg(script_arg_no_highlight()) ) + .subcommand(App::new("releases") + .about("List releases") + .arg(Arg::new("csv") + .required(false) + .multiple(false) + .long("csv") + .takes_value(false) + .about("Format output as CSV") + ) + ) ) .subcommand(App::new("build") diff --git a/src/commands/db.rs b/src/commands/db.rs index 8a37ec3..0ef9893 100644 --- a/src/commands/db.rs +++ b/src/commands/db.rs @@ -13,14 +13,15 @@ use std::io::Write; use std::path::PathBuf; use std::process::Command; -use anyhow::anyhow; use anyhow::Context; use anyhow::Error; use anyhow::Result; +use anyhow::anyhow; use clap::ArgMatches; use colored::Colorize; use diesel::BelongingToDsl; use diesel::ExpressionMethods; +use diesel::JoinOnDsl; use diesel::QueryDsl; use diesel::RunQueryDsl; use itertools::Itertools; @@ -47,6 +48,7 @@ pub fn db( Some(("submits", matches)) => submits(db_connection_config, matches), Some(("jobs", matches)) => jobs(db_connection_config, matches), Some(("job", matches)) => job(db_connection_config, config, matches), + Some(("releases", matches)) => releases(db_connection_config, config, matches), Some((other, _)) => Err(anyhow!("Unknown subcommand: {}", other)), None => Err(anyhow!("No subcommand")), } @@ -582,6 +584,50 @@ fn job(conn_cfg: DbConnectionConfig, config: &Configuration, matches: &ArgMatche } } +fn releases(conn_cfg: DbConnectionConfig, config: &Configuration, matches: &ArgMatches) -> Result<()> { + let csv = matches.is_present("csv"); + let conn = crate::db::establish_connection(conn_cfg)?; + let header = mk_header(["Package", "Version", "Date", "Path"].to_vec()); + let data = schema::jobs::table + .inner_join(schema::packages::table) + .inner_join(schema::artifacts::table) + .inner_join(schema::releases::table + .on(schema::releases::artifact_id.eq(schema::artifacts::id))) + .inner_join(schema::release_stores::table + .on(schema::release_stores::id.eq(schema::releases::release_store_id))) + .order_by(schema::packages::dsl::name.asc()) + .then_order_by(schema::packages::dsl::version.asc()) + .then_order_by(schema::releases::release_date.asc()) + .select({ + let art = schema::artifacts::all_columns; + let pac = schema::packages::all_columns; + let rel = schema::releases::all_columns; + let rst = schema::release_stores::all_columns; + (art, pac, rel, rst) + }) + .load::<(models::Artifact, models::Package, models::Release, models::ReleaseStore)>(&conn)? + .into_iter() + .filter_map(|(art, pack, rel, rstore)| { + let p = config.releases_directory().join(rstore.store_name).join(&art.path); + + if p.is_file() { + Some(vec![ + pack.name, + pack.version, + rel.release_date.to_string(), + p.display().to_string(), + ]) + } else { + log::warn!("Released file for {} {} not found: {}", pack.name, pack.version, p.display()); + None + } + }) + .collect::<Vec<Vec<_>>>(); + + display_data(header, data, csv) +} + + fn mk_header(vec: Vec<&str>) -> Vec<ascii_table::Column> { vec.into_iter() .map(|name| ascii_table::Column { @@ -638,3 +684,4 @@ fn display_data<D: Display>( Ok(()) } } + diff --git a/src/commands/release.rs b/src/commands/release.rs index a3d53f0..e811cb6 100644 --- a/src/commands/release.rs +++ b/src/commands/release.rs @@ -176,13 +176,16 @@ pub async fn rm_release( config: &Configuration, matches: &ArgMatches, ) -> Result<()> { - let release_store_name = matches.value_of("release_store_name").unwrap(); // safe by clap + let release_store_name = matches.value_of("release_store_name").map(String::from).unwrap(); // safe by clap if !(config.releases_directory().exists() && config.releases_directory().is_dir()) { return Err(anyhow!( "Release directory does not exist or does not point to directory: {}", config.releases_directory().display() )); } + if !config.release_stores().contains(&release_store_name) { + return Err(anyhow!("Unknown release store name: {}", release_store_name)) + } let pname = matches.value_of("package_name").map(String::from).unwrap(); // TODO: FIXME let pvers = matches.value_of("package_version").map(String::from).unwrap(); // TODO: FIXME |