diff --git a/docs/PRE-RELEASE-TASKS.md b/docs/PRE-RELEASE-TASKS.md index 11fc6e0..367331f 100644 --- a/docs/PRE-RELEASE-TASKS.md +++ b/docs/PRE-RELEASE-TASKS.md @@ -89,7 +89,7 @@ These land together because both edit `domain/job.go` and `storage/store.go`. ### Phase 2 — PySentry legacy removal - [x] P2.1 — Windows autostart legacy code -- [ ] P2.2 — Linux autostart legacy code +- [x] P2.2 — Linux autostart legacy code - [ ] P2.3 — Delete legacy autostart tests - [ ] P2.4 — `.gitignore` / `.dockerignore` diff --git a/src/platform/autostart/autostart_linux.go b/src/platform/autostart/autostart_linux.go index 5d4dd6d..1f2c3f6 100644 --- a/src/platform/autostart/autostart_linux.go +++ b/src/platform/autostart/autostart_linux.go @@ -5,7 +5,6 @@ package autostart import ( "fmt" "os" - "os/exec" "path/filepath" "strconv" "strings" @@ -27,25 +26,12 @@ func (linuxManager) Status(expectedEnabled bool, executablePath string) (bool, s } const autostartDesktopFileName = "gosentry.desktop" -const legacyAutostartDesktopFileName = "pysentry.desktop" func SetAutostart(enabled bool, executablePath string, iconPath string) error { desktopPath, err := autostartDesktopPath() if err != nil { return err } - // A desktop scheduler with a tray icon belongs to the graphical session, so - // Linux autostart is implemented through XDG Autostart instead of a systemd - // user service. systemd is tempting because it is explicit and scriptable, - // but it is the wrong owner for a windowed app that should inherit the - // desktop session environment and appear in the tray predictably. - if err := cleanupLegacySystemdAutostart(); err != nil { - return err - } - if err := cleanupLegacyDesktopAutostart(); err != nil { - return err - } - if enabled { if err := os.MkdirAll(filepath.Dir(desktopPath), 0o755); err != nil { return err @@ -73,12 +59,6 @@ func AutostartStatus(expectedEnabled bool, executablePath string) (bool, string) if err != nil { return false, "Cannot resolve XDG autostart directory" } - if legacySystemdAutostartExists() { - return false, "Legacy systemd autostart entry still exists" - } - if legacyDesktopAutostartExists() { - return false, "Legacy desktop autostart entry still exists" - } data, readErr := os.ReadFile(desktopPath) if !expectedEnabled { @@ -109,18 +89,6 @@ func autostartDesktopPath() (string, error) { return filepath.Join(configHome, "autostart", autostartDesktopFileName), nil } -func legacyAutostartDesktopPath() (string, error) { - configHome := os.Getenv("XDG_CONFIG_HOME") - if configHome == "" { - home, err := os.UserHomeDir() - if err != nil { - return "", err - } - configHome = filepath.Join(home, ".config") - } - return filepath.Join(configHome, "autostart", legacyAutostartDesktopFileName), nil -} - func quoteDesktopExec(path string) string { return strconv.Quote(path) } @@ -132,67 +100,3 @@ func desktopIconLine(iconPath string) string { return "Icon=" + iconPath } -func cleanupLegacySystemdAutostart() error { - unitPath, err := legacySystemdUnitPath() - if err != nil { - return err - } - if _, err := os.Stat(unitPath); os.IsNotExist(err) { - return nil - } - - // Older PySentry builds used a systemd user unit for autostart. The current - // GoSentry implementation uses XDG Autostart because it is a GUI/tray - // application and should be launched by the desktop session. Disable and - // remove the old unit so the two mechanisms do not fight or start duplicates. - _ = exec.Command("systemctl", "--user", "disable", "pysentry.service").Run() - if err := os.Remove(unitPath); err != nil && !os.IsNotExist(err) { - return err - } - _ = exec.Command("systemctl", "--user", "daemon-reload").Run() - return nil -} - -func cleanupLegacyDesktopAutostart() error { - desktopPath, err := legacyAutostartDesktopPath() - if err != nil { - return err - } - // The old PySentry desktop file is removed proactively instead of tolerated - // alongside the new one. Leaving both files in place would risk duplicate - // launches or confusing status diagnostics after the rename. - if err := os.Remove(desktopPath); err != nil && !os.IsNotExist(err) { - return err - } - return nil -} - -func legacyDesktopAutostartExists() bool { - desktopPath, err := legacyAutostartDesktopPath() - if err != nil { - return false - } - _, err = os.Stat(desktopPath) - return err == nil -} - -func legacySystemdAutostartExists() bool { - unitPath, err := legacySystemdUnitPath() - if err != nil { - return false - } - _, err = os.Stat(unitPath) - return err == nil -} - -func legacySystemdUnitPath() (string, error) { - configHome := os.Getenv("XDG_CONFIG_HOME") - if configHome == "" { - home, err := os.UserHomeDir() - if err != nil { - return "", err - } - configHome = filepath.Join(home, ".config") - } - return filepath.Join(configHome, "systemd", "user", "pysentry.service"), nil -} diff --git a/src/platform/autostart/autostart_linux_test.go b/src/platform/autostart/autostart_linux_test.go index 22ebc1f..fa92ffc 100644 --- a/src/platform/autostart/autostart_linux_test.go +++ b/src/platform/autostart/autostart_linux_test.go @@ -4,7 +4,6 @@ package autostart import ( "os" - "path/filepath" "strings" "testing" @@ -34,24 +33,3 @@ func TestLinuxAutostartStartsInTray(t *testing.T) { } } -func TestLinuxAutostartRemovesLegacyDesktopEntry(t *testing.T) { - t.Setenv("XDG_CONFIG_HOME", t.TempDir()) - - legacyPath, err := legacyAutostartDesktopPath() - if err != nil { - t.Fatalf("resolve legacy desktop path: %v", err) - } - if err := os.MkdirAll(filepath.Dir(legacyPath), 0o755); err != nil { - t.Fatalf("create legacy desktop directory: %v", err) - } - if err := os.WriteFile(legacyPath, []byte("[Desktop Entry]\nName=PySentry\n"), 0o644); err != nil { - t.Fatalf("write legacy desktop entry: %v", err) - } - - if err := SetAutostart(true, "/opt/gosentry/gosentry", ""); err != nil { - t.Fatalf("enable autostart: %v", err) - } - if _, err := os.Stat(legacyPath); !os.IsNotExist(err) { - t.Fatalf("legacy desktop entry still exists or cannot be checked: %v", err) - } -}