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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Tue, 16 Jan 2007, Eric Wong wrote:

> Johannes Schindelin <Johannes.Schindelin@xxxxxx> 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.

> --- 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?


> +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?

> +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;

> +		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?

> +		}
> +		return rv;
> +	}
> +	fputs("Dumping config to '%s' is not yet supported", stderr);
> +	return -1;
> +}

Ciao,
Dscho

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]