aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2022-10-15 10:49:45 +0900
committernsfisis <nsfisis@gmail.com>2022-10-15 10:49:45 +0900
commitb3d186476fcc63fe6aaa530679ca169f1727f821 (patch)
treed3ef2caaa8e2979dba4591ae1d0bc61f17bc57df /src
parent74c7ef7ba587292b53369a16b0b6039438603b9d (diff)
downloaddotfiles-b3d186476fcc63fe6aaa530679ca169f1727f821.tar.gz
dotfiles-b3d186476fcc63fe6aaa530679ca169f1727f821.tar.zst
dotfiles-b3d186476fcc63fe6aaa530679ca169f1727f821.zip
git: port the implementation of alias "git-sw" to Golang
Diffstat (limited to 'src')
-rw-r--r--src/gitalias/git-sw.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/gitalias/git-sw.go b/src/gitalias/git-sw.go
new file mode 100644
index 0000000..f4cab21
--- /dev/null
+++ b/src/gitalias/git-sw.go
@@ -0,0 +1,47 @@
+package main
+
+import (
+ "log"
+ "os"
+ "os/exec"
+ "strings"
+)
+
+func main() {
+ gitArgs := []string{"switch"}
+ if requiresDetachFlag(os.Args) {
+ gitArgs = append(gitArgs, "--detach")
+ }
+ for i, argv := range os.Args {
+ if i == 0 {
+ continue // argv[0] is a program name.
+ }
+ gitArgs = append(gitArgs, argv)
+ }
+
+ cmd := exec.Command("git", gitArgs...)
+ cmd.Stdin = os.Stdin
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+
+ err := cmd.Run()
+ if err != nil {
+ switch err.(type) {
+ case *exec.ExitError:
+ // Do nothing here because Git has already reported the error.
+ default:
+ log.Fatal(err)
+ }
+ }
+
+ os.Exit(cmd.ProcessState.ExitCode())
+}
+
+func requiresDetachFlag(argv []string) bool {
+ argc := len(argv)
+ if argc == 1 {
+ return false
+ }
+ firstArg := argv[1]
+ return strings.HasPrefix(firstArg, "origin/") || strings.HasPrefix(firstArg, "upstream/")
+}