Skip to content

Commit 602b939

Browse files
committed
Merge branch 'dev'
2 parents b7e0b0f + 1be538d commit 602b939

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

managers/service.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"errors"
88
"net"
99
"os"
10+
"path/filepath"
1011
"runtime"
1112
"strconv"
1213
"sync"
@@ -271,6 +272,29 @@ func (service *managerService) Execute(args []string, r <-chan svc.ChangeRequest
271272

272273
changes <- svc.Status{State: svc.Running, Accepts: svc.AcceptStop | svc.AcceptSessionChange}
273274

275+
// If restart-ui-after-update flag exists (written before MSI run), launch UI for active session then remove flag.
276+
go func() {
277+
flagPath := filepath.Join(config.GetProgramDataDir(), "restart-ui-after-update.flag")
278+
if _, statErr := os.Stat(flagPath); statErr != nil {
279+
return
280+
}
281+
sessionID := windows.WTSGetActiveConsoleSessionId()
282+
if sessionID == 0 {
283+
logger.Info("Restart-ui flag present but no active console session, removing flag")
284+
_ = os.Remove(flagPath)
285+
return
286+
}
287+
procsLock.Lock()
288+
aliveSessions[sessionID] = true
289+
procsLock.Unlock()
290+
requestUILaunchChan <- sessionID
291+
if err := os.Remove(flagPath); err != nil && !os.IsNotExist(err) {
292+
logger.Error("Failed to remove restart-ui flag: %v", err)
293+
} else {
294+
logger.Info("Launched UI for session %d after update and removed restart-ui flag", sessionID)
295+
}
296+
}()
297+
274298
uninstall := false
275299
loop:
276300
for {

updater/downloader.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
"hash"
1010
"io"
1111
"net/url"
12+
"os"
13+
"path/filepath"
1214
"strconv"
1315
"strings"
1416
"sync/atomic"
@@ -18,6 +20,7 @@ import (
1820
"golang.org/x/sys/windows"
1921

2022
"github.com/fosrl/newt/logger"
23+
"github.com/fosrl/windows/config"
2124
"github.com/fosrl/windows/elevate"
2225
"github.com/fosrl/windows/updater/winhttp"
2326
"github.com/fosrl/windows/version"
@@ -376,12 +379,26 @@ func DownloadVerifyAndExecute(userToken uintptr) (progress chan DownloadProgress
376379

377380
logger.Info("Updater: Starting MSI installation")
378381
progress <- DownloadProgress{Activity: "Installing update"}
382+
383+
restartUIFlagPath := filepath.Join(config.GetProgramDataDir(), "restart-ui-after-update.flag")
384+
if err := os.MkdirAll(config.GetProgramDataDir(), 0o755); err != nil {
385+
logger.Error("Updater: Failed to create ProgramData dir for restart flag: %v", err)
386+
} else if err := os.WriteFile(restartUIFlagPath, nil, 0o644); err != nil {
387+
logger.Error("Updater: Failed to write restart-ui flag file: %v", err)
388+
} else {
389+
logger.Info("Updater: Wrote restart-ui flag at %s", restartUIFlagPath)
390+
}
391+
379392
err = runMsi(file, userToken)
380393
if err != nil {
381394
logger.Error("Updater: MSI installation failed: %v", err)
395+
if removeErr := os.Remove(restartUIFlagPath); removeErr != nil && !os.IsNotExist(removeErr) {
396+
logger.Error("Updater: Failed to remove restart-ui flag after MSI failure: %v", removeErr)
397+
}
382398
progress <- DownloadProgress{Error: err}
383399
return
384400
}
401+
// Flag file left in place so next start can start the UI automatically, then delete the file
385402
logger.Info("Updater: MSI installation completed successfully")
386403

387404
logger.Info("Updater: Update process complete")

0 commit comments

Comments
 (0)