From 34f4c437bff62a3297b2fcebf31fcdb24638dec9 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 7 Jan 2019 08:02:13 +0000 Subject: hoist out resolve_repo_dir from -index We'll be using it in future admin tools, and making this easier-to-test. --- lib/PublicInbox/Admin.pm | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 lib/PublicInbox/Admin.pm (limited to 'lib/PublicInbox') diff --git a/lib/PublicInbox/Admin.pm b/lib/PublicInbox/Admin.pm new file mode 100644 index 00000000..d0a8dd00 --- /dev/null +++ b/lib/PublicInbox/Admin.pm @@ -0,0 +1,44 @@ +# Copyright (C) 2019 all contributors +# License: AGPL-3.0+ + +# common stuff for administrative command-line tools +# Unstable internal API +package PublicInbox::Admin; +use strict; +use warnings; +use Cwd 'abs_path'; +use base qw(Exporter); +our @EXPORT_OK = qw(resolve_repo_dir); + +sub resolve_repo_dir { + my ($cd, $ver) = @_; + my $prefix = defined $cd ? $cd : './'; + if (-d $prefix && -f "$prefix/inbox.lock") { # v2 + $$ver = 2 if $ver; + return abs_path($prefix); + } + + my @cmd = qw(git rev-parse --git-dir); + my $cmd = join(' ', @cmd); + my $pid = open my $fh, '-|'; + defined $pid or die "forking $cmd failed: $!\n"; + if ($pid == 0) { + if (defined $cd) { + chdir $cd or die "chdir $cd failed: $!\n"; + } + exec @cmd; + die "Failed to exec $cmd: $!\n"; + } else { + my $dir = eval { + local $/; + <$fh>; + }; + close $fh or die "error in $cmd: $!\n"; + chomp $dir; + $$ver = 1 if $ver; + return abs_path($cd) if ($dir eq '.' && defined $cd); + abs_path($dir); + } +} + +1; -- cgit v1.2.3-24-ge0c7 From 9739f3aa67425958f306f8418c0c6fbf186481c3 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 11 Jan 2019 03:50:51 +0000 Subject: import: purge: reap fast-export process Zombies are bad. --- lib/PublicInbox/Import.pm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/PublicInbox') diff --git a/lib/PublicInbox/Import.pm b/lib/PublicInbox/Import.pm index fd4255cf..7e596abc 100644 --- a/lib/PublicInbox/Import.pm +++ b/lib/PublicInbox/Import.pm @@ -495,7 +495,7 @@ sub purge_oids { my $old = $self->{'ref'}; my $git = $self->{git}; my @export = (qw(fast-export --no-data --use-done-feature), $old); - my ($rd, $pid) = $git->popen(@export); + my $rd = $git->popen(@export); my ($r, $w) = $self->gfi_start; my @buf; my $npurge = 0; @@ -550,6 +550,7 @@ sub purge_oids { push @buf, $_; } } + close $rd or die "close fast-export failed: $?"; if (@buf) { $w->print(@buf) or wfail; } -- cgit v1.2.3-24-ge0c7 From a6823087e5aa9699a42c31df16323885c70d1b4d Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 11 Jan 2019 00:59:51 +0000 Subject: v2writable: ->purge returns undef on no-op And doesn't try to access undef as an array ref. --- lib/PublicInbox/V2Writable.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/PublicInbox') diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index 222df5c2..08d18fc0 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -390,7 +390,7 @@ sub purge { my ($self, $mime) = @_; my $purges = $self->{-inbox}->with_umask(sub { remove_internal($self, $mime, undef, {}); - }); + }) or return; $self->idx_init if @$purges; # ->done is called on purges for my $i (0..$#$purges) { defined(my $cmt = $purges->[$i]) or next; -- cgit v1.2.3-24-ge0c7 From ec4f98cb7ad6f6baf19ca208947fcb563a4ed8fe Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 11 Jan 2019 01:02:45 +0000 Subject: v2writable: purge ignores non-existent git epoch directories We don't require every git epoch to exist since we support the --skip feature in public-inbox-init. --- lib/PublicInbox/V2Writable.pm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/PublicInbox') diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index 08d18fc0..970244eb 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -286,7 +286,9 @@ sub purge_oids { my $pfx = "$self->{-inbox}->{mainrepo}/git"; my $purges = []; foreach my $i (0..$self->{epoch_max}) { - my $git = PublicInbox::Git->new("$pfx/$i.git"); + my $git_dir = "$pfx/$i.git"; + -d $git_dir or next; + my $git = PublicInbox::Git->new($git_dir); my $im = $self->import_init($git, 0, 1); $purges->[$i] = $im->purge_oids($purge); } -- cgit v1.2.3-24-ge0c7 From 5126394a3806bd438bd0ef9c596ffa2e3cfb8db9 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 11 Jan 2019 02:47:57 +0000 Subject: v2writable: cleanup processes when done Otherwise, Perl may exit successfully when a failure code is desired. --- lib/PublicInbox/V2Writable.pm | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib/PublicInbox') diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index 970244eb..ec28e510 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -291,6 +291,7 @@ sub purge_oids { my $git = PublicInbox::Git->new($git_dir); my $im = $self->import_init($git, 0, 1); $purges->[$i] = $im->purge_oids($purge); + $im->done; } $purges; } @@ -499,6 +500,7 @@ sub done { delete $self->{bnote}; $self->{transact_bytes} = 0; $self->lock_release if $parts; + $self->{-inbox}->git->cleanup; } sub git_init { -- cgit v1.2.3-24-ge0c7 From 995849ed8a5a6f96105263a546e55e6c8811e76e Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 11 Jan 2019 02:48:18 +0000 Subject: v2writable: read epoch on purge A stand-alone tool for purge will won't know the epoch if nothing was ->add()-ed before. --- lib/PublicInbox/V2Writable.pm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'lib/PublicInbox') diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index ec28e510..1f17fe21 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -285,7 +285,13 @@ sub purge_oids { $self->done; my $pfx = "$self->{-inbox}->{mainrepo}/git"; my $purges = []; - foreach my $i (0..$self->{epoch_max}) { + my $max = $self->{epoch_max}; + + unless (defined($max)) { + defined(my $latest = git_dir_latest($self, \$max)) or return; + $self->{epoch_max} = $max; + } + foreach my $i (0..$max) { my $git_dir = "$pfx/$i.git"; -d $git_dir or next; my $git = PublicInbox::Git->new($git_dir); -- cgit v1.2.3-24-ge0c7