Commit dbc19527c5
Verified · cmc
cmd/gitbay/ssh.go +41
| @@ -1,8 +1,11 @@ | ||
| 1 | 1 | package main |
| 2 | 2 | |
| 3 | 3 | import ( |
| 4 | "text/tabwriter" | |
| 5 | ||
| 4 | 6 | "encoding/json" |
| 5 | 7 | "fmt" |
| 8 | "golang.org/x/term" | |
| 6 | 9 | "io" |
| 7 | 10 | "os" |
| 8 | 11 | "os/exec" |
| @@ -120,7 +123,15 @@ func runSSH(t target, serverArgv []string, stdin io.Reader) int { | ||
| 120 | 123 | cmd.Stdin = stdin |
| 121 | 124 | cmd.Stdout = os.Stdout |
| 122 | 125 | cmd.Stderr = os.Stderr |
| 126 | var tw *tabwriter.Writer | |
| 127 | if alignColumns(serverArgv) { | |
| 128 | tw = tabwriter.NewWriter(os.Stdout, 0, 8, 2, ' ', 0) | |
| 129 | cmd.Stdout = tw | |
| 130 | } | |
| 123 | 131 | err := cmd.Run() |
| 132 | if tw != nil { | |
| 133 | tw.Flush() | |
| 134 | } | |
| 124 | 135 | if err == nil { |
| 125 | 136 | return 0 |
| 126 | 137 | } |
| @@ -193,3 +204,33 @@ func withRepo(t target, args []string) ([]string, error) { | ||
| 193 | 204 | } |
| 194 | 205 | return append([]string{t.repo}, args...), nil |
| 195 | 206 | } |
| 207 | ||
| 208 | // listVerbs are the server commands whose plain output is one row per | |
| 209 | // item with tab-separated columns. | |
| 210 | var listVerbs = map[string]bool{ | |
| 211 | "list": true, "runners": true, "deliveries": true, "refs": true, | |
| 212 | "revisions": true, "threads": true, "bookmarks": true, "jobs": true, | |
| 213 | } | |
| 214 | ||
| 215 | // alignColumns reports whether a command's rows should be padded into | |
| 216 | // columns: a list command, printed for a person at a terminal. Piped | |
| 217 | // output keeps the server's tabs so cut and awk see the same bytes stock | |
| 218 | // ssh prints, and --json is never touched. | |
| 219 | func alignColumns(serverArgv []string) bool { | |
| 220 | verb := "" | |
| 221 | for _, a := range serverArgv { | |
| 222 | if strings.HasPrefix(a, "-") { | |
| 223 | break | |
| 224 | } | |
| 225 | if a == "--json" { | |
| 226 | return false | |
| 227 | } | |
| 228 | verb = a | |
| 229 | } | |
| 230 | for _, a := range serverArgv { | |
| 231 | if a == "--json" { | |
| 232 | return false | |
| 233 | } | |
| 234 | } | |
| 235 | return listVerbs[verb] && term.IsTerminal(int(os.Stdout.Fd())) | |
| 236 | } | |