@@ -117,13 +117,13 @@ func upgradeExtensionIfOutdated(verbose bool, includePrereleases bool) (bool, st
117117 // version.
118118 if includePrereleases && ! needsRenameWorkaround () {
119119 updateExtensionCheckLog .Printf ("Prerelease upgrade on macOS: skipping gh extension upgrade (uses /releases/latest, ignores prereleases), using pin-based install for %s" , latestVersion )
120- removeCmd := exec . Command ( "gh" , "extension" , "remove" , extensionRepo )
120+ removeCmd := ghCmdForExtension ( "extension" , "remove" , extensionRepo )
121121 removeCmd .Stdout = os .Stderr
122122 removeCmd .Stderr = os .Stderr
123123 if removeErr := removeCmd .Run (); removeErr != nil {
124124 updateExtensionCheckLog .Printf ("Could not remove extension before pin-based install (continuing anyway): %v" , removeErr )
125125 }
126- pinCmd := exec . Command ( "gh" , "extension" , "install" , extensionRepo , "--pin" , latestVersion )
126+ pinCmd := ghCmdForExtension ( "extension" , "install" , extensionRepo , "--pin" , latestVersion )
127127 pinCmd .Stdout = os .Stderr
128128 pinCmd .Stderr = os .Stderr
129129 if pinErr := pinCmd .Run (); pinErr != nil {
@@ -144,7 +144,7 @@ func upgradeExtensionIfOutdated(verbose bool, includePrereleases bool) (bool, st
144144 // rename+retry path succeeds and the user is not shown a confusing failure.
145145 var firstAttemptBuf bytes.Buffer
146146 firstAttemptOut := firstAttemptWriter (os .Stderr , & firstAttemptBuf )
147- firstCmd := exec . Command ( "gh" , extensionUpgradeArgs ()... )
147+ firstCmd := ghCmdForExtension ( extensionUpgradeArgs ()... )
148148 firstCmd .Stdout = firstAttemptOut
149149 firstCmd .Stderr = firstAttemptOut
150150 firstErr := firstCmd .Run ()
@@ -248,7 +248,7 @@ func upgradeExtensionIfOutdated(verbose bool, includePrereleases bool) (bool, st
248248 // been moved to the OS temp directory (above) so the remove step can always
249249 // succeed. In both cases we clear backupPath after a successful remove to
250250 // avoid a misleading restore attempt on subsequent failures.
251- removeCmd := exec . Command ( "gh" , "extension" , "remove" , extensionRepo )
251+ removeCmd := ghCmdForExtension ( "extension" , "remove" , extensionRepo )
252252 removeCmd .Stdout = os .Stderr
253253 removeCmd .Stderr = os .Stderr
254254 if removeErr := removeCmd .Run (); removeErr == nil {
@@ -258,7 +258,7 @@ func upgradeExtensionIfOutdated(verbose bool, includePrereleases bool) (bool, st
258258 updateExtensionCheckLog .Printf ("Could not remove extension before reinstall (will attempt install anyway): %v" , removeErr )
259259 }
260260
261- retryCmd := exec . Command ( "gh" , "extension" , "install" , extensionRepo , "--pin" , latestVersion )
261+ retryCmd := ghCmdForExtension ( "extension" , "install" , extensionRepo , "--pin" , latestVersion )
262262 retryCmd .Stdout = os .Stderr
263263 retryCmd .Stderr = os .Stderr
264264 if retryErr := retryCmd .Run (); retryErr != nil {
@@ -426,6 +426,26 @@ func extensionUpgradeArgs() []string {
426426 return []string {"extension" , "upgrade" , extensionRepo , "--force" }
427427}
428428
429+ // ghCmdForExtension creates an exec.Cmd for a gh CLI invocation that must
430+ // target github.com. gh-aw is only published to github.com; in mixed-host
431+ // environments where GH_HOST points at a GHE instance, the default gh
432+ // commands would hit the wrong host and report "already up to date" or fail.
433+ // Pinning GH_HOST=github.com in the child process environment prevents that.
434+ func ghCmdForExtension (args ... string ) * exec.Cmd {
435+ cmd := exec .Command ("gh" , args ... )
436+ // Inherit the full environment so that PATH, HOME, etc. remain intact,
437+ // then override (or add) GH_HOST to ensure github.com is always used.
438+ env := make ([]string , 0 , len (os .Environ ())+ 1 )
439+ for _ , e := range os .Environ () {
440+ if ! strings .HasPrefix (e , "GH_HOST=" ) {
441+ env = append (env , e )
442+ }
443+ }
444+ env = append (env , "GH_HOST=github.com" )
445+ cmd .Env = env
446+ return cmd
447+ }
448+
429449func prereleaseChannelNotice (currentVersion , latestStable string , includePrereleases bool ) []string {
430450 if includePrereleases || latestStable == "" || ! isPrereleaseVersion (currentVersion ) {
431451 return nil
0 commit comments