From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 12842203C9 for ; Mon, 28 Nov 2022 05:32:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1669613570; bh=/eJJZIzEsIQE2m76nK0T19kA7/DRZKXR37L1huFsJII=; h=From:To:Subject:Date:In-Reply-To:References:From; b=3BOmw0ArKb+3JR9IAmgqqqYtWT/YR/L4i8p5laAZpBqqynsuovr9ArHuzArG9Q92r VhXEI7GhgqaEJtWZl2mAn/KfOiI35lMiLDf9SCbfTgvuZHyHIHiGzPLAy9OlUbomWF hfSPtt5TYM+IelDrwgCGrjY6cruTR1ucY8p+rWG8= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 81/95] lei_mirror: simplify most process spawning Date: Mon, 28 Nov 2022 05:32:18 +0000 Message-Id: <20221128053232.291618-82-e@80x24.org> In-Reply-To: <20221128053232.291618-1-e@80x24.org> References: <20221128053232.291618-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: For commands where we rely on successful exit codes to continue, start_cmd() generalizes well enough to be used in a variety of places. --- lib/PublicInbox/LeiMirror.pm | 51 ++++++++++-------------------------- 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/lib/PublicInbox/LeiMirror.pm b/lib/PublicInbox/LeiMirror.pm index b8b6b504..2812b696 100644 --- a/lib/PublicInbox/LeiMirror.pm +++ b/lib/PublicInbox/LeiMirror.pm @@ -301,10 +301,10 @@ sub fgrp_update { my $cmd = [ 'git', "--git-dir=$fgrp->{cur_dst}", qw(update-ref --stdin -z) ]; my $lei = $fgrp->{lei}; - $lei->qerr("# @$cmd"); - my $opt = { 0 => $r, 2 => $lei->{2} }; - my $pid = spawn($cmd, undef, $opt); + my $pack = PublicInbox::OnDestroy->new($$, \&pack_dst, $fgrp); + start_cmd($fgrp, $cmd, { 0 => $r, 2 => $lei->{2} }, $pack); close $r or die "close(r): $!"; + return if $fgrp->{dry_run}; for my $ref (keys %dst) { my $new = delete $src{$ref}; my $old = $dst{$ref}; @@ -319,8 +319,6 @@ sub fgrp_update { upr($lei, $w, 'create', $ref, $oid); } close($w) or warn "E: close(update-ref --stdin): $! (need git 1.8.5+)\n"; - my $pack = PublicInbox::OnDestroy->new($$, \&pack_dst, $fgrp); - $LIVE->{$pid} = [ \&reap_cmd, $fgrp, $cmd, $pack ]; } sub pack_dst { # packs lightweight satellite repos @@ -330,19 +328,13 @@ sub pack_dst { # packs lightweight satellite repos sub pack_refs { my ($self, $git_dir) = @_; - do_reap($self); - return if !keep_going($self); my $cmd = [ 'git', "--git-dir=$git_dir", qw(pack-refs --all --prune) ]; - $self->{lei}->qerr("# @$cmd"); - return if $self->{dry_run}; - my $opt = { 2 => $self->{lei}->{2} }; - $LIVE->{spawn($cmd, undef, $opt)} = [ \&reap_cmd, $self, $cmd ]; + start_cmd($self, $cmd, { 2 => $self->{lei}->{2} }); } sub fgrpv_done { my ($fgrpv) = @_; return if !$LIVE; - my $pid; my $first = $fgrpv->[0] // die 'BUG: no fgrpv->[0]'; return if !keep_going($first); pack_refs($first, $first->{-osdir}); # objstore refs always packed @@ -350,30 +342,20 @@ sub fgrpv_done { my $rn = $fgrp->{-remote}; my %opt = ( 2 => $fgrp->{lei}->{2} ); - my $update_ref = $fgrp->{dry_run} ? undef : - PublicInbox::OnDestroy->new($$, \&fgrp_update, $fgrp); + my $update_ref = PublicInbox::OnDestroy->new($$, + \&fgrp_update, $fgrp); my $src = [ 'git', "--git-dir=$fgrp->{-osdir}", 'for-each-ref', "--format=refs/%(refname:lstrip=3)%00%(objectname)", "refs/remotes/$rn/" ]; - do_reap($fgrp); - $fgrp->{lei}->qerr("# @$src >SRC"); - if ($update_ref) { - open(my $fh, '+>', undef) or die "open(src): $!"; - $pid = spawn($src, undef, { %opt, 1 => $fh }); - $fgrp->{srcfh} = $fh; - $LIVE->{$pid} = [ \&reap_cmd, $fgrp, $src, $update_ref ] - } + open(my $sfh, '+>', undef) or die "open(src): $!"; + $fgrp->{srcfh} = $sfh; + start_cmd($fgrp, $src, { %opt, 1 => $sfh }, $update_ref); my $dst = [ 'git', "--git-dir=$fgrp->{cur_dst}", 'for-each-ref', '--format=%(refname)%00%(objectname)' ]; - do_reap($fgrp); - $fgrp->{lei}->qerr("# @$dst >DST"); - if ($update_ref) { - open(my $fh, '+>', undef) or die "open(dst): $!"; - $pid = spawn($dst, undef, { %opt, 1 => $fh }); - $fgrp->{dstfh} = $fh; - $LIVE->{$pid} = [ \&reap_cmd, $fgrp, $dst, $update_ref ] - } + open(my $dfh, '+>', undef) or die "open(dst): $!"; + $fgrp->{dstfh} = $dfh; + start_cmd($fgrp, $dst, { %opt, 1 => $dfh }, $update_ref); } } @@ -396,7 +378,6 @@ sub fgrp_fetch_all { qw(--no-tags --multiple)); }; push(@fetch, "-j$j") if $j; - my $pid; while (my ($osdir, $fgrpv) = each %$todo) { my $f = "$osdir/config"; @@ -405,7 +386,7 @@ sub fgrp_fetch_all { $f, '--unset-all', "remotes.$grp"]; $self->{lei}->qerr("# @$cmd"); if (!$self->{dry_run}) { - $pid = spawn($cmd, undef, { 2 => $self->{lei}->{2} }); + my $pid = spawn($cmd, undef, { 2 => $self->{lei}->{2} }); waitpid($pid, 0) // die "waitpid: $!"; die "E: @$cmd: \$?=$?" if ($? && ($? >> 8) != 5); @@ -423,12 +404,8 @@ sub fgrp_fetch_all { } $cmd = [ @git, "--git-dir=$osdir", @fetch, $grp ]; - do_reap($self); - $self->{lei}->qerr("# @$cmd"); my $end = PublicInbox::OnDestroy->new($$, \&fgrpv_done, $fgrpv); - return if $self->{dry_run}; - $pid = spawn($cmd, undef, $opt); - $LIVE->{$pid} = [ \&reap_cmd, $self, $cmd, $end ]; + start_cmd($self, $cmd, $opt, $end); } }