diff options
author | Matthias Beyer <matthias.beyer@atos.net> | 2021-01-11 10:56:38 +0100 |
---|---|---|
committer | Matthias Beyer <matthias.beyer@atos.net> | 2021-01-14 13:29:42 +0100 |
commit | f26bb9494f1fcc4bf307187c47e12c8eb0076f9f (patch) | |
tree | 69151d738ebc21810e021ac1e1ad310e2e52394d /src/commands/db.rs | |
parent | f8c6c605f3b34a8aae87a3b6a4c3816f63125fb0 (diff) |
Fix: with-pkg includes for-pkg
If a package is submitted, the --with-pkg filter should include it.
So:
budido build b
butido build a
where a depends on b.
Then:
butido db submits --for-pkg b
# returns build for b
butido db submits --for-pkg a
# returns build for a
butido db submits --with-pkg a
# returns build for a
butido db submits --with-pkg b
# returns both builds
This patch fixes the code to have that behaviour.
It also refactors the command implementation to be less noisy.
Signed-off-by: Matthias Beyer <matthias.beyer@atos.net>
Diffstat (limited to 'src/commands/db.rs')
-rw-r--r-- | src/commands/db.rs | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/src/commands/db.rs b/src/commands/db.rs index 6a55860..15db23e 100644 --- a/src/commands/db.rs +++ b/src/commands/db.rs @@ -223,29 +223,51 @@ fn submits(conn_cfg: DbConnectionConfig, matches: &ArgMatches) -> Result<()> { let hdrs = mk_header(vec!["id", "time", "uuid"]); let conn = crate::db::establish_connection(conn_cfg)?; + // Helper to map Submit -> Vec<String> + let submit_to_vec = |submit: models::Submit| { + vec![format!("{}", submit.id), submit.submit_time.to_string(), submit.uuid.to_string()] + }; + + // Helper to get all submits that were made _for_ a package + let submits_for = |pkgname: &str| { + schema::submits::table + .inner_join(schema::packages::table) + .filter(schema::packages::dsl::name.eq(&pkgname)) + .select(schema::submits::all_columns) + .load::<models::Submit>(&conn) + }; + let data = if let Some(pkgname) = matches.value_of("with_pkg").map(String::from) { - schema::packages::table - .filter(schema::packages::name.eq(pkgname)) + // Get all submits which included the package, but were not made _for_ the package + let submits_with_pkg = schema::packages::table + .filter(schema::packages::name.eq(&pkgname)) .inner_join(schema::jobs::table.inner_join(schema::submits::table)) .select(schema::submits::all_columns) - .load::<models::Submit>(&conn)? + .load::<models::Submit>(&conn)?; + + let submits_for_pkg = submits_for(&pkgname)?; + + submits_with_pkg + .into_iter() + .chain(submits_for_pkg.into_iter()) + .map(submit_to_vec) + .collect::<Vec<_>>() } else { if let Some(pkgname) = matches.value_of("for_pkg") { - schema::submits::table - .inner_join(schema::packages::table) - .filter(schema::packages::dsl::name.eq(pkgname)) - .select(schema::submits::all_columns) - .load::<models::Submit>(&conn)? + // Get all submits _for_ the package + submits_for(pkgname)? + .into_iter() + .map(submit_to_vec) + .collect::<Vec<_>>() } else { + // default: Get all submits schema::submits::table .load::<models::Submit>(&conn)? + .into_iter() + .map(submit_to_vec) + .collect::<Vec<_>>() } - } - .into_iter() - .map(|submit| { - vec![format!("{}", submit.id), submit.submit_time.to_string(), submit.uuid.to_string()] - }) - .collect::<Vec<_>>(); + }; if data.is_empty() { info!("No submits in database"); |