git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Teach for-each-ref about a little language called Tcl.

From
Shawn O. Pearce <spearce@spearce.org>
Date
Jan 27, 2007, 07:22 UTC
Message-ID
<20070127072258.GA10512@spearce.org>

Love it or hate it, some people actually still program in Tcl. Some of those programs are meant for interfacing with Git. Programs such as gitk and git-gui. It may be useful to have Tcl-safe output available from for-each-ref, just like shell, Perl and Python already enjoy.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 Documentation/git-for-each-ref.txt |    4 ++--
 builtin-for-each-ref.c             |   10 ++++++++++
 quote.c                            |   16 ++++++++++++++++
 quote.h                            |    1 +
 4 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
index 06e7ab1..da52eba 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -7,7 +7,7 @@ git-for-each-ref - Output information on each ref
 
 SYNOPSIS
 --------
-'git-for-each-ref' [--count=<count>]\* [--shell|--perl|--python] [--sort=<key>]\* [--format=<format>] [<pattern>]
+'git-for-each-ref' [--count=<count>]\* [--shell|--perl|--python|--tcl] [--sort=<key>]\* [--format=<format>] [<pattern>]
 
 DESCRIPTION
 -----------
@@ -49,7 +49,7 @@ OPTIONS
 	using fnmatch(3).  Refs that do not match the pattern
 	are not shown.
 
---shell, --perl, --python::
+--shell, --perl, --python, --tcl::
 	If given, strings that substitute `%(fieldname)`
 	placeholders are quoted as string literals suitable for
 	the specified host language.  This is meant to produce
diff --git a/builtin-for-each-ref.c b/builtin-for-each-ref.c
index af72a12..9d5f266 100644
--- a/builtin-for-each-ref.c
+++ b/builtin-for-each-ref.c
@@ -12,6 +12,7 @@
 #define QUOTE_SHELL 1
 #define QUOTE_PERL 2
 #define QUOTE_PYTHON 3
+#define QUOTE_TCL 4
 
 typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type;
 
@@ -723,6 +724,9 @@ static void print_value(struct refinfo *ref, int atom, int quote_style)
 	case QUOTE_PYTHON:
 		python_quote_print(stdout, v->s);
 		break;
+	case QUOTE_TCL:
+		tcl_quote_print(stdout, v->s);
+		break;
 	}
 }
 
@@ -834,6 +838,12 @@ int cmd_for_each_ref(int ac, const char **av, char *prefix)
 			quote_style = QUOTE_PYTHON;
 			continue;
 		}
+		if (!strcmp(arg, "--tcl") ) {
+			if (0 <= quote_style)
+				die("more than one quoting style?");
+			quote_style = QUOTE_TCL;
+			continue;
+		}
 		if (!strncmp(arg, "--count=", 8)) {
 			if (maxcount)
 				die("more than one --count?");
diff --git a/quote.c b/quote.c
index a418a0f..ab0e971 100644
--- a/quote.c
+++ b/quote.c
@@ -387,3 +387,19 @@ void python_quote_print(FILE *stream, const char *src)
 	}
 	fputc(sq, stream);
 }
+
+void tcl_quote_print(FILE *stream, const char *src)
+{
+	const char lb = '{';
+	const char rb = '}';
+	const char bq = '\\';
+	char c;
+
+	fputc(lb, stream);
+	while ((c = *src++)) {
+		if (c == lb || c == rb || c == bq)
+			fputc(bq, stream);
+		fputc(c, stream);
+	}
+	fputc(rb, stream);
+}
diff --git a/quote.h b/quote.h
index b55e699..bdc3610 100644
--- a/quote.h
+++ b/quote.h
@@ -55,5 +55,6 @@ extern void write_name_quoted(const char *prefix, int prefix_len,
 /* quoting as a string literal for other languages */
 extern void perl_quote_print(FILE *stream, const char *src);
 extern void python_quote_print(FILE *stream, const char *src);
+extern void tcl_quote_print(FILE *stream, const char *src);
 
 #endif
-- 
1.5.0.rc2.g8a816
Next: Sergey Vlasov
Message 1 of 2 in “Teach for-each-ref about a little language called Tcl.”
  1. Teach for-each-ref about a little language called Tcl.Shawn O. Pearce, Jan 27, 2007
  2. Sergey VlasovJan 27, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.