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