source: soft/build_system/build_system/mkcd/tags/v2-6-5/pm/Mkcd/Disc.pm @ 1

Last change on this file since 1 was 1, checked in by fasma, 12 years ago

Initial Import from Mandriva's soft revision 224062 and package revision 45733

File size: 7.9 KB
Line 
1package Mkcd::Disc;
2
3my $VERSION = '0.0.1';
4
5use strict;
6use File::Path;
7use Mkcd::Functions;
8use Mkcd::Tools qw(du);
9
10=head1 NAME
11
12Disc - mkcd disc functions
13
14=head1 SYNOPSYS
15
16    require Mkcd::Disc;
17
18=head1 DESCRIPTION
19
20C<Mkcd::Disc> include the mkcd disc handling subroutines.
21
22=head1 SEE ALSO
23
24mkcd
25
26=head1 COPYRIGHT
27
28Copyright (C) 2000,2001 MandrakeSoft <warly@mandrakesoft.com>
29
30This program is free software; you can redistribute it and/or modify
31it under the terms of the GNU General Public License as published by
32the Free Software Foundation; either version 2, or (at your option)
33any later version.
34
35This program is distributed in the hope that it will be useful,
36but WITHOUT ANY WARRANTY; without even the implied warranty of
37MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
38GNU General Public License for more details.
39
40You should have received a copy of the GNU General Public License
41along with this program; if not, write to the Free Software
42Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
43
44=cut
45
46# FIXME must add space for synthesis, however they are negligeable compared to hdlist. Only
47# a pb with very small CD.
48
49my $config;
50
51sub new {
52    my ($class, $conf) = @_;
53    $config = $conf;
54    bless {
55           config       => $conf,
56           functions    => new Mkcd::Functions($config)
57          }, $class;
58}
59
60sub guessHdlistSize{
61    my ($class,$group,$size,$cdsize,$lists,$discsFiles) = @_;
62    my $depsRep = "$config->{tmp}/$class->{config}{name}/$group->{depsrep}";
63    print {$config->{LOG}} "guessHdlistSize: depsRep $depsRep\n";
64    # FIXME heuristic for hdlist size on installation disc, (RPMS size / 100) per discs
65    my $depsSize = du("$depsRep");
66    my $instdisc = $group->{installDisc};
67    my $sz;
68    # keeping curdone outside the list loop could correct the mis value if multiple reps on one discs
69    my %curdone;
70    my @notdone;
71    foreach my $list (keys %{$group->{list}}){
72        if ($class->{config}{list}[$list]{auto}){
73            $sz += $depsSize
74        }else {
75            my $ok;
76            my $listsize = $group->{listsize}{$list};
77            foreach my $rd (@{$group->{list}{$list}}){
78                my ($cdrep,undef,undef,$opt) = @$rd;
79                if ($opt->{nodeps}) { $ok = 1; next }
80                $curdone{$cdrep} and next;
81                $curdone{$cdrep} = 1;
82                if ($lists->{$cdrep}){
83                    if ($listsize > $cdsize->[$cdrep]){
84                        $lists->{$cdrep} and $sz += $cdsize->[$cdrep] / 130;
85                        $listsize -= $cdsize->[$cdrep];
86                    }else{
87                        $lists->{$cdrep} and $sz += $listsize / 130;
88                        last
89                    }
90                }
91            }
92            $ok and push @notdone, $list       
93        }
94    }
95    print {$config->{LOG}} "guessHdlistSize: reserving ";
96    if ($depsSize < $sz){ print {$config->{LOG}} "$depsSize" ;$size->[$instdisc] += $depsSize } else { print {$config->{LOG}} "$sz"; $size->[$instdisc] += $sz }
97    print {$config->{LOG}} " (new size $size->[$instdisc]) on disc $instdisc ($depsSize/$sz) for dependencies files\n";
98    @notdone or return 1;
99    my $sz;
100    foreach my $list (@notdone){
101        foreach my $rd (@{$group->{list}{$list}}){
102            my ($cd,$rep,$repopt,$opt) = @$rd;
103            if ($lists->{$cd} == 1){
104                $sz += du("$class-{config}{topdir}/build/$class->{config}{name}/$cd/$class->{config}{disc}[$cd]{function}{data}{dir}{$rep}")
105            }elsif ($lists->{$cd} == 2){
106                foreach my $rpm (keys %{$discsFiles->[$cd]{$rep}}){
107                    $sz += du("$discsFiles->[$cd]{$rep}{$rpm}/$rpm.rpm")
108                }
109            }
110        }
111    }
112    $sz /= 130;
113    print {$config->{LOG}} "guessHdlistSize: reserving ";
114    print {$config->{LOG}} "$sz"; $size->[$instdisc] += $sz;
115    print {$config->{LOG}} " (new size $size->[$instdisc]) on disc $instdisc ($sz) for extra dependencies files\n"
116}               
117
118sub getBuiltDiscs{
119    my ($class, $lists, $group, $discsFiles) = @_;
120    foreach my $l (keys %{$group->{list}}){
121        my @rpmlist;
122        ref $group->{list}{$l} and push @rpmlist, @{$group->{list}{$l}};
123        ref $group->{sourcerep}{$l} and push @rpmlist, @{$group->{sourcerep}{$l}};
124        for (my $i; $i < @rpmlist; $i++){
125            my ($cd,$rep,$repopt) = @{$rpmlist[$i]};
126            $lists->{$cd} == 1 or next;
127            my $dir = "$class->{config}{topdir}/build/$class->{config}{name}/$cd/$class->{config}{disc}[$cd]{function}{data}{dir}{$rep}";
128            #
129            # FIXME maybe need to unshift instead of push
130            #
131            $repopt->{source} or push @{$class->{config}{list}[$l]{packages}}, [$dir];
132            $class->{config}{list}[$l]{disc}{$cd}{$rep}{done} = 1;
133            print {$config->{LOG}} "getBuiltDiscs: get files from $dir\n";
134            local *A; opendir A,$dir;
135            foreach (readdir A){
136                /(.*)\.rpm/ or next;
137                # FIXME need to check if it is well placed in getList function
138                # $group->{done}{$rpm} = $group->{orderedrep}{"$cd/$rep"};
139                $discsFiles->[$cd]{$rep}{$1} = $dir
140            }
141        }
142    }
143    1
144}
145
146sub makeDiscs {
147    my ($class, $fixed, $lists, $cds, $size, $mkisos, $discsFile, $cdfile) = @_;
148    my $dir;
149    my $name = $class->{config}{name};
150    my $topdir = $class->{config}{topdir};
151
152    if (!$class->{config}{nolive}){
153        $dir = "$topdir/build/$name";
154        -d "$dir" or mkpath "$dir";
155    }else{
156        $dir = "$config->{tmp}/build/$name";
157        -d "$dir" or mkpath "$dir";
158    }
159    print {$config->{LOG}} "makeDiscs: Discs @$cds TOPDIR $dir\n";
160    foreach my $i (@$cds){
161        $lists->{$i} > 1 or next;
162        my $cd = $class->{config}{disc}[$i];
163        if (!$fixed){
164            print {$config->{LOG}} "Fixed part of disc $i\n";
165            if ($class->{config}{nolive}){
166                print {$config->{LOG}} "generic: removing $dir/$i.list\n";
167                -f "$dir/$i.list" and unlink "$dir/$i.list";
168            }else{
169                rmtree "$topdir/build/$name/$i";
170                rmtree "$topdir/build/$name/first/$i"
171            }
172        }else {print {$config->{LOG}} "Finalizing disc $i\n"}
173        my $sz;
174        for (my $j; $j < @{$cd->{steps}}; $j++){
175            my $name = $cd->{steps}[$j][0];
176            print {$config->{LOG}} "makeDiscs: $name ($fixed)\n";
177            if (defined $Mkcd::Functions::{$name}) { $sz += &{$Mkcd::Functions::{$name}}($class->{disc}->{functions},$cd->{steps}[$j],$dir,$fixed,$class->{config}{nolive},$i,$cd,$cdfile,$lists,$mkisos,$discsFile)}
178            else {print {$config->{LOG}} "ERROR: unrecognized function name $name\n"}
179            print {$config->{LOG}} "SIZE ($name) $sz\n";
180        }
181        if ($class->{config}{nolive}){
182            print {$config->{LOG}} "SIZE $size->[$i] + $sz\n";
183            $size->[$i] += $sz
184        }else{
185            $size->[$i] = du("$dir/$i") + $sz
186        }
187        print {$config->{LOG}} "disc $i ($dir/$i) size: $size->[$i] ($sz)\n";
188        my $mkisoopt = $class->{config}{mkisoopt};
189        if ($fixed) {
190            my $isodir = $class->{config}{isodir} ? $class->{config}{isodir} : "$topdir/iso/$name";
191            if ($class->{config}{nolive}){
192                $mkisos->[$i] = "mkisofs $mkisoopt -graft-points " . (-f "$dir/$i.list" ? " -path-list $dir/$i.list " : "") . " -V $cd->{serial} -o $isodir/$i-$name.iso $mkisos->[$i]"
193            }else{
194                if ($mkisos->[$i]) { $mkisos->[$i] = "mkisofs $mkisoopt -V $cd->{serial} -o $isodir/$i-$name.iso $mkisos->[$i]"}
195                else { $mkisos->[$i] = qq|mkisofs $mkisoopt -V $cd->{serial} -o "$isodir/$i-$name".iso "$dir/$i"|}
196            }
197        }
198    }
199    !$fixed and return 1;
200    if (!$class->{config}{noiso}){
201        -d "$topdir/iso/$name" or mkpath "$topdir/iso/$name"; 
202        foreach my $i (@$cds){
203            $lists->{$i} > 1 or next;
204            print {$config->{LOG}} "MKISOFS disc $i $mkisos->[$i]\n";
205            my $err = system $mkisos->[$i];
206            $err or print {$config->{LOG}} "ERROR: disc $i $mkisos->[$i] failed ($!)\n";
207            $size->[$i] = du("$topdir/iso/$name/$i-$name.iso")
208        }
209    }
210    1
211}
212
213sub checkSize{
214    my ($class, $n,$size,$cdsize,$rejected) = @_;
215    my $ok;
216    for (my $i; $i < @$size; $i++) {
217        $size->[$i] or next;
218        my $origcdsize = $class->{config}{disc}[$i]{size};
219        if ($size->[$i] > $origcdsize) {
220            my $d = ($size->[$i] - $cdsize->[$i]);
221            if ($d > 0) { 
222                $ok = 0;
223                $cdsize->[$i] -= $d;
224                print {$config->{LOG}} "ERROR: disc $i is too big ($size->[$i] > $origcdsize (new disc size $cdsize->[$i])\n" }
225            }elsif ($rejected){
226                my $d = ($cdsize->[$i] - $size->[$i]);
227                if ($d > $origcdsize/1000) { 
228                    $ok = 0;
229                    $cdsize->[$i] += $d;
230                    print {$config->{LOG}} "ERROR: disc $i is too small ($size->[$i] < $origcdsize (new disc size $cdsize->[$i])\n" }
231            }
232        }
233        return $ok
234}
235
2361
Note: See TracBrowser for help on using the repository browser.