-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathselfinstall.go
More file actions
70 lines (61 loc) · 2.36 KB
/
Copy pathselfinstall.go
File metadata and controls
70 lines (61 loc) · 2.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
)
// selfInstallIsInstalled prüft ob bashq als Symlink oder Datei im System-PATH installiert ist.
func selfInstallIsInstalled() bool {
home, _ := os.UserHomeDir()
if _, err := os.Lstat("/usr/local/bin/bashq"); err == nil {
return true
}
if _, err := os.Lstat(filepath.Join(home, ".local/bin/bashq")); err == nil {
return true
}
return false
}
// selfInstallToggle erstellt oder entfernt einen Symlink auf die laufende Binary.
// Symlink statt Kopie: der globale Aufruf zeigt immer auf die aktuelle Binary —
// ein `go build` genügt, kein erneutes Installieren nötig.
func selfInstallToggle() (msg string, isErr bool) {
exe, err := os.Executable()
if err != nil {
return "Fehler: Pfad der aktuellen Binary nicht ermittelbar: " + err.Error(), true
}
exe, _ = filepath.EvalSymlinks(exe)
systemTarget := "/usr/local/bin/bashq"
home, _ := os.UserHomeDir()
userTarget := filepath.Join(home, ".local/bin/bashq")
// Prüfen ob bereits installiert (Datei oder Symlink)
installedAt := ""
if _, err := os.Lstat(systemTarget); err == nil {
installedAt = systemTarget
} else if _, err := os.Lstat(userTarget); err == nil {
installedAt = userTarget
}
if installedAt != "" {
// Deinstallieren — Symlink oder Datei entfernen
if err := os.Remove(installedAt); err != nil {
return fmt.Sprintf("✗ Konnte %s nicht entfernen: %v", installedAt, err), true
}
return fmt.Sprintf("✓ %s entfernt", installedAt), false
}
// Installieren — erst systemweit versuchen, dann ~/.local/bin
if err := os.Symlink(exe, systemTarget); err == nil {
return fmt.Sprintf("✓ %s → %s\n von überall aufrufbar", systemTarget, exe), false
}
// Fallback: ~/.local/bin
if err := os.MkdirAll(filepath.Dir(userTarget), 0755); err != nil {
return fmt.Sprintf("✗ Konnte ~/.local/bin nicht anlegen: %v", err), true
}
if err := os.Symlink(exe, userTarget); err != nil {
return fmt.Sprintf("✗ Symlink fehlgeschlagen: %v\n Tipp: sudo ln -sf %s /usr/local/bin/bashq", err, exe), true
}
localBinDir := filepath.Dir(userTarget)
if !strings.Contains(os.Getenv("PATH"), localBinDir) {
return fmt.Sprintf("✓ %s → %s\n ⚠ ~/.local/bin ist nicht im PATH:\n export PATH=\"$HOME/.local/bin:$PATH\"", userTarget, exe), false
}
return fmt.Sprintf("✓ %s → %s\n von überall aufrufbar", userTarget, exe), false
}