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