All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Narebski <jnareb@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Cord Seele <cowose@googlemail.com>,
	Matthieu Moy <Matthieu.Moy@grenoble-inp.fr>,
	git@vger.kernel.org, Eric Wong <normalperson@yhbt.net>,
	Cord Seele <cowose@gmail.com>
Subject: Re: [PATCH 2/2] use new Git::config_path() for aliasesfile
Date: Sat, 1 Oct 2011 00:00:11 +0200	[thread overview]
Message-ID: <201110010000.13328.jnareb@gmail.com> (raw)
In-Reply-To: <7vsjndoldq.fsf@alter.siamese.dyndns.org>

On Fri, 30 Sep 2011, Junio C Hamano wrote:

> I think the addition of "config --path" support is a good idea, but the
> resulting code suffers from too many cut&paste cruft across the config*
> family of methods.
> 
> How about doing a bit of refactoring, perhaps something like this, on top
> as a separate patch?

This is a good idea, in my opinion.
 
> I tried to be careful to still forcing the "one value only" for config_bool
> and config_int, but extra sets of eyeballs would be needed.

We do have tests for that, have we?
 
[...]
> +Common subroutine to implement bulk of what the config* family of methods
> +do. This wraps command('config') so it is not so fast.

BTW. I wonder if it wouldn't be a good idea to restart work on Git::Config
with lazy/eager loading of the whole config, like git_get_project_config()
and git_parse_project_config() subroutines from gitweb do it - running 
"git config -z -l".  Though then --int/--bool/--path conversion would have
to be implemented in Perl...
  
>  =cut
>  
> -sub config {
> -	my ($self, $var) = _maybe_self(@_);
> -
> +sub _config_common {
> +	my ($self, $var, $opts) = _maybe_self(@_);
> +	
>  	try {
> -		my @cmd = ('config');
> +		my @cmd = ('config', $opts->{'kind'} ? @{$opts->{'kind'}} : ());

How it is supposed to work?

First, you probably want to check for "exists $opts->{'kind'}", or even
"defined $opts->{'kind'}".

Second, "@{$opts->{'kind'}}" assumes that $opts->{'kind'} is an array
reference (something we didn't check)... and it isn't.


BTW. why do you use hashref?  Do you plan for the future to pass more
options that 'kind'?

>  		unshift @cmd, $self if $self;
>  		if (wantarray) {
>  			return command(@cmd, '--get-all', $var);
> @@ -594,6 +590,21 @@ sub config {
>  			throw $E;
>  		}
>  	};
> +
> +}
> +
> +=item config ( VARIABLE )
> +
> +Retrieve the configuration C<VARIABLE> in the same manner as C<config>
> +does. In scalar context requires the variable to be set only one time
> +(exception is thrown otherwise), in array context returns allows the
> +variable to be set multiple times and returns all the values.
> +
> +=cut
> +
> +sub config {
> +	my ($self, $var) = _maybe_self(@_);
> +	return _config_common($self, $var, +{});

No need to pass an empty hash.  Perl has a feature called autovivification:
when an undefined variable is dereferenced, it gets silently upgraded to
an array or hash reference (depending of the type of the dereferencing).

It is un-Perlish to do so.

>  sub config_bool {
>  	my ($self, $var) = _maybe_self(@_);
[...]
> +	my $val = scalar _config_common($self, $var, {'kind' => '--bool'});
> +	return (defined $val && $val eq 'true');
>  }
[...]

>  sub config_path {
>  	my ($self, $var) = _maybe_self(@_);
[...]
> +	return _config_common($self, $var, +{'kind' => '--path'});
>  }

Why the difference between {'kind' => '--bool'} and +{'kind' => '--path'}?

> -This currently wraps command('config') so it is not so fast.
> -

Shouldn't this be mentioned somewhat, even indirectly?

-- 
Jakub Narebski
Poland

  parent reply	other threads:[~2011-09-30 22:00 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-28 13:13 [PATCH] git-send-email.perl: expand filename of aliasesfile Cord Seele
2011-09-28 13:42 ` Matthieu Moy
2011-09-28 14:40   ` Cord Seele
2011-09-28 14:47     ` Matthieu Moy
2011-09-30 10:52       ` [PATCH v2] git-send-email: allow filename expansion Cord Seele
2011-09-30 10:52         ` [PATCH 1/2] Add Git::config_path() Cord Seele
2011-10-07 20:32           ` Jakub Narebski
2011-10-07 21:35             ` Junio C Hamano
2011-10-07 21:44               ` Jakub Narebski
2011-10-07 22:26                 ` Junio C Hamano
2011-09-30 10:52         ` [PATCH 2/2] use new Git::config_path() for aliasesfile Cord Seele
2011-09-30 19:55           ` Junio C Hamano
2011-09-30 21:16             ` Cord Seele
2011-09-30 22:00             ` Jakub Narebski [this message]
2011-09-30 22:18               ` Junio C Hamano
2011-10-07 21:17                 ` [PATCH/RFC 3/2] Refactor Git::config_* Jakub Narebski
2011-10-17 20:50                   ` Junio C Hamano
2011-10-17 21:47                     ` Jakub Narebski
2011-10-17 23:25                       ` Junio C Hamano
2011-10-18  9:47                       ` [PATCH/RFC 3/2 (fixed)] " Jakub Narebski
2011-10-18 19:52                         ` Junio C Hamano
2011-10-18 22:09                           ` [PATCH/RFC 3/2 v3] " Jakub Narebski
2011-10-18 23:25                             ` Junio C Hamano
2011-10-19  0:19                               ` Jakub Narebski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201110010000.13328.jnareb@gmail.com \
    --to=jnareb@gmail.com \
    --cc=Matthieu.Moy@grenoble-inp.fr \
    --cc=cowose@gmail.com \
    --cc=cowose@googlemail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=normalperson@yhbt.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.