source: devel/pb/lib/ProjectBuilder/Filter.pm @ 427

Last change on this file since 427 was 427, checked in by bruno, 11 years ago

Improve setupv to use pb functions and setup the pb account ssh env correctly now when reusing the VMs

File size: 9.1 KB
Line 
1#!/usr/bin/perl -w
2#
3# ProjectBuilder Filter module
4# Filtering subroutines brought by the the Project-Builder project
5# which can be easily used by pbinit
6#
7# $Id$
8#
9# Copyright B. Cornec 2007
10# Provided under the GPL v2
11
12package ProjectBuilder::Filter;
13
14use strict 'vars';
15use Data::Dumper;
16use English;
17use File::Basename;
18use File::Copy;
19use lib qw (lib);
20use ProjectBuilder::Base;
21use ProjectBuilder::Changelog;
22
23# Inherit from the "Exporter" module which handles exporting functions.
24 
25use Exporter;
26 
27# Export, by default, all the functions into the namespace of
28# any code which uses this module.
29 
30our @ISA = qw(Exporter);
31our @EXPORT = qw(pb_get_filters pb_filter_file_pb pb_filter_file_inplace pb_filter_file);
32
33=pod
34
35=head1 NAME
36
37ProjectBuilder::Filter, part of the project-builder.org
38
39=head1 DESCRIPTION
40
41This module provides filtering functions suitable for pbinit calls.
42
43=over 4
44
45=item B<pb_get_filters>
46
47This function gets all filters to apply. They're cumulative from the less specific to the most specific.
48
49Suffix of those filters is .pbf. Filter all.pbf applies to whatever distribution. The pbfilter directory may be global under pbconf or per package, for overloading values. Then in order filters are loaded for distribution type, distribution family, distribution name, distribution name-version.
50
51The first parameter is the package name.
52The second parameter is the distribution type.
53The third parameter is the distribution family.
54The fourth parameter is the distribution name.
55The fifth parameter is the distribution version.
56
57The function returns a pointer on a hash of filters.
58
59=cut
60
61sub pb_get_filters {
62
63my @ffiles;
64my ($ffile00, $ffile0, $ffile1, $ffile2, $ffile3);
65my ($mfile00, $mfile0, $mfile1, $mfile2, $mfile3);
66my $pbpkg = shift || die "No package specified";
67my $dtype = shift || "";
68my $dfam = shift || "";
69my $ddir = shift || "";
70my $dver = shift || "";
71my $ptr = undef; # returned value pointer on the hash of filters
72my %h;
73
74# Global filter files first, then package specificities
75if (-d "$ENV{'PBROOTDIR'}/pbfilter") {
76    $mfile00 = "$ENV{'PBROOTDIR'}/pbfilter/all.pbf" if (-f "$ENV{'PBROOTDIR'}/pbfilter/all.pbf");
77    $mfile0 = "$ENV{'PBROOTDIR'}/pbfilter/$dtype.pbf" if (-f "$ENV{'PBROOTDIR'}/pbfilter/$dtype.pbf");
78    $mfile1 = "$ENV{'PBROOTDIR'}/pbfilter/$dfam.pbf" if (-f "$ENV{'PBROOTDIR'}/pbfilter/$dfam.pbf");
79    $mfile2 = "$ENV{'PBROOTDIR'}/pbfilter/$ddir.pbf" if (-f "$ENV{'PBROOTDIR'}/pbfilter/$ddir.pbf");
80    $mfile3 = "$ENV{'PBROOTDIR'}/pbfilter/$ddir-$dver.pbf" if (-f "$ENV{'PBROOTDIR'}/pbfilter/$ddir-$dver.pbf");
81
82    push @ffiles,$mfile00 if (defined $mfile00);
83    push @ffiles,$mfile0 if (defined $mfile0);
84    push @ffiles,$mfile1 if (defined $mfile1);
85    push @ffiles,$mfile2 if (defined $mfile2);
86    push @ffiles,$mfile3 if (defined $mfile3);
87}
88
89if (-d "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter") {
90    $ffile00 = "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/all.pbf" if (-f "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/all.pbf");
91    $ffile0 = "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$dtype.pbf" if (-f "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$dtype.pbf");
92    $ffile1 = "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$dfam.pbf" if (-f "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$dfam.pbf");
93    $ffile2 = "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$ddir.pbf" if (-f "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$ddir.pbf");
94    $ffile3 = "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$ddir-$dver.pbf" if (-f "$ENV{'PBROOTDIR'}/$pbpkg/pbfilter/$ddir-$dver.pbf");
95
96    push @ffiles,$ffile00 if (defined $ffile00);
97    push @ffiles,$ffile0 if (defined $ffile0);
98    push @ffiles,$ffile1 if (defined $ffile1);
99    push @ffiles,$ffile2 if (defined $ffile2);
100    push @ffiles,$ffile3 if (defined $ffile3);
101}
102if (@ffiles) {
103    pb_log(2,"DEBUG ffiles: ".Dumper(\@ffiles)."\n");
104
105    foreach my $f (@ffiles) {
106        open(CONF,$f) || next;
107        while(<CONF>)  {
108            if (/^\s*([A-z0-9-_]+)\s+([[A-z0-9-_]+)\s*=\s*(.+)$/) {
109                $h{$1}{$2}=$3;
110            }
111        }
112        close(CONF);
113
114        $ptr = $h{"filter"};
115        pb_log(2,"DEBUG f:".Dumper($ptr)."\n");
116    }
117}
118return($ptr);
119}
120
121=item B<pb_filter_file_pb>
122
123This function applies all filters to pb build files.
124
125It takes 15 parameters. To be filtered a variable has to be passed to that function.
126
127The first parameter is the file to filter.
128The second parameter is the pointer on the hash of filters.
129The third parameter is the destination file after filtering.
130The fourth parameter is the distribution type.
131The fifth parameter is the suffix of the distribution.
132The sixth parameter is the package name.
133The seventh parameter is the version of the package.
134The eighth parameter is the tag of the package.
135The nineth parameter is the revision of the package.
136The tenth parameter is the current date.
137The eleventh parameter is the list of required packages.
138The twelveth parameter is the list of optional packages.
139The thirteenth parameter is the packager name.
140The fourteenth parameter is the changelog.
141The fifteenth parameter is the project.
142
143=cut
144
145sub pb_filter_file_pb {
146
147my $f=shift;
148my $ptr=shift;
149my %filter=%$ptr;
150my $destfile=shift;
151my $dtype=shift;
152my $pbsuf=shift;
153my $pbpkg=shift;
154my $pbver=shift;
155my $pbtag=shift;
156my $pbrev=shift;
157my $pbdate=shift;
158my $defpkgdir = shift;
159my $extpkgdir = shift;
160my $pbpackager = shift;
161my $chglog = shift || undef;
162my $pbproj = shift;
163
164pb_log(2,"DEBUG: From $f to $destfile\n");
165pb_mkdir_p(dirname($destfile)) if (! -d dirname($destfile));
166open(DEST,"> $destfile") || die "Unable to create $destfile";
167open(FILE,"$f") || die "Unable to open $f: $!";
168while (<FILE>) {
169    my $line = $_;
170    foreach my $s (keys %filter) {
171        # Process single variables
172        pb_log(2,"DEBUG filter{$s}: $filter{$s}\n");
173        my $tmp = $filter{$s};
174        next if (not defined $tmp);
175        # Expand variables if any single one found
176        pb_log(2,"DEBUG tmp: $tmp\n");
177        if ($tmp =~ /\$/) {
178            eval { $tmp =~ s/(\$\w+)/$1/eeg };
179        # special case for ChangeLog only for pb
180        } elsif (($s =~ /^PBLOG$/) && ($line =~ /^PBLOG$/)) {
181            my $p = $defpkgdir->{$pbpkg};
182            $p = $extpkgdir->{$pbpkg} if (not defined $p);
183            pb_changelog($dtype, $pbpkg, $pbver, $pbtag, $pbsuf, $p, \*DEST, $tmp, $chglog);
184            $tmp = "";
185        }
186        $line =~ s|$s|$tmp|;
187    }
188    print DEST $line;
189}
190close(FILE);
191close(DEST);
192}
193
194=item B<pb_filter_file_inplace>
195
196This function applies all filters to a file in place.
197
198It takes 9 parameters.
199
200The first parameter is the pointer on the hash of filters.
201The second parameter is the destination file after filtering.
202The third parameter is the package name.
203The fourth parameter is the version of the package.
204The fifth parameter is the tag of the package.
205The sixth parameter is the revision of the package.
206The seventh parameter is the current date.
207The eighth parameter is the packager name.
208The nineth parameter is the project name.
209
210=cut
211
212# Function which applies filter on files (external call)
213sub pb_filter_file_inplace {
214
215my $ptr=shift;
216my %filter=%$ptr;
217my $destfile=shift;
218my $pbpkg=shift;
219my $pbver=shift;
220my $pbtag=shift;
221my $pbrev=shift;
222my $pbdate=shift;
223my $pbpackager=shift;
224my $pbproj=shift;
225
226my $cp = "$ENV{'PBTMP'}/".basename($destfile);
227copy($destfile,$cp) || die "Unable to create $cp";
228
229pb_filter_file($cp,$ptr,$destfile,$pbpkg,$pbver,$pbtag,$pbrev,$pbdate,$pbpackager,$pbproj);
230unlink $cp;
231}
232
233=item B<pb_filter_file>
234
235This function applies all filters on a file to generate a new filtered one.
236
237It takes 10 parameters. To be filtered a variable has to be passed to that function.
238
239The first parameter is the original file to filter.
240The second parameter is the pointer on the hash of filters.
241The third parameter is the destination file after filtering.
242The fourth parameter is the package name.
243The fifth parameter is the version of the package.
244The sixth parameter is the tag of the package.
245The seventh parameter is the revision of the package.
246The eighth parameter is the current date.
247The nineth parameter is the packager name.
248The tenth parameter is the project name.
249
250=cut
251
252
253# Function which applies filter on files (external call)
254sub pb_filter_file {
255
256my $f=shift;
257my $ptr=shift;
258my %filter=%$ptr;
259my $destfile=shift;
260my $pbpkg=shift;
261my $pbver=shift;
262my $pbtag=shift;
263my $pbrev=shift;
264my $pbdate=shift;
265my $pbpackager=shift;
266my $pbproj=shift;
267
268pb_log(2,"DEBUG: From $f to $destfile\n");
269pb_mkdir_p(dirname($destfile)) if (! -d dirname($destfile));
270open(DEST,"> $destfile") || die "Unable to create $destfile";
271open(FILE,"$f") || die "Unable to open $f: $!";
272while (<FILE>) {
273    my $line = $_;
274    foreach my $s (keys %filter) {
275        # Process single variables
276        pb_log(2,"DEBUG filter{$s}: $filter{$s}\n");
277        my $tmp = $filter{$s};
278        next if (not defined $tmp);
279        # Expand variables if any single one found
280        if ($tmp =~ /\$/) {
281            eval { $tmp =~ s/(\$\w+)/$1/eeg };
282        }
283        $line =~ s|$s|$tmp|;
284    }
285    print DEST $line;
286}
287close(FILE);
288close(DEST);
289}
290
291=back
292
293=head1 WEB SITES
294
295The main Web site of the project is available at L<http://www.project-builder.org/>. Bug reports should be filled using the trac instance of the project at L<http://trac.project-builder.org/>.
296
297=head1 USER MAILING LIST
298
299None exists for the moment.
300
301=head1 AUTHORS
302
303The Project-Builder.org team L<http://trac.project-builder.org/> lead by Bruno Cornec L<mailto:bruno@project-builder.org>.
304
305=head1 COPYRIGHT
306
307Project-Builder.org is distributed under the GPL v2.0 license
308described in the file C<COPYING> included with the distribution.
309
310=cut
311
3121;
Note: See TracBrowser for help on using the repository browser.