summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <matthias.beyer@atos.net>2021-10-19 07:26:13 +0200
committerMatthias Beyer <matthias.beyer@atos.net>2021-10-19 07:26:13 +0200
commit5b99282ba23e1002a576934a371c8b9fe7755963 (patch)
treede802924b9c0d2a1d33dda2ad5c25940a060d39e
parent764d693d542bf2dd2c1ae9667c2e2fedfdc13e46 (diff)
parentf7e57803eedd97b8fcc9f0dea29a8432d4486f9d (diff)
Merge branch 'release-late-error'
-rw-r--r--src/commands/release.rs35
1 files changed, 24 insertions, 11 deletions
diff --git a/src/commands/release.rs b/src/commands/release.rs
index 50d3918..5231eb1 100644
--- a/src/commands/release.rs
+++ b/src/commands/release.rs
@@ -19,8 +19,9 @@ use anyhow::Error;
use anyhow::Result;
use clap::ArgMatches;
use diesel::prelude::*;
-use log::{debug, info, trace};
+use log::{debug, error, info, trace};
use tokio_stream::StreamExt;
+use resiter::AndThen;
use crate::config::Configuration;
use crate::db::models as dbmodels;
@@ -140,8 +141,9 @@ async fn new_release(
let interactive = !matches.is_present("noninteractive");
let now = chrono::offset::Local::now().naive_local();
- arts.into_iter()
- .map(|art| async move {
+ let any_err = arts.into_iter()
+ .map(|art| async {
+ let art = art; // ensure it is moved
let art_path = staging_base.join(&art.path);
let dest_path = config.releases_directory().join(release_store_name).join(&art.path);
debug!(
@@ -178,24 +180,35 @@ async fn new_release(
.await
.with_context(|| anyhow!("Copying {} to {}", art_path.display(), dest_path.display()))
.map_err(Error::from)
- .map(|_| (art, dest_path))
+ .and_then(|_| {
+ debug!("Updating {:?} to set released = true", art);
+ let rel = crate::db::models::Release::create(&conn, &art, &now, &release_store)?;
+ debug!("Release object = {:?}", rel);
+ Ok(dest_path)
+ })
}
})
.collect::<futures::stream::FuturesUnordered<_>>()
- .collect::<Result<Vec<_>>>()
- .await?
+ .collect::<Vec<Result<_>>>()
+ .await
.into_iter()
- .try_for_each(|(art, dest_path)| {
- debug!("Updating {:?} to set released = true", art);
- let rel = crate::db::models::Release::create(&conn, &art, &now, &release_store)?;
- debug!("Release object = {:?}", rel);
-
+ .and_then_ok(|dest_path| {
if print_released_file_pathes {
writeln!(std::io::stdout(), "{}", dest_path.display()).map_err(Error::from)
} else {
Ok(())
}
})
+ .filter_map(Result::err)
+ .inspect(|err| error!("Error: {}", err.to_string()))
+ .last()
+ .is_some(); // consume iterator completely, if not empty, there was an error
+
+ if any_err {
+ Err(anyhow!("Releasing one or more artifacts failed"))
+ } else {
+ Ok(())
+ }
}
pub async fn rm_release(