perl: lazily load some common Git.pm setup code
Instead of unconditionally requiring modules such as File::Spec, let's only load them when needed. This speeds up code that only needs a subset of the features Git.pm provides. This brings a plain invocation of "git send-email" down from 52/37 loaded modules under NO_GETTEXT=[|Y] to 39/18, and it now takes ~60-~70ms instead of ~80-~90ms. The runtime of t9001-send-email.sh test is down to ~13s from ~15s. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
f4dc9432fd
commit
5a544a4e11
32
perl/Git.pm
32
perl/Git.pm
@ -11,9 +11,6 @@ use 5.008;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
|
use warnings $ENV{GIT_PERL_FATAL_WARNINGS} ? qw(FATAL all) : ();
|
||||||
|
|
||||||
use File::Temp ();
|
|
||||||
use File::Spec ();
|
|
||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
|
|
||||||
our ($VERSION, @ISA, @EXPORT, @EXPORT_OK);
|
our ($VERSION, @ISA, @EXPORT, @EXPORT_OK);
|
||||||
@ -103,12 +100,9 @@ increase notwithstanding).
|
|||||||
=cut
|
=cut
|
||||||
|
|
||||||
|
|
||||||
use Carp qw(carp croak); # but croak is bad - throw instead
|
sub carp { require Carp; goto &Carp::carp }
|
||||||
|
sub croak { require Carp; goto &Carp::croak }
|
||||||
use Git::LoadCPAN::Error qw(:try);
|
use Git::LoadCPAN::Error qw(:try);
|
||||||
use Cwd qw(abs_path cwd);
|
|
||||||
use IPC::Open2 qw(open2);
|
|
||||||
use Fcntl qw(SEEK_SET SEEK_CUR);
|
|
||||||
use Time::Local qw(timegm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -191,13 +185,15 @@ sub repository {
|
|||||||
$dir = undef;
|
$dir = undef;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
require Cwd;
|
||||||
if ($dir) {
|
if ($dir) {
|
||||||
|
require File::Spec;
|
||||||
File::Spec->file_name_is_absolute($dir) or $dir = $opts{Directory} . '/' . $dir;
|
File::Spec->file_name_is_absolute($dir) or $dir = $opts{Directory} . '/' . $dir;
|
||||||
$opts{Repository} = abs_path($dir);
|
$opts{Repository} = Cwd::abs_path($dir);
|
||||||
|
|
||||||
# If --git-dir went ok, this shouldn't die either.
|
# If --git-dir went ok, this shouldn't die either.
|
||||||
my $prefix = $search->command_oneline('rev-parse', '--show-prefix');
|
my $prefix = $search->command_oneline('rev-parse', '--show-prefix');
|
||||||
$dir = abs_path($opts{Directory}) . '/';
|
$dir = Cwd::abs_path($opts{Directory}) . '/';
|
||||||
if ($prefix) {
|
if ($prefix) {
|
||||||
if (substr($dir, -length($prefix)) ne $prefix) {
|
if (substr($dir, -length($prefix)) ne $prefix) {
|
||||||
throw Error::Simple("rev-parse confused me - $dir does not have trailing $prefix");
|
throw Error::Simple("rev-parse confused me - $dir does not have trailing $prefix");
|
||||||
@ -223,7 +219,7 @@ sub repository {
|
|||||||
throw Error::Simple("fatal: Not a git repository: $dir");
|
throw Error::Simple("fatal: Not a git repository: $dir");
|
||||||
}
|
}
|
||||||
|
|
||||||
$opts{Repository} = abs_path($dir);
|
$opts{Repository} = Cwd::abs_path($dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete $opts{Directory};
|
delete $opts{Directory};
|
||||||
@ -408,10 +404,12 @@ sub command_bidi_pipe {
|
|||||||
my $cwd_save = undef;
|
my $cwd_save = undef;
|
||||||
if ($self) {
|
if ($self) {
|
||||||
shift;
|
shift;
|
||||||
$cwd_save = cwd();
|
require Cwd;
|
||||||
|
$cwd_save = Cwd::cwd();
|
||||||
_setup_git_cmd_env($self);
|
_setup_git_cmd_env($self);
|
||||||
}
|
}
|
||||||
$pid = open2($in, $out, 'git', @_);
|
require IPC::Open2;
|
||||||
|
$pid = IPC::Open2::open2($in, $out, 'git', @_);
|
||||||
chdir($cwd_save) if $cwd_save;
|
chdir($cwd_save) if $cwd_save;
|
||||||
return ($pid, $in, $out, join(' ', @_));
|
return ($pid, $in, $out, join(' ', @_));
|
||||||
}
|
}
|
||||||
@ -538,7 +536,8 @@ sub get_tz_offset {
|
|||||||
my $t = shift || time;
|
my $t = shift || time;
|
||||||
my @t = localtime($t);
|
my @t = localtime($t);
|
||||||
$t[5] += 1900;
|
$t[5] += 1900;
|
||||||
my $gm = timegm(@t);
|
require Time::Local;
|
||||||
|
my $gm = Time::Local::timegm(@t);
|
||||||
my $sign = qw( + + - )[ $gm <=> $t ];
|
my $sign = qw( + + - )[ $gm <=> $t ];
|
||||||
return sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]);
|
return sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]);
|
||||||
}
|
}
|
||||||
@ -1340,6 +1339,7 @@ sub _temp_cache {
|
|||||||
my $n = $name;
|
my $n = $name;
|
||||||
$n =~ s/\W/_/g; # no strange chars
|
$n =~ s/\W/_/g; # no strange chars
|
||||||
|
|
||||||
|
require File::Temp;
|
||||||
($$temp_fd, $fname) = File::Temp::tempfile(
|
($$temp_fd, $fname) = File::Temp::tempfile(
|
||||||
"Git_${n}_XXXXXX", UNLINK => 1, DIR => $tmpdir,
|
"Git_${n}_XXXXXX", UNLINK => 1, DIR => $tmpdir,
|
||||||
) or throw Error::Simple("couldn't open new temp file");
|
) or throw Error::Simple("couldn't open new temp file");
|
||||||
@ -1362,9 +1362,9 @@ sub temp_reset {
|
|||||||
|
|
||||||
truncate $temp_fd, 0
|
truncate $temp_fd, 0
|
||||||
or throw Error::Simple("couldn't truncate file");
|
or throw Error::Simple("couldn't truncate file");
|
||||||
sysseek($temp_fd, 0, SEEK_SET) and seek($temp_fd, 0, SEEK_SET)
|
sysseek($temp_fd, 0, Fcntl::SEEK_SET()) and seek($temp_fd, 0, Fcntl::SEEK_SET())
|
||||||
or throw Error::Simple("couldn't seek to beginning of file");
|
or throw Error::Simple("couldn't seek to beginning of file");
|
||||||
sysseek($temp_fd, 0, SEEK_CUR) == 0 and tell($temp_fd) == 0
|
sysseek($temp_fd, 0, Fcntl::SEEK_CUR()) == 0 and tell($temp_fd) == 0
|
||||||
or throw Error::Simple("expected file position to be reset");
|
or throw Error::Simple("expected file position to be reset");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user