1# ex:ts=8 sw=4: 2# $OpenBSD: PackageLocator.pm,v 1.111 2023/06/13 09:07:17 espie Exp $ 3# 4# Copyright (c) 2003-2010 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::PackageLocator; 21 22use OpenBSD::PackageRepositoryList; 23use OpenBSD::PackageRepository; 24 25my $default_path; 26 27sub add_default($self, $state, $p) 28{ 29 my $w; 30 31 if (defined $ENV{TRUSTED_PKG_PATH}) { 32 my $v = $ENV{TRUSTED_PKG_PATH}; 33 $v =~ s/^\:+//o; 34 $v =~ s/\:+$//o; 35 while (my $o = OpenBSD::PackageRepository->parse(\$v, $state)) { 36 $o->{trusted} = 1; 37 $p->add($o); 38 } 39 } else { 40 $w = "./:installpath"; 41 } 42 if (defined $ENV{PKG_PATH}) { 43 $w = $ENV{PKG_PATH}; 44 } 45 if (defined $w) { 46 $w =~ s/^\:+//o; 47 $w =~ s/\:+$//o; 48 while (my $o = OpenBSD::PackageRepository->parse(\$w, $state)) { 49 $p->add($o); 50 } 51 } 52} 53 54sub build_default_path($self, $state) 55{ 56 $default_path = OpenBSD::PackageRepositoryList->new($state); 57 58 $self->add_default($state, $default_path); 59} 60 61sub default_path($self,$state) 62{ 63 if (!defined $default_path) { 64 $self->build_default_path($state); 65 } 66 return $default_path; 67} 68 69sub printable_default_path($self, $state) 70{ 71 return join(':', $self->default_path($state)->do_something('url')); 72} 73 74sub path_parse($self, $pkgname, $state) 75{ 76 my $path = './'; 77 if ($pkgname =~ m/^(.*[\/\:])(.*)/) { 78 ($pkgname, $path) = ($2, $1); 79 } 80 81 return (OpenBSD::PackageRepository->new($path, $state), $pkgname); 82} 83 84sub find($self, $url, $state) 85{ 86 my $package; 87 if ($url =~ m/[\/\:]/o) { 88 my ($repository, $pkgname) = $self->path_parse($url, $state); 89 $package = $repository->find($pkgname); 90 if (defined $package) { 91 $self->default_path($state)->add($repository); 92 } 93 } else { 94 $package = $self->default_path($state)->find($url); 95 } 96 return $package; 97} 98 99sub grabPlist($self, $url, $code, $state) 100{ 101 my $plist; 102 if ($url =~ m/[\/\:]/o) { 103 my ($repository, $pkgname) = $self->path_parse($url, $state); 104 $plist = $repository->grabPlist($pkgname, $code); 105 if (defined $plist) { 106 $self->default_path($state)->add($repository); 107 } 108 } else { 109 $plist = $self->default_path($state)->grabPlist($url, $code); 110 } 111 return $plist; 112} 113 114sub match_locations($self, @search) 115{ 116 my $state = pop @search; 117 return $self->default_path($state)->match_locations(@search); 118} 119 1201; 121