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.1 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 7ECB2203CB 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=DaYhrPi5udy+scJBkLEkhvbtJa3H4ciE50SG8AwkU64=; h=From:To:Subject:Date:In-Reply-To:References:From; b=ueQvQpBE9Uj04FK1OzpmJUmKLZe+xFJtJhd9FB0wRckaeUhBUfWQBfEO/8+O+6uCI yH7TDOy1nSRYlq7pvqbp596kPLJDHSyO5XG2vV/ncajKAA2+kiDj1ugAfJXqfJk+W8 6PWReTNhyvc22WZdp4LdxfzkEMho6sNN+Xli7FK0= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 83/95] lei_mirror: simplify forkgroup-related subs Date: Mon, 28 Nov 2022 05:32:20 +0000 Message-Id: <20221128053232.291618-84-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: We can pass fewer variables around on stack since $fgrp is just a copy of $self. We can also rely more on explicit callback passing rather than relying on OnDestroy and ->cancel for conditional calls. --- lib/PublicInbox/LeiMirror.pm | 49 +++++++++++++----------------------- 1 file changed, 17 insertions(+), 32 deletions(-) diff --git a/lib/PublicInbox/LeiMirror.pm b/lib/PublicInbox/LeiMirror.pm index 29bfcabf..79861d64 100644 --- a/lib/PublicInbox/LeiMirror.pm +++ b/lib/PublicInbox/LeiMirror.pm @@ -460,43 +460,36 @@ EOM } sub fp_done { - my ($self, $go_fetch) = @_; + my ($self, $cb, @arg) = @_; return if !keep_going($self); my $fh = delete $self->{-show_ref} // die 'BUG: no show-ref output'; seek($fh, SEEK_SET, 0) or die "seek(show_ref): $!"; $self->{-ent} // die 'BUG: no -ent'; my $A = $self->{-ent}->{fingerprint} // die 'BUG: no fingerprint'; my $B = sha1_hex(do { local $/; <$fh> } // die("read(show_ref): $!")); - return if $A ne $B; # $go_fetch->DESTROY fires - $go_fetch->cancel; + return $cb->($self, @arg) if $A ne $B; $self->{lei}->qerr("# $self->{-key} up-to-date"); } -sub cmp_fp_fetch { - my ($self, $go_fetch) = @_; - # $go_fetch is either resume_fetch or fgrp_enqueue - my $new = $self->{-ent}->{fingerprint} // die 'BUG: no fingerprint'; +sub cmp_fp_do { + my ($self, $cb, @arg) = @_; + # $cb is either resume_fetch or fgrp_enqueue + $self->{-ent} // return $cb->($self, @arg); + my $new = $self->{-ent}->{fingerprint} // return $cb->($self, @arg); my $key = $self->{-key} // die 'BUG: no -key'; if (my $cur_ent = $self->{-local_manifest}->{$key}) { # runs go_fetch->DESTROY run if eq - return $go_fetch->cancel if $cur_ent->{fingerprint} eq $new; + return if $cur_ent->{fingerprint} eq $new; } my $dst = $self->{cur_dst} // $self->{dst}; my $cmd = ['git', "--git-dir=$dst", 'show-ref']; my $opt = { 2 => $self->{lei}->{2} }; open($opt->{1}, '+>', undef) or die "open(tmp): $!"; $self->{-show_ref} = $opt->{1}; - my $done = PublicInbox::OnDestroy->new($$, \&fp_done, $self, $go_fetch); + my $done = PublicInbox::OnDestroy->new($$, \&fp_done, $self, $cb, @arg); start_cmd($self, $cmd, $opt, $done); } -sub resume_fetch_maybe { - my ($self, $uri, $fini) = @_; - my $go_fetch = PublicInbox::OnDestroy->new($$, \&resume_fetch, @_); - cmp_fp_fetch($self, $go_fetch) if $self->{-ent} && - defined($self->{-ent}->{fingerprint}); -} - sub resume_fetch { my ($self, $uri, $fini) = @_; return if !keep_going($self); @@ -516,18 +509,10 @@ sub resume_fetch { start_cmd($self, $cmd, $opt, $fini); } -sub fgrp_enqueue_maybe { - my ($self, $fgrp) = @_; - my $enq = PublicInbox::OnDestroy->new($$, \&fgrp_enqueue, $self, $fgrp); - cmp_fp_fetch($self, $enq) if $self->{-ent} && - defined($self->{-ent}->{fingerprint}); - # $enq->DESTROY calls fgrp_enqueue otherwise -} - sub fgrp_enqueue { - my ($self, $fgrp) = @_; - return if !keep_going($self); - my $opt = { 2 => $self->{lei}->{2} }; + my ($fgrp) = @_; + return if !keep_going($fgrp); + my $opt = { 2 => $fgrp->{lei}->{2} }; # --no-tags is required to avoid conflicts my $u = $fgrp->{-uri} // die 'BUG: no {-uri}'; my $rn = $fgrp->{-remote} // die 'BUG: no {-remote}'; @@ -535,10 +520,11 @@ sub fgrp_enqueue { for ("url=$u", "fetch=+refs/*:refs/remotes/$rn/*", 'tagopt=--no-tags') { my @kv = split(/=/, $_, 2); $kv[0] = "remote.$rn.$kv[0]"; - $self->{dry_run} ? $self->{lei}->qerr("# @cmd @kv") : + $fgrp->{dry_run} ? $fgrp->{lei}->qerr("# @cmd @kv") : run_die([@cmd, @kv], undef, $opt); } - push @{$self->{fgrp_todo}->{$fgrp->{-osdir}}}, $fgrp; + $fgrp->{fgrp_todo} // die 'BUG: no fgrp_todo'; + push @{$fgrp->{fgrp_todo}->{$fgrp->{-osdir}}}, $fgrp; } sub clone_v1 { @@ -554,10 +540,9 @@ sub clone_v1 { my $resume = -d $dst; if (my $fgrp = forkgroup_prep($self, $uri)) { $fgrp->{-fini} = $fini; - $resume ? fgrp_enqueue_maybe($self, $fgrp) : - fgrp_enqueue($self, $fgrp); + $resume ? cmp_fp_do($fgrp, \&fgrp_enqueue) : fgrp_enqueue($fgrp) } elsif ($resume) { - resume_fetch_maybe($self, $uri, $fini); + cmp_fp_do($self, \&resume_fetch, $uri, $fini); } else { # normal clone my $cmd = [ @{$self->{-torsocks}}, clone_cmd($lei, my $opt = {}), "$uri", $dst ];