| OLD | NEW |
| (Empty) |
| 1 # Copyright © 2008-2009 Raphaël Hertzog <hertzog@debian.org> | |
| 2 # | |
| 3 # This program is free software; you can redistribute it and/or modify | |
| 4 # it under the terms of the GNU General Public License as published by | |
| 5 # the Free Software Foundation; either version 2 of the License, or | |
| 6 # (at your option) any later version. | |
| 7 # | |
| 8 # This program is distributed in the hope that it will be useful, | |
| 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 11 # GNU General Public License for more details. | |
| 12 # | |
| 13 # You should have received a copy of the GNU General Public License | |
| 14 # along with this program. If not, see <https://www.gnu.org/licenses/>. | |
| 15 | |
| 16 package Dpkg::Vendor; | |
| 17 | |
| 18 use strict; | |
| 19 use warnings; | |
| 20 | |
| 21 our $VERSION = '1.01'; | |
| 22 | |
| 23 use Dpkg (); | |
| 24 use Dpkg::ErrorHandling; | |
| 25 use Dpkg::Gettext; | |
| 26 use Dpkg::BuildEnv; | |
| 27 use Dpkg::Control::HashCore; | |
| 28 | |
| 29 use Exporter qw(import); | |
| 30 our @EXPORT_OK = qw(get_vendor_info get_current_vendor get_vendor_file | |
| 31 get_vendor_dir get_vendor_object run_vendor_hook); | |
| 32 | |
| 33 my $origins = "$Dpkg::CONFDIR/origins"; | |
| 34 $origins = $ENV{DPKG_ORIGINS_DIR} if $ENV{DPKG_ORIGINS_DIR}; | |
| 35 | |
| 36 =encoding utf8 | |
| 37 | |
| 38 =head1 NAME | |
| 39 | |
| 40 Dpkg::Vendor - get access to some vendor specific information | |
| 41 | |
| 42 =head1 DESCRIPTION | |
| 43 | |
| 44 The files in $Dpkg::CONFDIR/origins/ can provide information about various | |
| 45 vendors who are providing Debian packages. Currently those files look like | |
| 46 this: | |
| 47 | |
| 48 Vendor: Debian | |
| 49 Vendor-URL: http://www.debian.org/ | |
| 50 Bugs: debbugs://bugs.debian.org | |
| 51 | |
| 52 If the vendor derives from another vendor, the file should document | |
| 53 the relationship by listing the base distribution in the Parent field: | |
| 54 | |
| 55 Parent: Debian | |
| 56 | |
| 57 The file should be named according to the vendor name. | |
| 58 | |
| 59 =head1 FUNCTIONS | |
| 60 | |
| 61 =over 4 | |
| 62 | |
| 63 =item $dir = Dpkg::Vendor::get_vendor_dir() | |
| 64 | |
| 65 Returns the current dpkg origins directory name, where the vendor files | |
| 66 are stored. | |
| 67 | |
| 68 =cut | |
| 69 | |
| 70 sub get_vendor_dir { | |
| 71 return $origins; | |
| 72 } | |
| 73 | |
| 74 =item $fields = Dpkg::Vendor::get_vendor_info($name) | |
| 75 | |
| 76 Returns a Dpkg::Control object with the information parsed from the | |
| 77 corresponding vendor file in $Dpkg::CONFDIR/origins/. If $name is omitted, | |
| 78 it will use $Dpkg::CONFDIR/origins/default which is supposed to be a symlink | |
| 79 to the vendor of the currently installed operating system. Returns undef | |
| 80 if there's no file for the given vendor. | |
| 81 | |
| 82 =cut | |
| 83 | |
| 84 sub get_vendor_info(;$) { | |
| 85 my $vendor = shift || 'default'; | |
| 86 my $file = get_vendor_file($vendor); | |
| 87 return unless $file; | |
| 88 my $fields = Dpkg::Control::HashCore->new(); | |
| 89 $fields->load($file) or error(_g('%s is empty'), $file); | |
| 90 return $fields; | |
| 91 } | |
| 92 | |
| 93 =item $name = Dpkg::Vendor::get_vendor_file($name) | |
| 94 | |
| 95 Check if there's a file for the given vendor and returns its | |
| 96 name. | |
| 97 | |
| 98 =cut | |
| 99 | |
| 100 sub get_vendor_file(;$) { | |
| 101 my $vendor = shift || 'default'; | |
| 102 my $file; | |
| 103 my @tries = ($vendor, lc($vendor), ucfirst($vendor), ucfirst(lc($vendor))); | |
| 104 if ($vendor =~ s/\s+/-/) { | |
| 105 push @tries, $vendor, lc($vendor), ucfirst($vendor), ucfirst(lc($vendor)
); | |
| 106 } | |
| 107 foreach my $name (@tries) { | |
| 108 $file = "$origins/$name" if -e "$origins/$name"; | |
| 109 } | |
| 110 return $file; | |
| 111 } | |
| 112 | |
| 113 =item $name = Dpkg::Vendor::get_current_vendor() | |
| 114 | |
| 115 Returns the name of the current vendor. If DEB_VENDOR is set, it uses | |
| 116 that first, otherwise it falls back to parsing $Dpkg::CONFDIR/origins/default. | |
| 117 If that file doesn't exist, it returns undef. | |
| 118 | |
| 119 =cut | |
| 120 | |
| 121 sub get_current_vendor() { | |
| 122 my $f; | |
| 123 if (Dpkg::BuildEnv::has('DEB_VENDOR')) { | |
| 124 $f = get_vendor_info(Dpkg::BuildEnv::get('DEB_VENDOR')); | |
| 125 return $f->{'Vendor'} if defined $f; | |
| 126 } | |
| 127 $f = get_vendor_info(); | |
| 128 return $f->{'Vendor'} if defined $f; | |
| 129 return; | |
| 130 } | |
| 131 | |
| 132 =item $object = Dpkg::Vendor::get_vendor_object($name) | |
| 133 | |
| 134 Return the Dpkg::Vendor::* object of the corresponding vendor. | |
| 135 If $name is omitted, return the object of the current vendor. | |
| 136 If no vendor can be identified, then return the Dpkg::Vendor::Default | |
| 137 object. | |
| 138 | |
| 139 =cut | |
| 140 | |
| 141 my %OBJECT_CACHE; | |
| 142 sub get_vendor_object { | |
| 143 my $vendor = shift || get_current_vendor() || 'Default'; | |
| 144 return $OBJECT_CACHE{$vendor} if exists $OBJECT_CACHE{$vendor}; | |
| 145 | |
| 146 my ($obj, @names); | |
| 147 if ($vendor ne 'Default') { | |
| 148 push @names, $vendor, lc($vendor), ucfirst($vendor), ucfirst(lc($vendor)
); | |
| 149 } | |
| 150 foreach my $name (@names, 'Default') { | |
| 151 eval qq{ | |
| 152 require Dpkg::Vendor::$name; | |
| 153 \$obj = Dpkg::Vendor::$name->new(); | |
| 154 }; | |
| 155 last unless $@; | |
| 156 } | |
| 157 $OBJECT_CACHE{$vendor} = $obj; | |
| 158 return $obj; | |
| 159 } | |
| 160 | |
| 161 =item Dpkg::Vendor::run_vendor_hook($hookid, @params) | |
| 162 | |
| 163 Run a hook implemented by the current vendor object. | |
| 164 | |
| 165 =cut | |
| 166 | |
| 167 sub run_vendor_hook { | |
| 168 my $vendor_obj = get_vendor_object(); | |
| 169 $vendor_obj->run_hook(@_); | |
| 170 } | |
| 171 | |
| 172 =back | |
| 173 | |
| 174 =head1 CHANGES | |
| 175 | |
| 176 =head2 Version 1.01 | |
| 177 | |
| 178 New function: get_vendor_dir(). | |
| 179 | |
| 180 =cut | |
| 181 | |
| 182 1; | |
| OLD | NEW |