Skip to content

Commit

Permalink
Merge branch 'jn/libperl-git-config'
Browse files Browse the repository at this point in the history
* jn/libperl-git-config:
  Add simple test for Git::config_path() in t/t9700-perl-git.sh
  libperl-git: refactor Git::config_*
  • Loading branch information
Junio C Hamano committed Oct 26, 2011
2 parents aface4c + cb9c9df commit 3b6a5d2
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 65 deletions.
88 changes: 24 additions & 64 deletions perl/Git.pm
Original file line number Diff line number Diff line change
Expand Up @@ -570,30 +570,10 @@ 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.
This currently wraps command('config') so it is not so fast.
=cut

sub config {
my ($self, $var) = _maybe_self(@_);

try {
my @cmd = ('config');
unshift @cmd, $self if $self;
if (wantarray) {
return command(@cmd, '--get-all', $var);
} else {
return command_oneline(@cmd, '--get', $var);
}
} catch Git::Error::Command with {
my $E = shift;
if ($E->value() == 1) {
# Key not found.
return;
} else {
throw $E;
}
};
return _config_common({}, @_);
}


Expand All @@ -603,28 +583,18 @@ Retrieve the bool configuration C<VARIABLE>. The return value
is usable as a boolean in perl (and C<undef> if it's not defined,
of course).
This currently wraps command('config') so it is not so fast.
=cut

sub config_bool {
my ($self, $var) = _maybe_self(@_);
my $val = scalar _config_common({'kind' => '--bool'}, @_);

try {
my @cmd = ('config', '--bool', '--get', $var);
unshift @cmd, $self if $self;
my $val = command_oneline(@cmd);
return undef unless defined $val;
# Do not rewrite this as return (defined $val && $val eq 'true')
# as some callers do care what kind of falsehood they receive.
if (!defined $val) {
return undef;
} else {
return $val eq 'true';
} catch Git::Error::Command with {
my $E = shift;
if ($E->value() == 1) {
# Key not found.
return undef;
} else {
throw $E;
}
};
}
}


Expand All @@ -633,32 +603,13 @@ sub config_bool {
Retrieve the path configuration C<VARIABLE>. The return value
is an expanded path or C<undef> if it's not defined.
This currently wraps command('config') so it is not so fast.
=cut

sub config_path {
my ($self, $var) = _maybe_self(@_);

try {
my @cmd = ('config', '--path');
unshift @cmd, $self if $self;
if (wantarray) {
return command(@cmd, '--get-all', $var);
} else {
return command_oneline(@cmd, '--get', $var);
}
} catch Git::Error::Command with {
my $E = shift;
if ($E->value() == 1) {
# Key not found.
return undef;
} else {
throw $E;
}
};
return _config_common({'kind' => '--path'}, @_);
}


=item config_int ( VARIABLE )
Retrieve the integer configuration C<VARIABLE>. The return value
Expand All @@ -667,22 +618,31 @@ or 'g' in the config file will cause the value to be multiplied
by 1024, 1048576 (1024^2), or 1073741824 (1024^3) prior to output.
It would return C<undef> if configuration variable is not defined,
This currently wraps command('config') so it is not so fast.
=cut

sub config_int {
return scalar _config_common({'kind' => '--int'}, @_);
}

# Common subroutine to implement bulk of what the config* family of methods
# do. This curently wraps command('config') so it is not so fast.
sub _config_common {
my ($opts) = shift @_;
my ($self, $var) = _maybe_self(@_);

try {
my @cmd = ('config', '--int', '--get', $var);
my @cmd = ('config', $opts->{'kind'} ? $opts->{'kind'} : ());
unshift @cmd, $self if $self;
return command_oneline(@cmd);
if (wantarray) {
return command(@cmd, '--get-all', $var);
} else {
return command_oneline(@cmd, '--get', $var);
}
} catch Git::Error::Command with {
my $E = shift;
if ($E->value() == 1) {
# Key not found.
return undef;
return;
} else {
throw $E;
}
Expand Down
6 changes: 5 additions & 1 deletion t/t9700-perl-git.sh
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,11 @@ test_expect_success \
git config --add test.booltrue true &&
git config --add test.boolfalse no &&
git config --add test.boolother other &&
git config --add test.int 2k
git config --add test.int 2k &&
git config --add test.path "~/foo" &&
git config --add test.pathexpanded "$HOME/foo" &&
git config --add test.pathmulti foo &&
git config --add test.pathmulti bar
'

# The external test will outputs its own plan
Expand Down
4 changes: 4 additions & 0 deletions t/t9700/test.pl
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ BEGIN
is($r->config_int("test.nonexistent"), undef, "config_int: nonexistent");
ok($r->config_bool("test.booltrue"), "config_bool: true");
ok(!$r->config_bool("test.boolfalse"), "config_bool: false");
is($r->config_path("test.path"), $r->config("test.pathexpanded"),
"config_path: ~/foo expansion");
is_deeply([$r->config_path("test.pathmulti")], ["foo", "bar"],
"config_path: multiple values");
our $ansi_green = "\x1b[32m";
is($r->get_color("color.test.slot1", "red"), $ansi_green, "get_color");
# Cannot test $r->get_colorbool("color.foo")) because we do not
Expand Down

0 comments on commit 3b6a5d2

Please sign in to comment.