You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
smug/smug.go

143 lines
2.5 KiB
Go

3 years ago
package main
import (
"os"
"os/exec"
"path/filepath"
"strings"
)
func ExpandPath(path string) string {
if strings.HasPrefix(path, "~/") {
userHome, err := os.UserHomeDir()
if err != nil {
return path
}
return strings.Replace(path, "~", userHome, 1)
}
return path
}
func Contains(slice []string, s string) bool {
for _, e := range slice {
if e == s {
return true
}
}
return false
}
type Smug struct {
tmux Tmux
commander Commander
}
func (smug Smug) execShellCommands(commands []string, path string) error {
for _, c := range commands {
3 years ago
cmd := exec.Command("/bin/sh", "-c", c)
3 years ago
cmd.Dir = path
_, err := smug.commander.Exec(cmd)
if err != nil {
3 years ago
return err
3 years ago
}
}
return nil
}
func (smug Smug) Stop(config Config, windows []string) error {
if len(windows) == 0 {
sessionRoot := ExpandPath(config.Root)
3 years ago
err := smug.execShellCommands(config.Stop, sessionRoot)
if err != nil {
return err
}
_, err = smug.tmux.StopSession(config.Session)
3 years ago
return err
}
for _, w := range windows {
err := smug.tmux.KillWindow(config.Session + ":" + w)
if err != nil {
return err
}
}
3 years ago
return nil
3 years ago
}
func (smug Smug) Start(config Config, windows []string) error {
3 years ago
var ses string
var err error
sessionRoot := ExpandPath(config.Root)
sessionExists := smug.tmux.SessionExists(config.Session)
if !sessionExists {
err = smug.execShellCommands(config.BeforeStart, sessionRoot)
if err != nil {
return err
}
ses, err = smug.tmux.NewSession(config.Session)
if err != nil {
return err
}
} else {
ses = config.Session + ":"
}
for _, w := range config.Windows {
if (len(windows) == 0 && w.Manual) || (len(windows) > 0 && !Contains(windows, w.Name)) {
3 years ago
continue
}
windowRoot := ExpandPath(w.Root)
if windowRoot == "" || !filepath.IsAbs(windowRoot) {
windowRoot = filepath.Join(sessionRoot, w.Root)
}
window, err := smug.tmux.NewWindow(ses, w.Name, windowRoot, w.Commands)
if err != nil {
return err
}
for _, p := range w.Panes {
paneRoot := ExpandPath(p.Root)
if paneRoot == "" || !filepath.IsAbs(p.Root) {
paneRoot = filepath.Join(windowRoot, p.Root)
}
_, err = smug.tmux.SplitWindow(window, p.Type, paneRoot, p.Commands)
if err != nil {
return err
}
3 years ago
}
}
if len(windows) == 0 {
err = smug.tmux.KillWindow(ses + "0")
if err != nil {
return err
}
err = smug.tmux.RenumberWindows()
if err != nil {
return err
}
err = smug.tmux.Attach(ses+"0", os.Stdin, os.Stdout, os.Stderr)
if err != nil {
return err
}
}
return nil
}