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

Revision 585, 7.0 KB checked in by bruno, 5 years ago (diff)
  • Change pb_announce interface
  • Fix announce bug where changes were not displayed
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>
122
123This function applies all filters to files.
124
125It takes 4 parameters.
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 pointer on the hash of variables to filter (tag, ver, ...)
131
132=cut
133
134sub pb_filter_file {
135
136my $f=shift;
137my $ptr=shift;
138my %filter=%$ptr;
139my $destfile=shift;
140my $pb=shift;
141
142pb_log(2,"DEBUG: From $f to $destfile\n");
143pb_mkdir_p(dirname($destfile)) if (! -d dirname($destfile));
144open(DEST,"> $destfile") || die "Unable to create $destfile: $!";
145open(FILE,"$f") || die "Unable to open $f: $!";
146while (<FILE>) {
147        my $line = $_;
148        foreach my $s (keys %filter) {
149                # Process single variables
150                my $tmp = $filter{$s};
151                next if (not defined $tmp);
152                pb_log(3,"DEBUG filter{$s}: $filter{$s}\n");
153                # Expand variables if any single one found
154                if ($tmp =~ /\$/) {
155                        # Order is important as we need to handle hashes refs before simple vars
156                        eval { $tmp =~ s/(\$\w+-\>\{\'\w+\'\})/$1/eeg };
157                        eval { $tmp =~ s/(\$\w+)/$1/eeg };
158                        eval { $tmp =~ s/(\$\/)/$1/eeg };
159                # special case for ChangeLog only for pb
160                } elsif (($s =~ /^PBLOG$/) && ($line =~ /^PBLOG$/)) {
161                        pb_log(3,"DEBUG filtering PBLOG\n");
162                        pb_changelog($pb, \*DEST, $tmp);
163                        $tmp = "";
164                } elsif (($s =~ /^PBPATCHSRC$/) && ($line =~ /^PBPATCHSRC$/)) {
165                        pb_log(3,"DEBUG filtering PBPATCHSRC\n");
166                        my $i = 0;
167                        foreach my $p (split(/,/,$pb->{'patches'}->{$pb->{'tuple'}})) {
168                                print DEST "Patch$i:         ".basename($p).".gz\n";
169                                $i++;
170                        }
171                        $tmp = "";
172                } elsif (($s =~ /^PBPATCHCMD$/) && ($line =~ /^PBPATCHCMD$/)) {
173                        pb_log(3,"DEBUG filtering PBPATCHCMD\n");
174                        my $i = 0;
175                        foreach my $p (split(/,/,$pb->{'patches'}->{$pb->{'tuple'}})) {
176                                print DEST "%patch$i -p1\n";
177                                $i++;
178                        }
179                        print DEST "\n";
180                        $tmp = "";
181                }
182                $line =~ s|$s|$tmp|g;
183        }
184        print DEST $line;
185}
186close(FILE);
187close(DEST);
188}
189
190=item B<pb_filter_file_inplace>
191
192This function applies all filters to a file in place.
193
194It takes 3 parameters.
195
196The first parameter is the pointer on the hash of filters.
197The second parameter is the destination file after filtering.
198The third parameter is the pointer on the hash of variables to filter (tag, ver, ...)
199
200=cut
201
202# Function which applies filter on files (external call)
203sub pb_filter_file_inplace {
204
205my $ptr=shift;
206my %filter=%$ptr;
207my $destfile=shift;
208my $pb=shift;
209
210my $cp = "$ENV{'PBTMP'}/".basename($destfile);
211copy($destfile,$cp) || die "Unable to copy $destfile to $cp";
212
213pb_filter_file($cp,$ptr,$destfile,$pb);
214unlink $cp;
215}
216
217
218=back
219
220=head1 WEB SITES
221
222The 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/>.
223
224=head1 USER MAILING LIST
225
226None exists for the moment.
227
228=head1 AUTHORS
229
230The Project-Builder.org team L<http://trac.project-builder.org/> lead by Bruno Cornec L<mailto:bruno@project-builder.org>.
231
232=head1 COPYRIGHT
233
234Project-Builder.org is distributed under the GPL v2.0 license
235described in the file C<COPYING> included with the distribution.
236
237=cut
238
2391;
Note: See TracBrowser for help on using the repository browser.