From fc91af6c9a9def434fea9da87a742ce4492c1c99 Mon Sep 17 00:00:00 2001 From: mineugene Date: Sun, 13 Feb 2022 15:05:35 -0500 Subject: [PATCH] fix #1: stop background jobs on abort --- winget-upgrade.ps1 | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/winget-upgrade.ps1 b/winget-upgrade.ps1 index fa6be9b..6d1a963 100644 --- a/winget-upgrade.ps1 +++ b/winget-upgrade.ps1 @@ -29,8 +29,20 @@ function Iterate-Async { param($Cmd, $ArgsList) $tasks = @() - foreach ($a in $ArgsList) { - $tasks += start-job -argumentlist $a -scriptblock $Cmd + $success = $false + try { + foreach ($a in $ArgsList) { + $tasks += start-job -argumentlist $a -scriptblock $Cmd + } + $success = $true + } + finally { + if ($success) { + write-host -nonewline "..." + } else { + write-host "ABORTING" + stop-job $tasks; remove-job $tasks + } } return $tasks } @@ -38,7 +50,19 @@ function Iterate-Async { function Resolve-All { param($tasks) - wait-job -job $tasks | Out-Null + $success = $false + try { + wait-job -job $tasks | Out-Null + $success = $true + } + finally { + if ($success) { + write-host "DONE" + } else { + write-host "ABORTING" + stop-job $tasks; remove-job $tasks + } + } return ($tasks | % {receive-job $_.Id;remove-job $_.Id}) -split ' ' } @@ -113,20 +137,20 @@ if ( write-header "Starting full upgrade" -write-host -nonewline "resolving packages..." +write-host -nonewline "resolving packages" $tasks_resolve = iterate-async -cmd $resolve_names -argslist $programs.programs $unresolved = resolve-all -tasks $tasks_resolve -write-host "DONE" + if ($unresolved.Length -gt 0) { write-error -category NotInstalled ` -message "$($unresolved.Item(0)) : target not found." exit 0xffffffff } -write-host -nonewline "looking for conflicting packages..." +write-host -nonewline "looking for conflicting packages" $tasks_exists = iterate-async -cmd $find_installed -argslist $programs.programs $installed = resolve-all -tasks $tasks_exists -write-host "DONE" + $new_programs = $programs.programs foreach ($prog_name in $installed) { # filter out programs already installed on system