clientupdate, util/osshare, util/winutil, version: improve Windows GUI filename resolution and WinUI build awareness

On Windows arm64 we are going to need to ship two different GUI builds;
one for Win10 (GOARCH=386) and one for Win11 (GOARCH=amd64, tags +=
winui). Due to quirks in MSI packaging, they cannot both share the
same filename. This requires some fixes in places where we have
hardcoded "tailscale-ipn" as the GUI filename.

We also do some cleanup in clientupdate to ensure that autoupdates
will continue to work correctly with the temporary "-winui" package
variant.

Fixes #17480
Updates https://github.com/tailscale/corp/issues/29940

Signed-off-by: Aaron Klotz <aaron@tailscale.com>
This commit is contained in:
Aaron Klotz
2025-09-29 11:44:23 -06:00
parent e45557afc0
commit 7c49cab1a6
7 changed files with 146 additions and 33 deletions

25
version/exename.go Normal file
View File

@@ -0,0 +1,25 @@
// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause
package version
import (
"path/filepath"
"strings"
)
// prepExeNameForCmp strips any extension and arch suffix from exe, and
// lowercases it.
func prepExeNameForCmp(exe, arch string) string {
baseNoExt := strings.ToLower(strings.TrimSuffix(filepath.Base(exe), filepath.Ext(exe)))
archSuffix := "-" + arch
return strings.TrimSuffix(baseNoExt, archSuffix)
}
func checkPreppedExeNameForGUI(preppedExeName string) bool {
return preppedExeName == "tailscale-ipn" || preppedExeName == "tailscale-gui"
}
func isGUIExeName(exe, arch string) bool {
return checkPreppedExeNameForGUI(prepExeNameForCmp(exe, arch))
}