]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
admin: hoist out resolve_any_idxdir from resolve_{inboxdir,eidxdir}
authorEric Wong <e@80x24.org>
Wed, 3 May 2023 03:11:13 +0000 (03:11 +0000)
committerEric Wong <e@80x24.org>
Wed, 3 May 2023 06:48:26 +0000 (06:48 +0000)
This bit of common code will be handy for the upcoming
resolve_cidxdir, too.

lib/PublicInbox/Admin.pm

index da34a3bd1dd507bb2824951336106fe040476b14..96c6652ccde65aebda19c27d95ef5640068c4788 100644 (file)
@@ -28,12 +28,12 @@ sub setup_signals {
        };
 }
 
-sub resolve_eidxdir {
-       my ($cd) = @_;
+sub resolve_any_idxdir ($$) {
+       my ($cd, $lock_bn) = @_;
        my $try = $cd // '.';
        my $root_dev_ino;
-       while (1) { # favor v2, first
-               if (-f "$try/ei.lock") {
+       while (1) {
+               if (-f "$try/$lock_bn") { # inbox.lock, ei.lock, cidx.lock
                        return rel2abs_collapsed($try);
                } elsif (-d $try) {
                        my @try = stat _;
@@ -49,28 +49,16 @@ sub resolve_eidxdir {
        }
 }
 
+sub resolve_eidxdir ($) { resolve_any_idxdir($_[0], 'ei.lock') }
+
 sub resolve_inboxdir {
        my ($cd, $ver) = @_;
-       my $try = $cd // '.';
-       my $root_dev_ino;
-       while (1) { # favor v2, first
-               if (-f "$try/inbox.lock") {
-                       $$ver = 2 if $ver;
-                       return rel2abs_collapsed($try);
-               } elsif (-d $try) {
-                       my @try = stat _;
-                       $root_dev_ino //= do {
-                               my @root = stat('/') or die "stat /: $!\n";
-                               "$root[0]\0$root[1]";
-                       };
-                       last if "$try[0]\0$try[1]" eq $root_dev_ino;
-                       $try .= '/..'; # continue, cd up
-               } else {
-                       die "`$try' is not a directory\n";
-               }
-       }
-       my $dir = resolve_git_dir($cd);
-       $$ver = 1 if $ver;
+       my $dir;
+       if (defined($dir = resolve_any_idxdir($cd, 'inbox.lock'))) { # try v2
+               $$ver = 2 if $ver;
+       } elsif (defined($dir = resolve_git_dir($cd))) { # try v1
+               $$ver = 1 if $ver;
+       } # else: not an inbox at all
        $dir;
 }