Files
harness-sync/internal/cli/update.go
T

55 lines
1.5 KiB
Go

package cli
import (
"fmt"
"os"
"os/exec"
"path/filepath"
"github.com/spf13/cobra"
)
const installURL = "https://raw.githubusercontent.com/lukaszraczylo/harness-sync/main/install.sh"
// NewUpdate returns the `update` subcommand. It downloads and installs the
// latest harness-sync release into the same directory the running binary
// lives in.
func NewUpdate() *cobra.Command {
var (
dryRun bool
dir string
)
cmd := &cobra.Command{
Use: "update",
Short: "Download and install the latest harness-sync release in place",
RunE: func(cmd *cobra.Command, _ []string) error {
if dir == "" {
exe, err := os.Executable()
if err != nil {
return fmt.Errorf("resolve current binary path: %w", err)
}
resolved, err := filepath.EvalSymlinks(exe)
if err == nil {
exe = resolved
}
dir = filepath.Dir(exe)
}
pipeline := fmt.Sprintf("curl -fsSL %q | INSTALL_DIR=%q bash", installURL, dir)
if _, err := fmt.Fprintf(cmd.OutOrStdout(), "Installing latest harness-sync into %s\n", dir); err != nil {
return err
}
if dryRun {
_, err := fmt.Fprintln(cmd.OutOrStdout(), pipeline)
return err
}
sh := exec.Command("/bin/bash", "-c", pipeline)
sh.Stdout = cmd.OutOrStdout()
sh.Stderr = cmd.ErrOrStderr()
return sh.Run()
},
}
cmd.Flags().BoolVar(&dryRun, "dry-run", false, "print the install command without executing it")
cmd.Flags().StringVar(&dir, "install-dir", "", "override install directory (default: dir of running binary)")
return cmd
}