返回 DeepSeek-Reasonix
relauncher.go
根目录 / desktop / relauncher.go
1 package main
2
3 import (
4 "os"
5 "path/filepath"
6 "strings"
7
8 "reasonix/internal/installlayout"
9 "reasonix/internal/proc"
10 )
11
12 // relaunchThroughLauncher starts the permanent thin launcher (or the active
13 // desktop). It never restarts a retained versions/<old>/ desktop binary.
14 func relaunchThroughLauncher() error {
15 return relaunchThroughLauncherWithEnv(nil)
16 }
17
18 func relaunchThroughLauncherWithEnv(overrides map[string]string) error {
19 exe, err := os.Executable()
20 if err != nil {
21 return err
22 }
23 launcher, err := relaunchTarget(exe)
24 if err != nil {
25 return err
26 }
27 args := []string{}
28 // Only legacy guard understands "launch --detach"; the thin launcher strips it.
29 if strings.Contains(strings.ToLower(filepath.Base(launcher)), "guard") {
30 args = []string{"launch", "--detach"}
31 }
32 cmd := proc.VisibleCommand(launcher, args...)
33 if len(overrides) > 0 {
34 cmd.Env = processEnvWithOverrides(os.Environ(), overrides)
35 }
36 cmd.Stdout, cmd.Stderr, cmd.Stdin = os.Stdout, os.Stderr, os.Stdin
37 return cmd.Start()
38 }
39
40 func relaunchTarget(exe string) (string, error) {
41 root := filepath.Dir(exe)
42 if resolved, err := installlayout.ResolveInstallRoot(exe); err == nil && resolved != "" {
43 root = resolved
44 }
45 path, err := installlayout.StableRelaunchPath(root)
46 if err != nil {
47 return "", err
48 }
49 return path, nil
50 }
51
52 func processEnvWithOverrides(base []string, overrides map[string]string) []string {
53 env := make([]string, 0, len(base)+len(overrides))
54 for _, entry := range base {
55 key, _, ok := strings.Cut(entry, "=")
56 if ok {
57 if _, overridden := overrides[key]; overridden {
58 continue
59 }
60 }
61 env = append(env, entry)
62 }
63 for key, value := range overrides {
64 env = append(env, key+"="+value)
65 }
66 return env
67 }
68
68 lines GO