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

Re: [RFC] Git config file reader in Perl (WIP)

From
EWEric Wong <normalperson@yhbt.net>
Date
Jan 16, 2007, 09:51 UTC
Message-ID
<20070116095150.GA31467@localdomain>
In-Reply-To
<Pine.LNX.4.63.0701151313050.22628@wbgn013.biozentrum.uni-wuerzburg.de>
Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
Show 11 quoted lines
> Hi,
> 
> On Mon, 15 Jan 2007, Eric Wong wrote:
> 
> > > Would you write "git repo-config --perl", then? ;-)
> > 
> > The below patch should be a start (only tested on my fairly standard 
> > .git/config).  A --python option should be easy, too :)
> 
> A bit shorter (and gets the booleans right, plus being even easier 
> towards --python extension):
Your version doesn't get arrays right, however.

Here's a Perl/Python/Ruby version below. It should be extendable for other languages; feedback and additions appreciated:

Note that usage has been changed to --dump=(perl|python|ruby)

I may add key_suffix to lang_dump just to be consistent with pairings, but array_start seems to handle all cases of it and it would be redundant...

--- a/builtin-repo-config.c
+++ b/builtin-repo-config.c
@@ -1,5 +1,6 @@
 #include "builtin.h"
 #include "cache.h"
+#include "quote.h"
 
 static const char git_config_set_usage[] =
 "git-repo-config [ --global ] [ --bool | --int ] [--get | --get-all | --get-regexp | --replace-all | --add | --unset | --unset-all] name [value [value_regex]] | --rename-section old_name new_name | --list";
@@ -14,6 +15,90 @@ static int do_not_match;
 static int seen;
 static enum { T_RAW, T_INT, T_BOOL } type = T_RAW;
 
