feat: Impl new option --continue-on-failure (#1559)

* feat: Impl new option `--continue-on-failure`

Resolve #1548

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>

* Add new e2e-tests continue-on-failure

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>

* Rm dup line ion `e2e-tests/live.sh`

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>

* Fix shellcheck

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>

* Fix `BinstallError::crate_errors` if `errors.len()` is 1

In that case, it should return `Some(Self::CrateContext(_))` instead of
`Some(Self::Errors(_))`

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>

* Add more tests to `e2e-tests/continue-on-failure.sh`

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>

* Propagate crate errors on `confirm()` err

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>

* Test having two errors in `e2e-tests/continue-on-failure.sh`

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>

---------

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
Jiahao XU 2024-01-08 22:09:45 +10:00 committed by GitHub
parent f5da25cc56
commit c08b8d232a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 365 additions and 60 deletions

View file

@ -51,6 +51,12 @@ impl Resolution {
impl ResolutionFetch {
pub fn install(self, opts: &Options) -> Result<CrateInfo, BinstallError> {
let crate_name = self.name.clone();
self.install_inner(opts)
.map_err(|err| err.crate_context(crate_name))
}
fn install_inner(self, opts: &Options) -> Result<CrateInfo, BinstallError> {
type InstallFp = fn(&bins::BinFile) -> Result<(), bins::Error>;
let (install_bin, install_link): (InstallFp, InstallFp) = match (opts.no_track, opts.force)
@ -126,6 +132,13 @@ impl ResolutionFetch {
impl ResolutionSource {
pub async fn install(self, opts: Arc<Options>) -> Result<(), BinstallError> {
let crate_name = self.name.clone();
self.install_inner(opts)
.await
.map_err(|err| err.crate_context(crate_name))
}
async fn install_inner(self, opts: Arc<Options>) -> Result<(), BinstallError> {
let target = if let Some(targets) = opts.desired_targets.get_initialized() {
Some(targets.first().ok_or(BinstallError::NoViableTargets)?)
} else {
@ -171,7 +184,7 @@ impl ResolutionSource {
cmd.arg("--no-track");
}
debug!("Running `{}`", format_cmd(&cmd),);
debug!("Running `{}`", format_cmd(&cmd));
if !opts.dry_run {
let mut child = opts