feat: in-place reloading on current TTY

This commit is contained in:
verse91
2026-04-11 21:53:37 +07:00
parent 2b760fb82a
commit 78e19199b0
3 changed files with 38 additions and 3 deletions
+1
View File
@@ -280,6 +280,7 @@ func topLevelSuggestions(query string) []Suggestion {
if !seen[name] && (query == "" || hasPrefix(name, query)) { if !seen[name] && (query == "" || hasPrefix(name, query)) {
results = append(results, Suggestion{ results = append(results, Suggestion{
Cmd: target, Desc: "alias: " + name, Icon: "root", Cmd: target, Desc: "alias: " + name, Icon: "root",
// Cmd: target, Desc: "alias: " + name, Icon: "DEBUG", //--> this is just for debug on reloading, dont mind it
}) })
seen[name] = true seen[name] = true
} }
+5 -3
View File
@@ -10,10 +10,12 @@ optimized-build:
run: run:
@./iris @./iris
# re-build and run # re-build and reload iris
[group('dev')] [group('dev')]
update: [linux, macos]
@go build -o iris main.go && ./iris reload:
@go build -o iris main.go
@if [ -z "${IRIS_FD:-}" ]; then ./iris; fi
# update pkg # update pkg
[group('dev')] [group('dev')]
+32
View File
@@ -36,12 +36,44 @@ It works exactly like coding editor suggestion menu drop down.`,
} }
func Execute() { func Execute() {
go watchSelf()
if err := rootCmd.Execute(); err != nil { if err := rootCmd.Execute(); err != nil {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
os.Exit(1) os.Exit(1)
} }
} }
func watchSelf() {
exe, err := os.Executable()
if err != nil {
return
}
startTime := time.Now()
for {
time.Sleep(500 * time.Millisecond)
info, err := os.Stat(exe)
if err != nil {
continue
}
if info.ModTime().After(startTime) {
// clean up terminal before exec
fmt.Printf("\r\n\033[35m[IRIS] binary updated, reloading...\033[0m\r\n")
// we need to be careful about raw mode but syscall.Exec will replace the process
// which is fine as the new iris will setup its own raw mode
// however, to be safe for the terminal state, we'd ideally restore then exec
// but since we're inside a PTY wrapper, it's more complex
// the simplest way: just exec, the new iris will handle the terminal
err := syscall.Exec(exe, os.Args, os.Environ())
if err != nil {
fmt.Printf("Reload failed: %v\n", err)
}
}
}
}
func runWrapper() { func runWrapper() {
r, w, err := os.Pipe() r, w, err := os.Pipe()
if err != nil { if err != nil {