summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias Beyer <matthias.beyer@atos.net>2021-02-26 14:26:29 +0100
committerMatthias Beyer <matthias.beyer@atos.net>2021-03-01 08:25:48 +0100
commit19cc89dd3f03defe6a8f545b938ebfdc26ab3bc0 (patch)
treed90dc7c91b01646927d856921ff1cac65108fc20 /src
parentea54f4309db4a16bc7d19da7c51c614b3e34ccdf (diff)
Implement "db releases" subcommand
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src')
-rw-r--r--src/cli.rs10
-rw-r--r--src/commands/db.rs49
-rw-r--r--src/commands/release.rs5
3 files changed, 62 insertions, 2 deletions
diff --git a/src/cli.rs b/src/cli.rs
index 63a22e3..79d8ccc 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -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