152 lines
3.8 KiB
Go
152 lines
3.8 KiB
Go
package shell
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"go.wit.com/log"
|
|
)
|
|
|
|
// not sure why I wrote this or what it is for
|
|
// this is because I'm crazy. how crazy you ask? fucking crazy!
|
|
// hehe. If you haven't ever written code that you look back
|
|
// at like this and go 'what the fuck is this shit', then
|
|
// realize that you wrote it, then go 'what the fuck is this shit'
|
|
// and then still look at it and wonder, "how early was this. how much did I not know when I wrote this"
|
|
// then, if you haven't done those kinds of things, then don't
|
|
// ever fucking come up to me and tell me that I'm nuts
|
|
// because, you are not as good as me then. It's very complicated
|
|
// to work on very complicated things. I don't care how smart you are,
|
|
// you can totally forget about shit you wrote and then have to come back to it later
|
|
|
|
// also, what the fuck was I thinking with the function 'scanToParent()' as a function that takes
|
|
// a pid arg? what? is this like pstree? I'm not sure what I wanted this for
|
|
// but it sounds interesting.
|
|
func scanToParent(pid int) (bool, string) {
|
|
ppid, err := GetPPID(pid)
|
|
if err != nil {
|
|
fmt.Println("Error getting PPID:", err)
|
|
return true, ""
|
|
}
|
|
|
|
comm, err := GetComm(ppid)
|
|
if err != nil {
|
|
fmt.Println("Error getting comm:", err)
|
|
return true, ""
|
|
}
|
|
|
|
log.Info("scanToParent() found:", comm)
|
|
|
|
// if this is an xterm
|
|
switch comm {
|
|
case "xterm":
|
|
return true, "xterm"
|
|
case "mate-terminal":
|
|
return true, "mate-terminal"
|
|
case "bash":
|
|
// keep digging for the parent xterm
|
|
return scanToParent(ppid)
|
|
case "make":
|
|
// keep digging for the parent xterm
|
|
return scanToParent(ppid)
|
|
}
|
|
if comm == "bash" {
|
|
}
|
|
|
|
ok, better := scanToParent(ppid)
|
|
if ok {
|
|
return ok, better
|
|
}
|
|
if better == "" {
|
|
// if the parent was blank, at least return the something that we have
|
|
// since something is better than nothing
|
|
return false, comm
|
|
}
|
|
return ok, better
|
|
}
|
|
|
|
// returns a string of the xterm the user is using
|
|
// for example, "xterm" or "mate-terminal"
|
|
func Terminal() string {
|
|
pid := os.Getpid()
|
|
_, comm := scanToParent(pid)
|
|
/*
|
|
ppid, err := GetPPID(pid)
|
|
if err != nil {
|
|
fmt.Println("Error getting PPID:", err)
|
|
return ""
|
|
}
|
|
|
|
comm, err := GetComm(ppid)
|
|
if err != nil {
|
|
fmt.Println("Error getting comm:", err)
|
|
return ""
|
|
}
|
|
*/
|
|
|
|
return comm
|
|
}
|
|
|
|
// returns a string of the shell the user is using
|
|
func Shell() string {
|
|
envsh := os.Getenv("SHELL")
|
|
switch envsh {
|
|
case "/bin/bash":
|
|
return "bash"
|
|
}
|
|
return envsh
|
|
}
|
|
|
|
func getXtermCmd(cmd []string) []string {
|
|
var term string
|
|
// doesn't work yet
|
|
// term = Terminal()
|
|
term = "xterm"
|
|
switch term {
|
|
case "mate-terminal":
|
|
newcmd := []string{"mate-terminal", "-e"}
|
|
newcmd = append(newcmd, cmd...)
|
|
return newcmd
|
|
default:
|
|
// unknown terminal. use xterm
|
|
newcmd := []string{"xterm", "-geometry", "140x32", "-e", "bash", "-c"}
|
|
// fix/shell escape sequence this for quote chars, etc
|
|
// tmp := "\"" + strings.Join(cmd, " ") + ";bash\""
|
|
newcmd = append(newcmd, cmd...)
|
|
// newcmd = append(newcmd, cmd...)
|
|
return newcmd
|
|
}
|
|
}
|
|
|
|
// spawns an xterm with something you can run at a command line
|
|
func XtermCmd(path string, cmd []string) {
|
|
go XtermCmdWait(path, cmd)
|
|
}
|
|
|
|
// runs an xterm
|
|
// waits until xterm exits
|
|
func XtermCmdWait(path string, cmd []string) {
|
|
var argsXterm = getXtermCmd(cmd)
|
|
|
|
log.Info("XtermCmd() path =", path, "cmd =", argsXterm)
|
|
|
|
// keeps git diff from exiting on small diffs
|
|
os.Setenv("LESS", "-+F -+X -R")
|
|
|
|
PathRunLog(path, argsXterm, INFO)
|
|
}
|
|
|
|
// spawns an xterm with something you can run at a command line
|
|
// then executes bash
|
|
func XtermCmdBash(path string, cmd []string) {
|
|
var tmp []string
|
|
var argsXterm = getXtermCmd(cmd)
|
|
bash := "\"-c '"
|
|
bash += strings.Join(cmd, " ")
|
|
bash += "'; bash\""
|
|
tmp = append(argsXterm, "bash", bash)
|
|
log.Info("XtermCmd() path =", path, "cmd =", tmp)
|
|
go PathRunLog(path, tmp, INFO)
|
|
}
|