user/dev discussion of public-inbox itself
 help / color / mirror / code / Atom feed
blob 21071058a1a43d9aa6823b9092d85527334bd41e 2567 bytes (raw)
name: lib/PublicInbox/LeiExternal.pm 	 # note: path name is non-authoritative(*)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
 
# Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>

# *-external commands of lei
package PublicInbox::LeiExternal;
use strict;
use v5.10.1;
use parent qw(Exporter);
our @EXPORT = qw(lei_ls_external lei_add_external lei_forget_external);
use PublicInbox::Config;

sub _externals_each {
	my ($self, $cb, @arg) = @_;
	my $cfg = $self->_lei_cfg(0);
	my %boost;
	for my $sec (grep(/\Aexternal\./, @{$cfg->{-section_order}})) {
		my $loc = substr($sec, length('external.'));
		$boost{$loc} = $cfg->{"$sec.boost"};
	}
	return \%boost if !wantarray && !$cb;

	# highest boost first, but stable for alphabetic tie break
	use sort 'stable';
	my @order = sort { $boost{$b} <=> $boost{$a} } sort keys %boost;
	return @order if !$cb;
	for my $loc (@order) {
		$cb->(@arg, $loc, $boost{$loc});
	}
	@order; # scalar or array
}

sub lei_ls_external {
	my ($self, @argv) = @_;
	my $out = $self->{1};
	my ($OFS, $ORS) = $self->{opt}->{z} ? ("\0", "\0\0") : (" ", "\n");
	$self->_externals_each(sub {
		my ($loc, $boost_val) = @_;
		print $out $loc, $OFS, 'boost=', $boost_val, $ORS;
	});
}

sub _canonicalize {
	my ($location) = @_;
	if ($location !~ m!\Ahttps?://!) {
		PublicInbox::Config::rel2abs_collapsed($location);
	} else {
		require URI;
		my $uri = URI->new($location)->canonical;
		my $path = $uri->path . '/';
		$path =~ tr!/!/!s; # squeeze redundant '/'
		$uri->path($path);
		$uri->as_string;
	}
}

sub lei_add_external {
	my ($self, $location) = @_;
	my $cfg = $self->_lei_cfg(1);
	my $new_boost = $self->{opt}->{boost} // 0;
	$location = _canonicalize($location);
	my $key = "external.$location.boost";
	my $cur_boost = $cfg->{$key};
	return if defined($cur_boost) && $cur_boost == $new_boost; # idempotent
	$self->lei_config($key, $new_boost);
	$self->_lei_store(1)->done; # just create the store
}

sub lei_forget_external {
	my ($self, @locations) = @_;
	my $cfg = $self->_lei_cfg(1);
	my $quiet = $self->{opt}->{quiet};
	for my $loc (@locations) {
		my (@unset, @not_found);
		for my $l ($loc, _canonicalize($loc)) {
			my $key = "external.$l.boost";
			delete($cfg->{$key});
			$self->_config('--unset', $key);
			if ($? == 0) {
				push @unset, $key;
			} elsif (($? >> 8) == 5) {
				push @not_found, $key;
			} else {
				$self->err("# --unset $key error");
				return $self->x_it($?);
			}
		}
		if (@unset) {
			next if $quiet;
			$self->err("# $_ unset") for @unset;
		} elsif (@not_found) {
			$self->err("# $_ not found") for @not_found;
		} # else { already exited
	}
}

1;

debug log:

solving 21071058 ...
found 21071058 in https://80x24.org/public-inbox.git

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

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).