summaryrefslogtreecommitdiffstats
path: root/internal/utils
diff options
context:
space:
mode:
Diffstat (limited to 'internal/utils')
-rw-r--r--internal/utils/tty.go19
-rw-r--r--internal/utils/version.go47
-rw-r--r--internal/utils/version_test.go24
3 files changed, 78 insertions, 12 deletions
diff --git a/internal/utils/tty.go b/internal/utils/tty.go
new file mode 100644
index 0000000..4ac367d
--- /dev/null
+++ b/internal/utils/tty.go
@@ -0,0 +1,19 @@
+package utils
+
+import (
+ "os"
+
+ "golang.org/x/term"
+)
+
+func IsTerminal() bool {
+ return term.IsTerminal(int(os.Stdout.Fd()))
+}
+
+func IsStderrTerminal() bool {
+ return term.IsTerminal(int(os.Stderr.Fd()))
+}
+
+func isTerminal() bool {
+ return IsTerminal()
+}
diff --git a/internal/utils/version.go b/internal/utils/version.go
index 46ebb73..ab72bfb 100644
--- a/internal/utils/version.go
+++ b/internal/utils/version.go
@@ -4,7 +4,9 @@ import (
"fmt"
"os"
"os/exec"
+ "path/filepath"
"runtime/debug"
+ "strconv"
"strings"
"syscall"
@@ -83,10 +85,21 @@ func isNewerVersion(remote, local string) bool {
localParts := strings.Split(local, ".")
for i := 0; i < len(remoteParts) && i < len(localParts); i++ {
- if remoteParts[i] > localParts[i] {
+ r, errR := strconv.Atoi(remoteParts[i])
+ l, errL := strconv.Atoi(localParts[i])
+ if errR != nil || errL != nil {
+ if remoteParts[i] > localParts[i] {
+ return true
+ }
+ if remoteParts[i] < localParts[i] {
+ return false
+ }
+ continue
+ }
+ if r > l {
return true
}
- if remoteParts[i] < localParts[i] {
+ if r < l {
return false
}
}
@@ -125,26 +138,36 @@ func promptAndUpdate(newVersion string) {
restartSelf()
}
+func resolveInstalledBinary() (string, error) {
+ if gobin := os.Getenv("GOBIN"); gobin != "" {
+ return filepath.Join(gobin, "dborg"), nil
+ }
+
+ gopath := os.Getenv("GOPATH")
+ if gopath == "" {
+ out, err := exec.Command("go", "env", "GOPATH").Output()
+ if err != nil {
+ return "", fmt.Errorf("could not determine GOPATH: %w", err)
+ }
+ gopath = strings.TrimSpace(string(out))
+ }
+
+ return filepath.Join(gopath, "bin", "dborg"), nil
+}
+
func restartSelf() {
- executable, err := os.Executable()
+ newBinary, err := resolveInstalledBinary()
if err != nil {
- fmt.Fprintf(os.Stderr, "Failed to get executable path: %v\n", err)
+ fmt.Fprintf(os.Stderr, "Failed to locate installed binary: %v\n", err)
os.Exit(1)
}
args := os.Args[1:]
- err = syscall.Exec(executable, append([]string{executable}, args...), os.Environ())
+ err = syscall.Exec(newBinary, append([]string{newBinary}, args...), os.Environ())
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to restart: %v\n", err)
os.Exit(1)
}
}
-func isTerminal() bool {
- fileInfo, err := os.Stdout.Stat()
- if err != nil {
- return false
- }
- return (fileInfo.Mode() & os.ModeCharDevice) != 0
-}
diff --git a/internal/utils/version_test.go b/internal/utils/version_test.go
index e3a27b1..9db181a 100644
--- a/internal/utils/version_test.go
+++ b/internal/utils/version_test.go
@@ -72,6 +72,30 @@ func TestIsNewerVersion(t *testing.T) {
local: "v0.5.0",
expected: true,
},
+ {
+ name: "double digit patch newer",
+ remote: "v1.0.12",
+ local: "v1.0.9",
+ expected: true,
+ },
+ {
+ name: "double digit patch older",
+ remote: "v1.0.9",
+ local: "v1.0.12",
+ expected: false,
+ },
+ {
+ name: "double digit patch same",
+ remote: "v1.0.12",
+ local: "v1.0.12",
+ expected: false,
+ },
+ {
+ name: "double digit minor newer",
+ remote: "v1.10.0",
+ local: "v1.9.0",
+ expected: true,
+ },
}
for _, tt := range tests {