summaryrefslogtreecommitdiff
path: root/Magefile.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-26 23:10:50 +0200
committerPaul Buetow <paul@buetow.org>2026-03-26 23:10:50 +0200
commitb0392db09b960e70caf73db41cc74c9182733935 (patch)
treeb570c76c311cc02545ec545620ec87f7da19df39 /Magefile.go
parent5fd23315835d29f3551db2a1d10218deb95cd3de (diff)
release: v0.26.1v0.26.1
Diffstat (limited to 'Magefile.go')
-rw-r--r--Magefile.go65
1 files changed, 50 insertions, 15 deletions
diff --git a/Magefile.go b/Magefile.go
index 0d52d30..65748fd 100644
--- a/Magefile.go
+++ b/Magefile.go
@@ -5,6 +5,7 @@ package main
import (
"fmt"
+ "io"
"os"
"path/filepath"
"regexp"
@@ -118,22 +119,19 @@ func Install() error {
if err := os.MkdirAll(bin, 0o755); err != nil {
return err
}
- if err := sh.RunV("cp", "-v", "./ask", bin+"/"); err != nil {
- return err
- }
- if err := sh.RunV("cp", "-v", "./hexai-lsp-server", bin+"/"); err != nil {
- return err
- }
- if err := sh.RunV("cp", "-v", "./hexai", bin+"/"); err != nil {
- return err
- }
- if err := sh.RunV("cp", "-v", "./hexai-tmux-action", bin+"/"); err != nil {
- return err
- }
- if err := sh.RunV("cp", "-v", "./hexai-tmux-edit", bin+"/"); err != nil {
- return err
+ for _, name := range []string{
+ "ask",
+ "hexai-lsp-server",
+ "hexai",
+ "hexai-tmux-action",
+ "hexai-tmux-edit",
+ "hexai-mcp-server",
+ } {
+ if err := atomicInstallBinary(filepath.Join(".", name), bin); err != nil {
+ return err
+ }
}
- return sh.RunV("cp", "-v", "./hexai-mcp-server", bin+"/")
+ return nil
}
// RunTmuxAction runs the hexai-tmux-action TUI via go run (reads stdin).
@@ -219,6 +217,43 @@ func totalCoveragePercent(profile string) (float64, bool) {
return f, true
}
+func atomicInstallBinary(src, dstDir string) error {
+ in, err := os.Open(src)
+ if err != nil {
+ return err
+ }
+ defer in.Close()
+
+ info, err := in.Stat()
+ if err != nil {
+ return err
+ }
+ tmp, err := os.CreateTemp(dstDir, filepath.Base(src)+".tmp-*")
+ if err != nil {
+ return err
+ }
+ tmpPath := tmp.Name()
+ defer os.Remove(tmpPath)
+
+ if _, err := io.Copy(tmp, in); err != nil {
+ tmp.Close()
+ return err
+ }
+ if err := tmp.Chmod(info.Mode() & os.ModePerm); err != nil {
+ tmp.Close()
+ return err
+ }
+ if err := tmp.Close(); err != nil {
+ return err
+ }
+ dst := filepath.Join(dstDir, filepath.Base(src))
+ if err := os.Rename(tmpPath, dst); err != nil {
+ return err
+ }
+ fmt.Printf("installed %s -> %s\n", src, dst)
+ return nil
+}
+
// Test runs the test suite.
func Test() error {
if err := sh.RunV("go", "clean", "-testcache"); err != nil {