# 65: SHA-256 hex size + "\n" in preparation for git using non-SHA1
use constant {
MAX_INFLIGHT => 512 * 3 / (65 + length('contents ')),
- BATCH_CMD_VER => (2 << 24 | 36 << 16), # git 2.36+
+ BATCH_CMD_VER => v2.36.0, # git 2.36+
};
my %GIT_ESC = (
close($rd) or die "$GIT_EXE --version: $?";
$v =~ /\b([0-9]+(?:\.[0-9]+){2})/ or die
"$GIT_EXE --version output: $v # unparseable";
- my @v = split(/\./, $1, 3);
- $GIT_VER = ($v[0] << 24) | ($v[1] << 16) | $v[2];
+ $GIT_VER = eval("v$1") // die "BUG: bad vstring: $1 ($v)";
$EXE_ST = $st;
}
}
# git 2.31.0+ supports -c core.abbrev=no, don't bother with
# core.abbrev=64 since not many releases had SHA-256 prior to 2.31
- my $abbr = $GIT_VER < (2 << 24 | 31 << 16) ? 40 : 'no';
+ my $abbr = $GIT_VER lt v2.31.0 ? 40 : 'no';
my @cmd = ($GIT_EXE, "--git-dir=$gd", '-c', "core.abbrev=$abbr",
'cat-file', "--$batch");
if ($err) {
sub batch_prepare ($) {
my ($self) = @_;
check_git_exe();
- if ($GIT_VER >= BATCH_CMD_VER) {
+ if ($GIT_VER ge BATCH_CMD_VER) {
_bidi_pipe($self, qw(batch-command in out pid err_c));
$self->{-bc} = 1;
} else {
die 'BUG: already in async check' if $self->{inflight_c};
cleanup($self) if alternates_changed($self);
check_git_exe();
- if ($GIT_VER >= BATCH_CMD_VER) {
+ if ($GIT_VER ge BATCH_CMD_VER) {
_bidi_pipe($self, qw(batch-command in out pid err_c));
$self->{-bc} = 1;
$self->{inflight} = [];
($lei->{opt}->{jobs} // 1) > 1;
push @cmd, '-v' if $lei->{opt}->{verbose};
push(@cmd, '-p') if $lei->{opt}->{prune};
- PublicInbox::Git::version() >= ((2 << 24) | (29 << 16)) and
+ PublicInbox::Git::version() ge v2.29.0 and
push(@cmd, '--no-write-fetch-head');
@cmd;
}
use POSIX qw(dup2);
use IO::Socket::INET;
use File::Spec;
+use Scalar::Util qw(isvstring);
our @EXPORT;
my $lei_loud = $ENV{TEST_LEI_ERR_LOUD};
my $tail_cmd = $ENV{TAIL};
sub require_git ($;$) {
my ($req, $nr) = @_;
- state ($cur_int, $cur_ver);
- $cur_int //= do {
- chomp($cur_ver = xqx([qw(git --version)]));
- my @v = ($cur_ver =~ /version (\d+)\.(\d+)(?:\.(\d+))?/);
- ($v[0] << 24) | ($v[1] << 16) | ($v[2] // 0);
- };
-
- my ($req_maj, $req_min, $req_sub) = split(/\./, $req);
- my $req_int = ($req_maj << 24) | ($req_min << 16) | ($req_sub // 0);
+ require PublicInbox::Git;
+ state $cur_vstr = PublicInbox::Git::version();
+ $req = eval("v$req") unless isvstring($req);
- return 1 if $cur_int >= $req_int;
+ return 1 if $cur_vstr ge $req;
+ state $cur_ver = sprintf('%vd', $cur_vstr);
return plan skip_all => "git $req+ required, have $cur_ver" if !$nr;
defined(wantarray) ? undef :
skip("git $req+ required (have $cur_ver), skipping $nr tests")