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

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

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jan 16, 2007, 10:47 UTC
Message-ID
<Pine.LNX.4.63.0701161129310.22628@wbgn013.biozentrum.uni-wuerzburg.de>
In-Reply-To
<20070116095150.GA31467@localdomain>
Hi,
On Tue, 16 Jan 2007, Eric Wong wrote:
Show 13 quoted lines
> Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> > 
> > 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.
That's right.
I'd like that code to be simpler, though. Way simpler.
Show 31 quoted lines
> --- 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",
0> +		"\t",
> +		" => [\n", "\t],\n",
> +		"\t\t", ",\n",
> +		"'true'",
> +		perl_quote_print, perl_quote_print },
The two quote members seem to be the same for _all_ three languages.
> +	{ "python",
> +		"git_config = {\n", "}\n",
> +		"    ",

I don't understand why you do not consolidate that into using tabs for _all_ backends?

Show 15 quoted lines
> +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);
> +	}

So this makes _all_ config vars arrays? It is consistent, yes... but it is also ugly, no?

Show 7 quoted lines
> +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;
IMHO this would be much easier to read using a path_list:
	struct path_list_item *item = path_list_lookup(lang_name, &langs);
	if (item == NULL)
		return -1;
	lang = item->util;
Show 7 quoted lines
> +		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);
If the config is empty, no decl_end is printed, right?
Show 6 quoted lines
> +		}
> +		return rv;
> +	}
> +	fputs("Dumping config to '%s' is not yet supported", stderr);
> +	return -1;
> +}

Ciao, Dscho

Previous: Eric WongNext: Eric Wong
Message 53 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.