use File::Path ();
use File::Spec ();
use List::Util qw(max);
-use PublicInbox::SHA qw(sha256_hex);
+use PublicInbox::SHA qw(sha256_hex sha_all);
use PublicInbox::Search qw(xap_terms);
use PublicInbox::SearchIdx qw(add_val);
use PublicInbox::Config qw(glob2re rel2abs_collapsed);
my (undef, $self, $git, $prep_repo) = @_;
my $refs = $git->{-repo}->{refs} // die 'BUG: no {-repo}->{refs}';
sysseek($refs, 0, SEEK_SET);
- my $buf;
- my $dig = PublicInbox::SHA->new(256);
- while (sysread($refs, $buf, 65536)) { $dig->add($buf) }
- $git->{-repo}->{fp} = $dig->hexdigest;
+ $git->{-repo}->{fp} = sha_all(256, $refs)->hexdigest;
}
sub ct_start ($$$) {
use PublicInbox::LEI;
use PublicInbox::LeiCurl;
use PublicInbox::LeiMirror;
+use PublicInbox::SHA qw(sha_all);
use File::Temp ();
sub new { bless {}, __PACKAGE__ }
sub get_fingerprint2 {
my ($git_dir) = @_;
- require PublicInbox::SHA;
my $rd = popen_rd([qw(git show-ref)], undef, { -C => $git_dir });
- PublicInbox::SHA::sha256(do { local $/; <$rd> });
+ sha_all(256, $rd)->digest; # ignore show-ref errors
}
sub writable_dir ($) {
use PublicInbox::Tmpfile;
use IO::Poll qw(POLLIN);
use Carp qw(croak carp);
-use PublicInbox::SHA ();
+use PublicInbox::SHA qw(sha_all);
our %HEXLEN2SHA = (40 => 1, 64 => 256);
our %OFMT2HEXLEN = (sha1 => 40, sha256 => 64);
our @EXPORT_OK = qw(git_unquote git_quote %HEXLEN2SHA %OFMT2HEXLEN read_all);
$ent->{reference} = $buf;
}
}
- my $dig = PublicInbox::SHA->new(1);
- while (CORE::read($sr, $buf, 65536)) { $dig->add($buf) }
+ $ent->{fingerprint} = sha_all(1, $sr)->hexdigest;
CORE::close $sr or return; # empty, uninitialized git repo
- $ent->{fingerprint} = $dig->hexdigest;
$ent->{modified} = modified(undef, $mod);
chomp($buf = <$own> // '');
utf8::decode($buf);
use PublicInbox::Git qw(read_all);
use PublicInbox::LeiCurl;
use PublicInbox::OnDestroy;
-use PublicInbox::SHA qw(sha256_hex sha1_hex);
+use PublicInbox::SHA qw(sha256_hex sha_all);
use POSIX qw(strftime);
-use autodie qw(chdir chmod close open pipe readlink seek symlink sysopen
- truncate unlink);
+use autodie qw(chdir chmod close open pipe readlink
+ seek symlink sysopen sysseek truncate unlink);
our $LIVE; # pid => callback
our $FGRP_TODO; # objstore -> [[ to resume ], [ to clone ]]
}
return if !keep_going($self);
my $fh = delete $self->{-show_ref} // die 'BUG: no show-ref output';
- seek($fh, SEEK_SET, 0);
+ sysseek($fh, SEEK_SET, 0);
$self->{-ent} // die 'BUG: no -ent';
my $A = $self->{-ent}->{fingerprint} // die 'BUG: no fingerprint';
- my $B = sha1_hex(read_all($fh));
+ my $B = sha_all(1, $fh)->hexdigest;
return $cb->($self, @arg) if $A ne $B;
$self->{lei}->qerr("# $self->{-key} up-to-date");
}
my ($self) = @_;
return if !keep_going($self);
my $fh = delete $self->{-show_ref_up} // die 'BUG: no show-ref output';
- seek($fh, SEEK_SET, 0);
+ sysseek($fh, SEEK_SET, 0);
$self->{-ent} // die 'BUG: no -ent';
my $A = $self->{-ent}->{fingerprint} // die 'BUG: no fingerprint';
- my $B = sha1_hex(read_all($fh));
+ my $B = sha_all(1, $fh)->hexdigest;
return if $A eq $B;
$self->{-ent}->{fingerprint} = $B;
push @{$self->{chg}->{fp_mismatch}}, $self->{-key};
package PublicInbox::SHA;
use v5.12;
require Exporter;
-our @EXPORT_OK = qw(sha1_hex sha256_hex sha256);
+our @EXPORT_OK = qw(sha1_hex sha256_hex sha256 sha_all);
+use autodie qw(sysread);
our @ISA;
BEGIN {
}
} # /BEGIN
+
+sub sha_all ($$) {
+ my ($n, $fh) = @_;
+ my ($dig, $buf) = (PublicInbox::SHA->new($n));
+ while (sysread($fh, $buf, 65536)) { $dig->add($buf) }
+ $dig
+}
+
1;