Merge branch 'fl/send-email-outside'

* fl/send-email-outside:
  send-email: Don't require to be called in a repository
  Git.pm: Don't require repository instance for ident
  Git.pm: Don't require a repository instance for config
  var: Don't require to be in a git repository.
This commit is contained in:
Junio C Hamano
2008-04-09 00:42:23 -07:00
3 changed files with 32 additions and 36 deletions

View File

@ -168,7 +168,8 @@ my $envelope_sender;
# Example reply to: # Example reply to:
#$initial_reply_to = ''; #<20050203173208.GA23964@foobar.com>'; #$initial_reply_to = ''; #<20050203173208.GA23964@foobar.com>';
my $repo = Git->repository(); my $repo = eval { Git->repository() };
my @repo = $repo ? ($repo) : ();
my $term = eval { my $term = eval {
$ENV{"GIT_SEND_EMAIL_NOTTY"} $ENV{"GIT_SEND_EMAIL_NOTTY"}
? new Term::ReadLine 'git-send-email', \*STDIN, \*STDOUT ? new Term::ReadLine 'git-send-email', \*STDIN, \*STDOUT
@ -271,25 +272,25 @@ sub read_config {
foreach my $setting (keys %config_bool_settings) { foreach my $setting (keys %config_bool_settings) {
my $target = $config_bool_settings{$setting}->[0]; my $target = $config_bool_settings{$setting}->[0];
$$target = $repo->config_bool("$prefix.$setting") unless (defined $$target); $$target = Git::config_bool(@repo, "$prefix.$setting") unless (defined $$target);
} }
foreach my $setting (keys %config_settings) { foreach my $setting (keys %config_settings) {
my $target = $config_settings{$setting}; my $target = $config_settings{$setting};
if (ref($target) eq "ARRAY") { if (ref($target) eq "ARRAY") {
unless (@$target) { unless (@$target) {
my @values = $repo->config("$prefix.$setting"); my @values = Git::config(@repo, "$prefix.$setting");
@$target = @values if (@values && defined $values[0]); @$target = @values if (@values && defined $values[0]);
} }
} }
else { else {
$$target = $repo->config("$prefix.$setting") unless (defined $$target); $$target = Git::config(@repo, "$prefix.$setting") unless (defined $$target);
} }
} }
} }
# read configuration from [sendemail "$identity"], fall back on [sendemail] # read configuration from [sendemail "$identity"], fall back on [sendemail]
$identity = $repo->config("sendemail.identity") unless (defined $identity); $identity = Git::config(@repo, "sendemail.identity") unless (defined $identity);
read_config("sendemail.$identity") if (defined $identity); read_config("sendemail.$identity") if (defined $identity);
read_config("sendemail"); read_config("sendemail");
@ -327,8 +328,9 @@ if (0) {
} }
} }
my ($repoauthor) = $repo->ident_person('author'); my ($repoauthor, $repocommitter);
my ($repocommitter) = $repo->ident_person('committer'); ($repoauthor) = Git::ident_person(@repo, 'author');
($repocommitter) = Git::ident_person(@repo, 'committer');
# Verify the user input # Verify the user input
@ -415,7 +417,7 @@ if (@files) {
my $prompting = 0; my $prompting = 0;
if (!defined $sender) { if (!defined $sender) {
$sender = $repoauthor || $repocommitter; $sender = $repoauthor || $repocommitter || '';
while (1) { while (1) {
$_ = $term->readline("Who should the emails appear to be from? [$sender] "); $_ = $term->readline("Who should the emails appear to be from? [$sender] ");
@ -509,7 +511,7 @@ GIT: for the patch you are writing.
EOT EOT
close(C); close(C);
my $editor = $ENV{GIT_EDITOR} || $repo->config("core.editor") || $ENV{VISUAL} || $ENV{EDITOR} || "vi"; my $editor = $ENV{GIT_EDITOR} || Git::config(@repo, "core.editor") || $ENV{VISUAL} || $ENV{EDITOR} || "vi";
system('sh', '-c', '$0 $@', $editor, $compose_filename); system('sh', '-c', '$0 $@', $editor, $compose_filename);
open(C2,">",$compose_filename . ".final") open(C2,">",$compose_filename . ".final")

View File

@ -487,22 +487,20 @@ does. In scalar context requires the variable to be set only one time
(exception is thrown otherwise), in array context returns allows the (exception is thrown otherwise), in array context returns allows the
variable to be set multiple times and returns all the values. variable to be set multiple times and returns all the values.
Must be called on a repository instance.
This currently wraps command('config') so it is not so fast. This currently wraps command('config') so it is not so fast.
=cut =cut
sub config { sub config {
my ($self, $var) = @_; my ($self, $var) = _maybe_self(@_);
$self->repo_path()
or throw Error::Simple("not a repository");
try { try {
my @cmd = ('config');
unshift @cmd, $self if $self;
if (wantarray) { if (wantarray) {
return $self->command('config', '--get-all', $var); return command(@cmd, '--get-all', $var);
} else { } else {
return $self->command_oneline('config', '--get', $var); return command_oneline(@cmd, '--get', $var);
} }
} catch Git::Error::Command with { } catch Git::Error::Command with {
my $E = shift; my $E = shift;
@ -522,20 +520,17 @@ Retrieve the bool configuration C<VARIABLE>. The return value
is usable as a boolean in perl (and C<undef> if it's not defined, is usable as a boolean in perl (and C<undef> if it's not defined,
of course). of course).
Must be called on a repository instance.
This currently wraps command('config') so it is not so fast. This currently wraps command('config') so it is not so fast.
=cut =cut
sub config_bool { sub config_bool {
my ($self, $var) = @_; my ($self, $var) = _maybe_self(@_);
$self->repo_path()
or throw Error::Simple("not a repository");
try { try {
my $val = $self->command_oneline('config', '--bool', '--get', my @cmd = ('config', '--bool', '--get', $var);
$var); unshift @cmd, $self if $self;
my $val = command_oneline(@cmd);
return undef unless defined $val; return undef unless defined $val;
return $val eq 'true'; return $val eq 'true';
} catch Git::Error::Command with { } catch Git::Error::Command with {
@ -557,19 +552,17 @@ 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. by 1024, 1048576 (1024^2), or 1073741824 (1024^3) prior to output.
It would return C<undef> if configuration variable is not defined, It would return C<undef> if configuration variable is not defined,
Must be called on a repository instance.
This currently wraps command('config') so it is not so fast. This currently wraps command('config') so it is not so fast.
=cut =cut
sub config_int { sub config_int {
my ($self, $var) = @_; my ($self, $var) = _maybe_self(@_);
$self->repo_path()
or throw Error::Simple("not a repository");
try { try {
return $self->command_oneline('config', '--int', '--get', $var); my @cmd = ('config', '--int', '--get', $var);
unshift @cmd, $self if $self;
return command_oneline(@cmd);
} catch Git::Error::Command with { } catch Git::Error::Command with {
my $E = shift; my $E = shift;
if ($E->value() == 1) { if ($E->value() == 1) {
@ -639,15 +632,15 @@ The synopsis is like:
"$name <$email>" eq ident_person($name); "$name <$email>" eq ident_person($name);
$time_tz =~ /^\d+ [+-]\d{4}$/; $time_tz =~ /^\d+ [+-]\d{4}$/;
Both methods must be called on a repository instance.
=cut =cut
sub ident { sub ident {
my ($self, $type) = @_; my ($self, $type) = _maybe_self(@_);
my $identstr; my $identstr;
if (lc $type eq lc 'committer' or lc $type eq lc 'author') { if (lc $type eq lc 'committer' or lc $type eq lc 'author') {
$identstr = $self->command_oneline('var', 'GIT_'.uc($type).'_IDENT'); my @cmd = ('var', 'GIT_'.uc($type).'_IDENT');
unshift @cmd, $self if $self;
$identstr = command_oneline(@cmd);
} else { } else {
$identstr = $type; $identstr = $type;
} }
@ -659,8 +652,8 @@ sub ident {
} }
sub ident_person { sub ident_person {
my ($self, @ident) = @_; my ($self, @ident) = _maybe_self(@_);
$#ident == 0 and @ident = $self->ident($ident[0]); $#ident == 0 and @ident = $self ? $self->ident($ident[0]) : ident($ident[0]);
return "$ident[0] <$ident[1]>"; return "$ident[0] <$ident[1]>";
} }

3
var.c
View File

@ -51,11 +51,12 @@ static int show_config(const char *var, const char *value)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
const char *val; const char *val;
int nongit;
if (argc != 2) { if (argc != 2) {
usage(var_usage); usage(var_usage);
} }
setup_git_directory(); setup_git_directory_gently(&nongit);
val = NULL; val = NULL;
if (strcmp(argv[1], "-l") == 0) { if (strcmp(argv[1], "-l") == 0) {