+struct lang_dump {
+	const char *name;
+	const char *decl_start;
+	const char *decl_end;
+	const char *key_prefix;
+	const char *array_start;
+	const char *array_end;
+	const char *val_prefix;
+	const char *val_suffix;
+	const char *true_val; /* should already be quoted, if needed */
+	void (*quote_key_fn)(FILE *, const char*);
+	void (*quote_val_fn)(FILE *, const char*);
+};
+static char *last_key;
+static struct lang_dump *lang;
+static struct lang_dump lang_dump_defs[] = {
+	{ "perl",
+		"\%git_config = (\n", ");\n",
+		"\t",
+		" => [\n", "\t],\n",
+		"\t\t", ",\n",
+		"'true'",
+		perl_quote_print, perl_quote_print },
+	{ "python",
+		"git_config = {\n", "}\n",
+		"    ",
+		" : [\n", "    ],\n",
+		"        ", ",\n",
+		"True",
+		python_quote_print, python_quote_print },
+	{ "ruby", /* Ruby is very Perl-like */
+		"git_config = {\n", "}\n",
+		"  ",
+		" => [\n", "  ],\n",
+		"    ", ",\n",
+		"true",
+		perl_quote_print, perl_quote_print },
+};
+
+static int show_lang_config(const char *key_, const char *value_)
+{
+	if (last_key) {
+		if (strcmp(last_key, key_)) {
+			free(last_key);
+			fputs(lang->array_end, stdout);
+			goto new_key;
+		}
+	} else {
+new_key:
+		last_key = xstrdup(key_);
+		fputs(lang->key_prefix, stdout);
+		lang->quote_key_fn(stdout, key_);
+		fputs(lang->array_start, stdout);
+	}
+	fputs(lang->val_prefix, stdout);
+	if (value_)
+		lang->quote_val_fn(stdout, value_);
+	else
+		fputs(lang->true_val, stdout);
+	fputs(lang->val_suffix, stdout);
+	return 0;
+}
+
+static int show_lang_config_all(const char *lang_name)
+{
+	int i, rv;
+	for (i = ARRAY_SIZE(lang_dump_defs); --i >= 0; ) {
+		if (strcmp(lang_name, lang_dump_defs[i].name))
+			continue;
+		lang = lang_dump_defs + i;
+		fputs(lang->decl_start, stdout);
+		rv = git_config(show_lang_config);
+		if (last_key) {
+			free(last_key);
+			last_key = NULL;
+			fputs(lang->array_end, stdout);
+			fputs(lang->decl_end, stdout);
+		}
+		return rv;
+	}
+	fputs("Dumping config to '%s' is not yet supported", stderr);
+	return -1;
+}
+
 static int show_all_config(const char *key_, const char *value_)
 {
 	if (value_)
@@ -138,6 +223,8 @@ int cmd_repo_config(int argc, const char **argv, const char *prefix)
 			type = T_BOOL;
 		else if (!strcmp(argv[1], "--list") || !strcmp(argv[1], "-l"))
 			return git_config(show_all_config);
+		else if (!strncmp(argv[1], "--dump=", 7))
+			return show_lang_config_all(argv[1] + 7);
 		else if (!strcmp(argv[1], "--global")) {
 			char *home = getenv("HOME");
 			if (home) {
-- 
Eric Wong
Previous: Eric WongNext: Johannes Schindelin
Message 52 of 54 in “[RFC] Git config file reader in Perl (WIP)”
  1. Jakub NarebskiJan 15, 2007
  2. Eric WongJan 15, 2007
  3. Jakub NarebskiJan 15, 2007
  4. Eric WongJan 15, 2007
  5. Shawn O. PearceJan 15, 2007
  6. Jakub NarebskiJan 15, 2007
  7. Eric WongJan 15, 2007
  8. Johannes SchindelinJan 15, 2007
  9. Nikolai WeibullJan 15, 2007
  10. Johannes SchindelinJan 15, 2007
  11. Nikolai WeibullJan 15, 2007
  12. Jakub NarebskiJan 15, 2007
  13. Junio C HamanoJan 16, 2007
  14. Johannes SchindelinJan 16, 2007
  15. Jakub NarebskiJan 16, 2007
  16. Nikolai WeibullJan 16, 2007
  17. Jakub NarebskiJan 16, 2007
  18. Johannes SchindelinJan 16, 2007
  19. Jakub NarebskiJan 16, 2007
  20. Johannes SchindelinJan 17, 2007
  21. Jakub NarebskiJan 17, 2007
  22. Johannes SchindelinJan 17, 2007
  23. Jakub NarebskiJan 17, 2007
  24. Johannes SchindelinJan 17, 2007
  25. Jakub NarebskiJan 17, 2007
  26. Jakub NarebskiJan 19, 2007
  27. Jakub NarebskiJan 19, 2007
  28. Johannes SchindelinJan 19, 2007
  29. Jakub NarebskiJan 19, 2007
  30. Johannes SchindelinJan 20, 2007
  31. Jakub NarebskiJan 20, 2007
  32. Junio C HamanoJan 20, 2007
  33. config_set_multivar(): disallow newlines in keysJohannes Schindelin, Jan 20, 2007
  34. Junio C HamanoJan 20, 2007
  35. Alex RiesenJan 22, 2007
  36. Johannes SchindelinJan 22, 2007
  37. Alex RiesenJan 22, 2007
  38. Johannes SchindelinJan 22, 2007
  39. Alex RiesenJan 22, 2007
  40. Johannes SchindelinJan 23, 2007
  41. Alex RiesenJan 23, 2007
  42. Documentation/config.txt: Document config file syntax betterJakub Narebski, Jan 20, 2007
  43. Documentation/config.txt: Document config file syntax betterJakub Narebski, Jan 22, 2007
  44. 2/1 Documentation/config.txt: Correct info about subsection nameJakub Narebski, Jan 24, 2007
  45. Johannes SchindelinJan 16, 2007
  46. Nikolai WeibullJan 17, 2007
  47. Jakub NarebskiJan 17, 2007
  48. Nikolai WeibullJan 17, 2007
  49. Jakub NarebskiJan 17, 2007
  50. Johannes SchindelinJan 18, 2007
  51. Eric WongJan 16, 2007
  52. Eric WongJan 16, 2007
  53. Johannes SchindelinJan 16, 2007
  54. Eric WongJan 16, 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.