1# ex:ts=8 sw=4:
2# $OpenBSD: PackageRepositoryList.pm,v 1.34 2023/06/14 09:59:09 espie Exp $
3#
4# Copyright (c) 2003-2006 Marc Espie <espie@openbsd.org>
5#
6# Permission to use, copy, modify, and distribute this software for any
7# purpose with or without fee is hereby granted, provided that the above
8# copyright notice and this permission notice appear in all copies.
9#
10# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18use v5.36;
19
20package OpenBSD::PackageRepositoryList;
21
22sub new($class, $state)
23{
24	return bless {l => [], k => {}, state => $state}, $class;
25}
26
27sub filter_new($self, @p)
28{
29	my @l = ();
30	for my $r (@p) {
31		next if !defined $r;
32		next if $self->{k}{$r};
33		$self->{k}{$r} = 1;
34		push @l, $r;
35	}
36	return @l;
37}
38
39sub add($self, @p)
40{
41	push @{$self->{l}}, $self->filter_new(@p);
42}
43
44sub prepend($self, @p)
45{
46	unshift @{$self->{l}}, $self->filter_new(@p);
47}
48
49sub do_something($self, $do, $pkgname, @args)
50{
51	for my $repo (@{$self->{l}}) {
52		my $r = $repo->$do($pkgname, @args);
53		return $r if defined $r;
54	}
55	return undef;
56}
57
58sub find($self, @args)
59{
60
61	return $self->do_something('find', @args);
62}
63
64sub grabPlist($self, @args)
65{
66	return $self->do_something('grabPlist', @args);
67}
68
69sub match_locations($self, @search)
70{
71	my $result = [];
72	for my $repo (@{$self->{l}}) {
73		my $l = $repo->match_locations(@search);
74		if ($search[0]->{keep_all}) {
75			push(@$result, @$l);
76		} elsif (@$l > 0) {
77			return $l;
78		}
79	}
80	return $result;
81}
82
831;
84