All you are adding here is escaping quotes? Why not make that the default?

-------- Original message --------
From: Aaron Schrab <aa...@schrab.com> 
Date: 12/08/2013  21:01  (GMT+00:00) 
To: tmux-users@lists.sourceforge.net 
Subject: [PATCH] Support showenv output as shell code 
 
Add -s option to the shown-environment command which will alter the
output format to Bourne shell commands, allowing import of the
environment into current shell with:

eval `tmux showenv -s`
---
cmd-show-environment.c |   59 ++++++++++++++++++++++++++++++++++++++++++++++--
tmux.1                 |    7 +++++-
2 files changed, 63 insertions(+), 3 deletions(-)

diff --git a/cmd-show-environment.c b/cmd-show-environment.c
index ffe98bc..31058af 100644
--- a/cmd-show-environment.c
+++ b/cmd-show-environment.c
@@ -31,14 +31,61 @@ enum cmd_retval cmd_show_environment_exec(struct cmd *, 
struct cmd_q *);

const struct cmd_entry cmd_show_environment_entry = {
"show-environment", "showenv",
-       "gt:", 0, 1,
-       "[-g] " CMD_TARGET_SESSION_USAGE " [name]",
+       "gst:", 0, 1,
+       "[-gs] " CMD_TARGET_SESSION_USAGE " [name]",
0,
NULL,
NULL,
cmd_show_environment_exec
};

+static void
+sh_environment( struct cmd_q *cmdq, struct environ_entry *envent )
+{
+       char    *buf;
+       char    *old;
+       char    *val;
+       size_t  len;
+       size_t  bufsize = 128;
+
+       val = buf = xmalloc(bufsize);
+
+       if (envent->value != NULL) {
+        old = envent->value;
+        *(val++) = '\'';
+        len = 1;
+
+        while (*old) {
+        /* Ensure buffer has enough space
+        * including closing quote and NUL terminator
+        * even if current character needs to be quoted.
+        * 6 = 3(inner quote)+1(current char)+1(final quote)+1(NUL)
+        */
+        if(bufsize < len + 6) {
+        bufsize *= 2;
+        buf = xrealloc(buf, 1, bufsize);
+        val = buf+len;
+        }
+
+        /* Escape single quotes by converting to '\'' */
+        if (*old == '\'') {
+        *(val++) = '\'';
+        *(val++) = '\\';
+        *(val++) = '\'';
+        len += 3;
+        }
+        *(val++) = *(old++);
+        ++len;
+        }
+        *(val++) = '\'';
+       }
+
+       *val = 0;
+       cmdq_print(cmdq, "%s=%s", envent->name, buf);
+
+       free(buf);
+}
+
enum cmd_retval
cmd_show_environment_exec(struct cmd *self, struct cmd_q *cmdq)
{
@@ -61,6 +108,10 @@ cmd_show_environment_exec(struct cmd *self, struct cmd_q 
*cmdq)
cmdq_error(cmdq, "unknown variable: %s", args->argv[0]);
return (CMD_RETURN_ERROR);
}
+        if (args_has(self->args, 's')) {
+        sh_environment( cmdq, envent );
+        return (CMD_RETURN_NORMAL);
+        }
if (envent->value != NULL)
cmdq_print(cmdq, "%s=%s", envent->name, envent->value);
else
@@ -69,6 +120,10 @@ cmd_show_environment_exec(struct cmd *self, struct cmd_q 
*cmdq)
}

RB_FOREACH(envent, environ, env) {
+        if (args_has(self->args, 's')) {
+        sh_environment( cmdq, envent );
+        continue;
+        }
if (envent->value != NULL)
cmdq_print(cmdq, "%s=%s", envent->name, envent->value);
else
diff --git a/tmux.1 b/tmux.1
index ce4b9b8..0b5a557 100644
--- a/tmux.1
+++ b/tmux.1
@@ -3207,7 +3207,7 @@ flag unsets a variable.
indicates the variable is to be removed from the environment before starting a
new process.
.It Xo Ic show-environment
-.Op Fl g
+.Op Fl gs
.Op Fl t Ar target-session
.Op Ar variable
.Xc
@@ -3221,6 +3221,11 @@ If
is omitted, all variables are shown.
Variables removed from the environment are prefixed with
.Ql - .
+If the
+.Fl s
+option is used, the output will be in the form of Bourne shell
+variable assignments allowing it to be imported into the current shell
+using eval.
.El
.Sh STATUS LINE
.Nm
-- 
1.7.10.4


------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users
------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to