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 |