+ my $cmd = [ qw(git rev-parse --git-dir) ];
+ my $fh = popen_rd($cmd, undef, {-C => $cd});
+ my $dir = do { local $/; <$fh> };
+ close $fh or die "error in ".join(' ', @$cmd)." (cwd:$cd): $!\n";
+ chomp $dir;
+ $$ver = 1 if $ver;
+ return abs_path($cd) if ($dir eq '.' && defined $cd);
+ abs_path($dir);
+}
+
+# for unconfigured inboxes
+sub detect_indexlevel ($) {
+ my ($ibx) = @_;
+
+ # brand new or never before indexed inboxes default to full
+ return 'full' unless $ibx->over;
+ delete $ibx->{over}; # don't leave open FD lying around
+
+ my $l = 'basic';
+ my $srch = $ibx->search or return $l;
+ delete $ibx->{search}; # don't leave open FD lying around
+ if (my $xdb = $srch->xdb) {
+ $l = 'full';
+ my $m = $xdb->get_metadata('indexlevel');
+ if ($m eq 'medium') {
+ $l = $m;
+ } elsif ($m ne '') {
+ warn <<"";
+$ibx->{inboxdir} has unexpected indexlevel in Xapian: $m
+
+ }
+ }
+ $l;
+}
+
+sub unconfigured_ibx ($$) {
+ my ($dir, $i) = @_;
+ my $name = "unconfigured-$i";
+ PublicInbox::Inbox->new({
+ name => $name,
+ address => [ "$name\@example.com" ],
+ inboxdir => $dir,
+ # TODO: consumers may want to warn on this:
+ #-unconfigured => 1,
+ });
+}
+
+sub resolve_inboxes ($;$$) {
+ my ($argv, $opt, $cfg) = @_;
+ $opt ||= {};
+
+ $cfg //= PublicInbox::Config->new;
+ if ($opt->{all}) {
+ my $cfgfile = PublicInbox::Config::default_file();
+ $cfg or die "--all specified, but $cfgfile not readable\n";
+ @$argv and die "--all specified, but directories specified\n";
+ }