+sub _lcat_i { # LeiMailSync->each_src iterator callback
+ my ($oidbin, $id, $each_smsg) = @_;
+ $each_smsg->({blob => unpack('H*', $oidbin), pct => 100});
+}
+
+sub _lcat2smsg { # git->cat_async callback
+ my ($bref, $oid, $type, $size, $smsg) = @_;
+ if ($bref) {
+ my $eml = PublicInbox::Eml->new($bref);
+ my $json_dump = delete $smsg->{-json_dump};
+ bless $smsg, 'PublicInbox::Smsg';
+ _smsg_fill($smsg, $eml);
+ $json_dump->($smsg, undef, $eml);
+ }
+}
+
+sub lcat_dump { # via wq_io_do
+ my ($self) = @_;
+ my $lei = $self->{lei};
+ my $each_smsg = $lei->{ovv}->ovv_each_smsg_cb($lei);
+ my $git = $lei->{ale}->git;
+ if (!$lei->{l2m}) {
+ my $json_dump = $each_smsg;
+ $each_smsg = sub {
+ my ($smsg) = @_;
+ $smsg->{-json_dump} = $json_dump;
+ $git->cat_async($smsg->{blob}, \&_lcat2smsg, $smsg);
+ };
+ }
+ my $lms;
+ for my $ent (@{$lei->{lcat_todo}}) {
+ if (ref $ent eq 'HASH') { # { fid => $fid ,.. }
+ $lms //= $lei->{lse}->lms;
+ $lms->each_src($ent, \&_lcat_i, $each_smsg);
+ } else { # oidhex
+ $each_smsg->({ blob => $ent, pct => 100 });
+ }
+ }
+ $git->async_wait_all;
+ undef $each_smsg; # may commit
+ $lei->{ovv}->ovv_atexit_child($lei);
+}