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

Last change on this file since 916 was 916, checked in by bruno, 10 years ago
  • Improves Debian support by a/ allowing PBDESC to be used in control file with space prepended. b/ prepend 0 to non digit versions such as devel. c/ creating debian pbfilter files for PBDEBSTD and PBDEBCOMP macros used in control.
  • Uses pbtag for ebuild and pkg packages
  • Improves pb Solaris pkgs
  • Improves pb Debian pkgs (only some warnings remaining for lintian)
  • Adds a PBSUMMARY macro and use it. Now also generated for newproj.
File size: 7.2 KB
RevLine 
[5]1#!/usr/bin/perl -w
2#
[405]3# ProjectBuilder Filter module
4# Filtering subroutines brought by the the Project-Builder project
5# which can be easily used by pbinit
[5]6#
7# $Id$
8#
9# Copyright B. Cornec 2007
10# Provided under the GPL v2
11
[405]12package ProjectBuilder::Filter;
[9]13
[18]14use strict 'vars';
[9]15use Data::Dumper;
16use English;
[16]17use File::Basename;
[26]18use File::Copy;
[17]19use lib qw (lib);
[318]20use ProjectBuilder::Base;
[405]21use ProjectBuilder::Changelog;
[5]22
[405]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);
[5]32
[331]33=pod
34
35=head1 NAME
36
[409]37ProjectBuilder::Filter, part of the project-builder.org
[331]38
39=head1 DESCRIPTION
40
[409]41This module provides filtering functions suitable for pbinit calls.
[331]42
[427]43=over 4
44
[409]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
[331]59=cut
60
[395]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
[499]121=item B<pb_filter_file>
[409]122
[499]123This function applies all filters to files.
[409]124
[499]125It takes 4 parameters.
[409]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.
[499]130The fourth parameter is the pointer on the hash of variables to filter (tag, ver, ...)
[409]131
132=cut
133
[499]134sub pb_filter_file {
[395]135
136my $f=shift;
137my $ptr=shift;
138my %filter=%$ptr;
139my $destfile=shift;
[499]140my $pb=shift;
[395]141
142pb_log(2,"DEBUG: From $f to $destfile\n");
143pb_mkdir_p(dirname($destfile)) if (! -d dirname($destfile));
[473]144open(DEST,"> $destfile") || die "Unable to create $destfile: $!";
[395]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);
[500]152        pb_log(3,"DEBUG filter{$s}: $filter{$s}\n");
[395]153        # Expand variables if any single one found
154        if ($tmp =~ /\$/) {
[500]155            # Order is important as we need to handle hashes refs before simple vars
156            eval { $tmp =~ s/(\$\w+-\>\{\'\w+\'\})/$1/eeg };
[395]157            eval { $tmp =~ s/(\$\w+)/$1/eeg };
[916]158            if (($s =~ /^PBDESC$/) && ($line =~ /^ PBDESC/)) {
159                # if on debian, we need to preserve the space before each desc line
160                pb_log(3,"*** DEBIAN CASE ADDING SPACE ***\n");
161                $tmp =~ s/\$\//\$\/ /g;
162                pb_log(3,"*** tmp:$tmp ***\n");
163            }
[462]164            eval { $tmp =~ s/(\$\/)/$1/eeg };
[395]165        } elsif (($s =~ /^PBLOG$/) && ($line =~ /^PBLOG$/)) {
[916]166            # special case for ChangeLog only for pb
[500]167            pb_log(3,"DEBUG filtering PBLOG\n");
[585]168            pb_changelog($pb, \*DEST, $tmp);
[395]169            $tmp = "";
[499]170        } elsif (($s =~ /^PBPATCHSRC$/) && ($line =~ /^PBPATCHSRC$/)) {
[500]171            pb_log(3,"DEBUG filtering PBPATCHSRC\n");
[499]172            my $i = 0;
[500]173            foreach my $p (split(/,/,$pb->{'patches'}->{$pb->{'tuple'}})) {
174                print DEST "Patch$i:         ".basename($p).".gz\n";
175                $i++;
[499]176            }
177            $tmp = "";
178        } elsif (($s =~ /^PBPATCHCMD$/) && ($line =~ /^PBPATCHCMD$/)) {
[500]179            pb_log(3,"DEBUG filtering PBPATCHCMD\n");
[499]180            my $i = 0;
[500]181            foreach my $p (split(/,/,$pb->{'patches'}->{$pb->{'tuple'}})) {
182                print DEST "%patch$i -p1\n";
183                $i++;
[499]184            }
185            print DEST "\n";
186            $tmp = "";
[395]187        }
[475]188        $line =~ s|$s|$tmp|g;
[395]189    }
190    print DEST $line;
191}
192close(FILE);
193close(DEST);
194}
195
[409]196=item B<pb_filter_file_inplace>
197
198This function applies all filters to a file in place.
199
[499]200It takes 3 parameters.
[409]201
202The first parameter is the pointer on the hash of filters.
203The second parameter is the destination file after filtering.
[499]204The third parameter is the pointer on the hash of variables to filter (tag, ver, ...)
[409]205
206=cut
207
[395]208# Function which applies filter on files (external call)
209sub pb_filter_file_inplace {
210
211my $ptr=shift;
212my %filter=%$ptr;
213my $destfile=shift;
[499]214my $pb=shift;
[395]215
216my $cp = "$ENV{'PBTMP'}/".basename($destfile);
[500]217copy($destfile,$cp) || die "Unable to copy $destfile to $cp";
[395]218
[499]219pb_filter_file($cp,$ptr,$destfile,$pb);
[395]220unlink $cp;
221}
222
[409]223
224=back
225
226=head1 WEB SITES
227
228The 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/>.
229
230=head1 USER MAILING LIST
231
232None exists for the moment.
233
234=head1 AUTHORS
235
236The Project-Builder.org team L<http://trac.project-builder.org/> lead by Bruno Cornec L<mailto:bruno@project-builder.org>.
237
238=head1 COPYRIGHT
239
240Project-Builder.org is distributed under the GPL v2.0 license
241described in the file C<COPYING> included with the distribution.
242
243=cut
244
[395]2451;
Note: See TracBrowser for help on using the repository browser.