167d43fbcSespie# ex:ts=8 sw=4: 2*039cbdaaSespie# $OpenBSD: PackageLocator.pm,v 1.111 2023/06/13 09:07:17 espie Exp $ 36f05d20cSespie# 454996cc2Sespie# Copyright (c) 2003-2010 Marc Espie <espie@openbsd.org> 56f05d20cSespie# 667d43fbcSespie# Permission to use, copy, modify, and distribute this software for any 767d43fbcSespie# purpose with or without fee is hereby granted, provided that the above 867d43fbcSespie# copyright notice and this permission notice appear in all copies. 96f05d20cSespie# 1067d43fbcSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1167d43fbcSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1267d43fbcSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1367d43fbcSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1467d43fbcSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1567d43fbcSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1667d43fbcSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 176f05d20cSespie 18*039cbdaaSespieuse v5.36; 196f05d20cSespie 20c3854156Sespiepackage OpenBSD::PackageLocator; 21c3854156Sespie 22d39602bdSespieuse OpenBSD::PackageRepositoryList; 23d39602bdSespieuse OpenBSD::PackageRepository; 24d39602bdSespie 254c6854e7Sespiemy $default_path; 26becd6ee6Sespie 27*039cbdaaSespiesub add_default($self, $state, $p) 284c6854e7Sespie{ 29b1b61206Sespie my $w; 301fdee857Sespie 311fdee857Sespie if (defined $ENV{TRUSTED_PKG_PATH}) { 321fdee857Sespie my $v = $ENV{TRUSTED_PKG_PATH}; 331fdee857Sespie $v =~ s/^\:+//o; 341fdee857Sespie $v =~ s/\:+$//o; 351fdee857Sespie while (my $o = OpenBSD::PackageRepository->parse(\$v, $state)) { 361fdee857Sespie $o->{trusted} = 1; 3701fd8ee4Sespie $p->add($o); 381fdee857Sespie } 39b1b61206Sespie } else { 40b1b61206Sespie $w = "./:installpath"; 411fdee857Sespie } 42c3854156Sespie if (defined $ENV{PKG_PATH}) { 43b1b61206Sespie $w = $ENV{PKG_PATH}; 44c3854156Sespie } 45b1b61206Sespie if (defined $w) { 46b1b61206Sespie $w =~ s/^\:+//o; 47b1b61206Sespie $w =~ s/\:+$//o; 48b1b61206Sespie while (my $o = OpenBSD::PackageRepository->parse(\$w, $state)) { 4901fd8ee4Sespie $p->add($o); 50a71e68baSespie } 51a2652750Sespie } 52c3854156Sespie} 53c3854156Sespie 54*039cbdaaSespiesub build_default_path($self, $state) 5501fd8ee4Sespie{ 5601fd8ee4Sespie $default_path = OpenBSD::PackageRepositoryList->new($state); 5701fd8ee4Sespie 5801fd8ee4Sespie $self->add_default($state, $default_path); 5901fd8ee4Sespie} 6001fd8ee4Sespie 61*039cbdaaSespiesub default_path($self,$state) 62a2652750Sespie{ 63a2652750Sespie if (!defined $default_path) { 6401fd8ee4Sespie $self->build_default_path($state); 654c6854e7Sespie } 664c6854e7Sespie return $default_path; 674c6854e7Sespie} 68294e3aadSespie 69*039cbdaaSespiesub printable_default_path($self, $state) 7001fd8ee4Sespie{ 7101fd8ee4Sespie return join(':', $self->default_path($state)->do_something('url')); 7201fd8ee4Sespie} 7301fd8ee4Sespie 74*039cbdaaSespiesub path_parse($self, $pkgname, $state) 759c367c57Sespie{ 76*039cbdaaSespie my $path = './'; 773eadd976Sespie if ($pkgname =~ m/^(.*[\/\:])(.*)/) { 783eadd976Sespie ($pkgname, $path) = ($2, $1); 794446a41dSespie } 80fdd4582fSespie 815732efc0Sespie return (OpenBSD::PackageRepository->new($path, $state), $pkgname); 829c367c57Sespie} 839c367c57Sespie 84*039cbdaaSespiesub find($self, $url, $state) 85c3854156Sespie{ 86c3854156Sespie my $package; 87b62674ebSespie if ($url =~ m/[\/\:]/o) { 88b62674ebSespie my ($repository, $pkgname) = $self->path_parse($url, $state); 89db099e94Sespie $package = $repository->find($pkgname); 90c3854156Sespie if (defined $package) { 915732efc0Sespie $self->default_path($state)->add($repository); 92c3854156Sespie } 93c3854156Sespie } else { 94b62674ebSespie $package = $self->default_path($state)->find($url); 95c3854156Sespie } 96c3854156Sespie return $package; 97c3854156Sespie} 98c3854156Sespie 99*039cbdaaSespiesub grabPlist($self, $url, $code, $state) 100d72da1d1Sespie{ 101594bea89Sespie my $plist; 102b62674ebSespie if ($url =~ m/[\/\:]/o) { 103b62674ebSespie my ($repository, $pkgname) = $self->path_parse($url, $state); 104db099e94Sespie $plist = $repository->grabPlist($pkgname, $code); 105594bea89Sespie if (defined $plist) { 1065732efc0Sespie $self->default_path($state)->add($repository); 107594bea89Sespie } 108594bea89Sespie } else { 109b62674ebSespie $plist = $self->default_path($state)->grabPlist($url, $code); 110594bea89Sespie } 111594bea89Sespie return $plist; 112c3854156Sespie} 113c3854156Sespie 114*039cbdaaSespiesub match_locations($self, @search) 115470d422aSespie{ 1165732efc0Sespie my $state = pop @search; 1175732efc0Sespie return $self->default_path($state)->match_locations(@search); 118470d422aSespie} 1194c6854e7Sespie 1206f05d20cSespie1; 121