From 66ca881f9b313a2db741e76a455d7d890489ec7b Mon Sep 17 00:00:00 2001 From: sawka Date: Fri, 22 Nov 2024 12:52:44 -0800 Subject: [PATCH] fix newlines with wsh getvar. output a newline when running in a tty, and don't output a newline when running out of a tty. add options -n and -N to override that behavior --- cmd/wsh/cmd/wshcmd-getvar.go | 21 ++++++++++++++++++++- cmd/wsh/cmd/wshcmd-root.go | 7 +++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/cmd/wsh/cmd/wshcmd-getvar.go b/cmd/wsh/cmd/wshcmd-getvar.go index 36740704cc..dfbb428b88 100644 --- a/cmd/wsh/cmd/wshcmd-getvar.go +++ b/cmd/wsh/cmd/wshcmd-getvar.go @@ -30,6 +30,8 @@ var ( getVarAllVars bool getVarNullTerminate bool getVarLocal bool + getVarFlagNL bool + getVarFlagNoNL bool ) func init() { @@ -38,6 +40,19 @@ func init() { getVarCmd.Flags().BoolVar(&getVarAllVars, "all", false, "get all variables") getVarCmd.Flags().BoolVarP(&getVarNullTerminate, "null", "0", false, "use null terminators in output") getVarCmd.Flags().BoolVarP(&getVarLocal, "local", "l", false, "get variables local to block") + getVarCmd.Flags().BoolVarP(&getVarFlagNL, "newline", "n", false, "print newline after output") + getVarCmd.Flags().BoolVarP(&getVarFlagNoNL, "no-newline", "N", false, "do not print newline after output") +} + +func shouldPrintNewline() bool { + isTty := getIsTty() + if getVarFlagNL { + return true + } + if getVarFlagNoNL { + return false + } + return isTty } func getVarRun(cmd *cobra.Command, args []string) error { @@ -87,7 +102,11 @@ func getVarRun(cmd *cobra.Command, args []string) error { return nil } - WriteStdout("%s\n", resp.Val) + WriteStdout("%s", resp.Val) + if shouldPrintNewline() { + WriteStdout("\n") + } + return nil } diff --git a/cmd/wsh/cmd/wshcmd-root.go b/cmd/wsh/cmd/wshcmd-root.go index 8ba14b556c..eaa56111c7 100644 --- a/cmd/wsh/cmd/wshcmd-root.go +++ b/cmd/wsh/cmd/wshcmd-root.go @@ -57,6 +57,13 @@ func preRunSetupRpcClient(cmd *cobra.Command, args []string) error { return nil } +func getIsTty() bool { + if fileInfo, _ := os.Stdout.Stat(); (fileInfo.Mode() & os.ModeCharDevice) != 0 { + return true + } + return false +} + type RunEFnType = func(*cobra.Command, []string) error func activityWrap(activityStr string, origRunE RunEFnType) RunEFnType {