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