user/dev discussion of public-inbox itself
 help / color / mirror / code / Atom feed
From: Eric Wong <e@80x24.org>
To: meta@public-inbox.org
Subject: [PATCH 1/2] lei_mirror: further reduce `git config' calls
Date: Sun, 12 Feb 2023 23:18:27 +0000	[thread overview]
Message-ID: <20230212231828.33336-2-e@80x24.org> (raw)
In-Reply-To: <20230212231828.33336-1-e@80x24.org>

We can parse the config at once and avoid clobbering variables
which do not need changing.  We'll also do some prep work for
fetch.hideRefs proposal being discussed at
<https://public-inbox.org/git/20230209122857.M669733@dcvr/>
---
 lib/PublicInbox/LeiMirror.pm | 62 +++++++++++++++++++++---------------
 1 file changed, 36 insertions(+), 26 deletions(-)

diff --git a/lib/PublicInbox/LeiMirror.pm b/lib/PublicInbox/LeiMirror.pm
index d959b6b6..dd6356bb 100644
--- a/lib/PublicInbox/LeiMirror.pm
+++ b/lib/PublicInbox/LeiMirror.pm
@@ -401,23 +401,42 @@ sub fgrp_fetch_all {
 	my $opt = {};
 	my @fetch = do {
 		local $self->{lei}->{opt}->{jobs} = 1;
-		(fetch_args($self->{lei}, $opt),
-			qw(--no-tags --multiple));
+		(fetch_args($self->{lei}, $opt), qw(--no-tags --multiple));
 	};
 	push(@fetch, "-j$j") if $j;
 	while (my ($osdir, $fgrpv) = each %$todo) {
 		my $f = "$osdir/config";
 		return if !keep_going($self);
 
+		my $cmd = ['git', "--git-dir=$osdir", qw(config -f), $f ];
 		# clobber group from previous run atomically
-		my $cmd = ['git', "--git-dir=$osdir", qw(config -f),
-				$f, '--unset-all', "remotes.$grp"];
-		$self->{lei}->qerr("# @$cmd");
-		if (!$self->{dry_run}) {
-			my $pid = spawn($cmd, undef, { 2 => $self->{lei}->{2} });
+		for ("remotes.$grp") { # TODO: hideRefs
+			my $c = [ @$cmd, '--unset-all', $_ ];
+			$self->{lei}->qerr("# @$c");
+			next if $self->{dry_run};
+			my $pid = spawn($c, undef, $opt);
 			waitpid($pid, 0) // die "waitpid: $!";
-			die "E: @$cmd: \$?=$?" if ($? && ($? >> 8) != 5);
+			die "E: @$c \$?=$?" if ($? && ($? >> 8) != 5);
+		}
 
+		# permanent configs:
+		my $cfg = PublicInbox::Config->git_config_dump($f);
+		for my $fgrp (@$fgrpv) {
+			my $u = $fgrp->{-uri} // die 'BUG: no {-uri}';
+			my $rn = $fgrp->{-remote} // die 'BUG: no {-remote}';
+			for ("url=$u", "fetch=+refs/*:refs/remotes/$rn/*",
+					'tagopt=--no-tags') {
+				my ($k, $v) = split(/=/, $_, 2);
+				$k = "remote.$rn.$k";
+				next if ($cfg->{$k} // '') eq $v;
+				my $c = [@$cmd, $k, $v];
+				$fgrp->{lei}->qerr("# @$c");
+				next if $fgrp->{dry_run};
+				run_die($c, undef, $opt);
+			}
+		}
+
+		if (!$self->{dry_run}) {
 			# update the config atomically via O_APPEND while
 			# respecting git-config locking
 			sysopen(my $lk, "$f.lock", O_CREAT|O_EXCL|O_WRONLY)
@@ -430,7 +449,6 @@ sub fgrp_fetch_all {
 			close $fh or die "close($f): $!";
 			unlink("$f.lock") or die "unlink($f.lock): $!";
 		}
-
 		$cmd = [ @git, "--git-dir=$osdir", @fetch, $grp ];
 		my $end = PublicInbox::OnDestroy->new($$, \&fgrpv_done, $fgrpv);
 		start_cmd($self, $cmd, $opt, $end);
@@ -446,12 +464,15 @@ sub forkgroup_prep {
 	my $dir = "$os/$fg.git";
 	if (!-d $dir && !$self->{dry_run}) {
 		PublicInbox::Import::init_bare($dir);
-		my @cmd = ('git', "--git-dir=$dir", 'config');
-		my $opt = { 2 => $self->{lei}->{2} };
-		for ('repack.useDeltaIslands=true',
-				'pack.island=refs/remotes/([^/]+)/') {
-			run_die([@cmd, split(/=/, $_, 2)], undef, $opt);
-		}
+		my $f = "$dir/config";
+		open my $fh, '+>>', $f or die "open:($f): $!";
+		print $fh <<EOM or die "print($f): $!";
+[repack]
+	useDeltaIslands = true
+[pack]
+	island = refs/remotes/([^/]+)/
+EOM
+		close $fh or die "close($f): $!";
 	}
 	my $key = $self->{-key} // die 'BUG: no -key';
 	my $rn = substr(sha256_hex($key), 0, 16);
@@ -546,17 +567,6 @@ sub resume_fetch {
 sub fgrp_enqueue {
 	my ($fgrp, $end) = @_; # $end calls fgrp_fetch_all
 	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}';
-	my @cmd = ('git', "--git-dir=$fgrp->{-osdir}", 'config');
-	for ("url=$u", "fetch=+refs/*:refs/remotes/$rn/*", 'tagopt=--no-tags') {
-		my @kv = split(/=/, $_, 2);
-		$kv[0] = "remote.$rn.$kv[0]";
-		$fgrp->{dry_run} ? $fgrp->{lei}->qerr("# @cmd @kv") :
-				run_die([@cmd, @kv], undef, $opt);
-	}
 	++$fgrp->{chg}->{nr_chg};
 	push @{$FGRP_TODO->{$fgrp->{-osdir}}}, $fgrp;
 }

  reply	other threads:[~2023-02-12 23:19 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-12 23:18 [PATCH 0/2] lei_mirror: more tweaks Eric Wong
2023-02-12 23:18 ` Eric Wong [this message]
2023-02-12 23:18 ` [PATCH 2/2] lei_mirror: fetch most-recently-updated repos, first Eric Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://public-inbox.org/README

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230212231828.33336-2-e@80x24.org \
    --to=e@80x24.org \
    --cc=meta@public-inbox.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/public-inbox.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).