source: soft/build_system/build_system/upload/robot/trunk/gendistrib @ 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: 22.6 KB
Line 
1#!/usr/bin/perl
2
3(our $VERSION) = q$Id: gendistrib 939 2006-07-10 12:03:34Z mandrake $ =~ /(\d+\.\d+)/;
4
5use strict;
6use Cwd;
7use URPM;
8use URPM::Build;
9use Getopt::Long;
10use MDV::Distribconf::Build;
11use MDV::Packdrakeng;
12use Pod::Usage;
13use MDK::Common qw(all);
14use File::Temp 'mktemp';
15
16my $urpm = new URPM;
17my $tempdir = -d $ENV{TMPDIR} ? $ENV{TMPDIR} : -d "$ENV{HOME}/tmp" ? "$ENV{HOME}/tmp" : "/tmp";
18my $headers_dir = $tempdir . "/.build_hdlist";
19
20sub usage () {
21    pod2usage({ -verbose => 1 });
22    exit 0;
23}
24
25my %urpmfiles;
26
27GetOptions(
28    'blind' => \my $blind,
29    'compss=s' => \$urpmfiles{compss},
30    'depslist=s' => \$urpmfiles{depslist},
31    'destdir=s' => \my $destdir,
32    'fast' => \my $fast,
33    'hdlists=s' => \$urpmfiles{hdlists},
34    'headersdir=s' => \$headers_dir,
35    'help|h' => \&usage,
36    'mediacfg=s' => \$urpmfiles{mediacfg},
37    'nobadrpm' => \my $dontdie,
38    'nochkdep' => \my $nochkdep,
39    'noclean' => \my $noclean,
40    'noemptymedia' => \my $noemptymedia,
41    'nomd5sum' => \my $nomd5sum,
42    'nomediainfo' => \my $nomediainfo,
43    'provides=s' => \$urpmfiles{provides},
44    'skipmissingdir' => \my $skipmissingdir,
45    's' => \my $nooutput,
46    'v|version' => sub { warn "$0 version $VERSION\n"; exit 0 },
47);
48
49(my @root = grep { $_ } @ARGV) > 0 or usage();
50
51my $distrib = MDV::Distribconf::Build->new($root[0]);
52
53$distrib->loadtree or die "$root[0] does not seem to be a distribution tree\n";
54
55if (defined($urpmfiles{mediacfg})) {
56    $distrib->parse_mediacfg($urpmfiles{mediacfg}) or die "Can't read $urpmfiles{mediacfg}\n";
57} elsif (defined($urpmfiles{hdlists})) {
58    $distrib->parse_hdlists($urpmfiles{hdlists}) or die "Can't read $urpmfiles{hdlists}\n";
59} else {
60    $distrib->parse_mediacfg || $distrib->parse_hdlists or die "Can't read the distrib config\n";
61}
62
63my $destinfodir = $destdir ?
64    $destdir . '/' . $distrib->getpath(undef, "infodir") :
65    $distrib->getfullpath(undef, "infodir");
66
67my %default_urpmfiles = (
68    depslist => $destinfodir . "/depslist.ordered",
69    provides => $destinfodir . "/provides",
70    compss =>   $destinfodir . "/compss",
71    version =>  $destdir ?
72        $destdir . $distrib->getpath(undef, "VERSION") :
73        $distrib->getfullpath(undef, "VERSION"),
74    md5sum =>   $destinfodir . "/MD5SUM",
75);
76
77while (my ($k, $v) = each(%default_urpmfiles)) {
78    $urpmfiles{$k} ||= $v;
79}
80
81$distrib->check(\*STDERR) unless $nooutput;
82
83my @hdlists;
84my @media_missing_dirs;
85foreach ($distrib->listmedia) {
86    $distrib->getvalue($_, 'askmedia') || $distrib->getvalue($_, 'suppl') and next;
87
88
89    if (! -d ($distrib->getfullpath($_, 'path'))) {
90        if ($skipmissingdir) {
91            printf(STDERR
92                "Skipping missing media %s\n",
93                $distrib->getpath($_, 'path')
94            ) unless $nooutput;
95        } else {
96            # delaying error report to report all errors, not only the first ones
97            push(@media_missing_dirs, $_);
98        }
99        next;
100    }
101
102    push @hdlists, {
103        synthesis => $destdir ?
104            $destdir . '/' . $distrib->getpath($_, 'synthesis') :
105            $distrib->getfullpath($_, 'synthesis'),
106        hdlist => $destdir ?
107            $destdir . '/' .$distrib->getpath($_, 'hdlist') :
108            $distrib->getfullpath($_, 'hdlist'),
109        dir => $distrib->getpath($_, 'path'),
110        descr => $distrib->getvalue($_, 'name'),
111        mediainfo => $destdir ?
112            $destdir . '/' . $distrib->getpath(undef, 'infodir') :
113            $distrib->getfullpath(undef, 'infodir'),
114        thismediainfo => ($destdir ?
115            $destdir . '/' . $distrib->getpath($_, 'path') :
116            $distrib->getfullpath($_, 'path')) . "/media_info",
117        synthesis2 => ($destdir ?
118            $destdir . '/' . $distrib->getpath($_, 'path') :
119            $distrib->getfullpath($_, 'path')) . "/media_info/synthesis.hdlist.cz",
120        hdlist2 => ($destdir ?
121            $destdir . '/' . $distrib->getpath($_, 'path') :
122            $distrib->getfullpath($_, 'path')) . "/media_info/hdlist.cz",
123        md5sum => ($destdir ?
124            $destdir . '/' . $distrib->getpath($_, 'path') :
125            $distrib->getfullpath($_, 'path')) . "/media_info/MD5SUM",
126    };
127}
128
129# if there is result here, $skipmissingdir is not set and there is errors:
130if (@media_missing_dirs) {
131    foreach my $media (@media_missing_dirs) {
132        printf(STDERR
133            "Missing dir '%s' for media '%s'\n",
134            $distrib->getpath($media, 'path'),
135            $distrib->getvalue($media, 'name')
136        ) unless $nooutput;
137    }
138    die "Stopping because dirs are missing, specify --skipmissingdir to ignore\n";
139}
140
141if (!-d $destinfodir) {
142    mkdir $destinfodir, 0755
143        or die qq(Can't create directory "$destinfodir": $!\n);
144}
145
146foreach my $e (@hdlists) {
147    for my $d (qw(mediainfo thismediainfo)) {
148        if (! -d $e->{$d}) {
149            mkdir $e->{$d}, 0755
150                or die qq(Can't create directory "$e->{$d}": $!\n);
151        }
152    }
153}
154
155sub clean_cache {
156    unless ($noclean) {
157        system($ENV{LD_LOADER} ? $ENV{LD_LOADER} : @{[]}, "rm", "-rf", $headers_dir);
158        mkdir $headers_dir
159            or die qq(Can't create directory "$headers_dir": $!\n);
160    }
161}
162
163clean_cache();
164
165my $to_build = [];
166my $to_remove = [];
167my @hdlist_path;
168foreach (0..$#hdlists) {
169    my $e = $hdlists[$_];
170    my $r;
171    $to_build->[$_] = [];
172    $to_remove->[$_] = {};
173
174    #- try to find the right repository where can be found the directory
175    #- listed in the hdlist file.
176    #- if the number of roots is equal to the number of media, assume one
177    #- media per root, else try to find a valid root containing the media.
178    $r ||= $root[0];
179    if (scalar(@hdlists) == scalar(@root)) {
180        $r = $root[$_];
181    } else {
182        foreach (@root) {
183            -d "$_/$e->{dir}" and $r = $_, last;
184        }
185    }
186
187    #- fake build of architecture dependent directory.
188    my @files;
189    if ($e->{dir} =~ /%{ARCH}/) {
190        foreach my $arch (qw(i686 i586 i486 i386 k8 k7 k6 amd64 amd32 x86_64 x86_32 ia64 ia32
191                             ppc sparc sparc32 sparc64 alpha noarch)) {
192            my $dir = $e->{dir};
193            $dir =~ s|%{ARCH}|$arch|g;
194            push @files, glob("$r/$dir/*.$arch.rpm");
195        }
196    } else {
197        push @files, glob("$r/$e->{dir}/*.rpm");
198    }
199    @files or do {
200        print STDERR "unable to find rpm files in $e->{dir}\n" unless $nooutput;
201        next;
202    };
203
204    my @headers;
205    if ($fast) {
206        print STDERR "listing rpm files in directory $r/$e->{dir}\n" unless $nooutput;
207        $hdlist_path[$_] = "$r/$e->{dir}";
208        @headers = grep { s/\.rpm$// } all("$r/$e->{dir}")
209    } else {
210        print STDERR "parsing rpm files in directory $r/$e->{dir}\n" unless $nooutput;
211        @headers = $urpm->parse_rpms_build_headers(
212            dir  => $headers_dir,
213            rpms => \@files,
214            dontdie => $dontdie,
215            silent => $nooutput,
216        );
217        # TODO if @headers is empty ?
218        $e->{headers} = \@headers;
219    }
220    if (!$blind) {
221        # checking if hdlist rebuild is needed
222        print STDERR "Checking if hdlist need to be rebuild for media $e->{descr}\n" unless $nooutput;
223        if ($fast) {
224            print "Comparing headers with synthesis\n";
225            if(!compare_headers_with_synthesis($e->{synthesis}, $to_build->[$_], $to_remove->[$_], @headers)) {
226                $e->{noneedrebuild} = 1;
227                print "No\n" unless $nooutput;
228            } else {
229                print "Yes\n" unless $nooutput;
230            }
231        } else {
232            print "Comparing headers with hdlist\n";
233            if(!compare_headers_with_hdlist($e->{hdlist}, @headers)) {
234                $e->{noneedrebuild} = 1;
235                print "No\n" unless $nooutput;
236            } else {
237                print "Yes\n" unless $nooutput;
238            }
239        }
240    }
241}
242
243# return 1 if differ, 0 otherwise
244sub compare_headers_with_hdlist {
245    my ($hdlist, @headers) = @_;
246    if (my $pack = MDV::Packdrakeng->open(archive => $hdlist)) {
247        my %exists_headers;
248        $exists_headers{$_} = 0 foreach(@headers);
249        my (undef, $files, undef) = $pack->getcontent();
250        foreach my $file (@{$files || []}) {
251            if (exists($exists_headers{$file})) {
252                # TODO checking somethings else that name
253                delete($exists_headers{$file});
254            } else {
255                print "$file differs\n";
256                # one file is in hdlist, not in our headers => differ
257                return 1;
258            }
259        }
260        # if the same files are in hdlist, and headers list,
261        # nothing left
262        if (keys %exists_headers) {
263            return 1;
264        }
265    } else {
266        # no valid hdlist, it differ for sure !
267        return 1;
268    }
269    return 0; # no diff
270}
271
272sub compare_headers_with_synthesis {
273    my ($synthesis, $to_build, $to_remove, @headers) = @_;
274    if (open my $pack, "zcat $synthesis |") {
275        my %exists_headers;
276        $exists_headers{$_} = 0 foreach(@headers);
277        while (<$pack>) {
278            my ($file) = /^\@info\@([^@]+)\@/ or next;
279            if (exists($exists_headers{$file})) {
280                # TODO checking somethings else that name
281                delete($exists_headers{$file});
282            } else {
283                # one file is in hdlist, not in our headers => differ
284                $to_remove->{$file} = 1
285            }
286        }
287        # if the same files are in hdlist, and headers list,
288        # nothing left
289        if (keys %exists_headers) {
290            push @$to_build, keys %exists_headers;
291            return 1;
292        } 
293        return 1 if (%$to_remove) 
294    } else {
295        # no valid synthesis, it differ for sure !
296        return 1;
297    }
298    return 0; # no diff
299}
300
301if ($fast) {
302    foreach my $hid (0 .. $#hdlists) {
303        my $e = $hdlists[$hid];
304        if ($e->{noneedrebuild}) { next }
305        print "TO ADD @{$to_build->[$hid]}\n";
306        print "TO REMOVE ", join(' ', keys %{$to_remove->[$hid]}), "\n";
307        my %rpm_to_add;
308        foreach (@{$to_build->[$_]}) {
309            my ($name, $arch) = /(.*)-[^-]+-[^-]+\.([^.]+)$/ or next;
310            $rpm_to_add{$arch}{$name} = $_
311        }       
312        my %done;
313        my $build_urpm = new URPM;
314        my ($start, $end) = $build_urpm->parse_hdlist($e->{hdlist});
315        $start == $end and next;
316        print "START: $start END: $end\n";
317        print "Extracting headers\n";
318        my %rpm_id;
319        foreach ($start .. $end) {
320            my $pkg = $build_urpm->{depslist}[$_];
321            my $filename = $pkg->fullname;
322            $rpm_id{$filename} = $_;
323            unless (-s "$headers_dir/$filename") {
324                open my $fh, ">$headers_dir/$filename" or die "unable to open $headers_dir/$filename for writing\n";
325                $pkg->build_header(fileno $fh);
326                close $fh;
327            }
328            push @{$e->{headers}}, $filename 
329        }
330        print "Rebuild synthesis $e->{synthesis}\n";
331        if (open my $pack, "zcat $e->{synthesis} |") {
332            my $temp_synthesis = $tempdir . '/synthesis' . $$;
333            unlink $temp_synthesis;
334            open my $new_synthesis, "| gzip - >'$temp_synthesis'";
335            binmode $new_synthesis;
336            my $info;
337            while (<$pack>) {
338                $info .= $_;
339                if (my ($rpm) = /^\@info\@([^@]+)\@/) {
340                    if ($to_remove->[$hid]{$rpm}) {
341                        my ($name, $arch) = $rpm =~ /(.*)-[^-]+-[^-]+\.([^.]+)$/;
342                        my $add = $rpm_to_add{$arch}{$name};
343                        print "$rpm ($name)\n";
344                        if ($add) {
345                            print "Replacing $rpm with $add\n";
346                            print "Parsing $hdlist_path[$hid]/$add.rpm\n";
347                            add_info("$hdlist_path[$hid]/$add.rpm", $new_synthesis, $build_urpm, $rpm_id{$rpm});
348                            $done{$add} = 1;
349                        } else {
350                            print "Removing $rpm\n"
351                        }
352                    } else {
353                        print $new_synthesis "$info";
354                    }
355                    $info = '';
356                }
357            }
358            foreach (@{$to_build->[$hid]}) {
359                $done{$_} and next;
360                print "Adding $_\n";
361                $end = add_info("$hdlist_path[$hid]/$_.rpm", $new_synthesis, $build_urpm);
362            }
363            close $new_synthesis;
364            system('/bin/mv', $temp_synthesis, "$e->{synthesis}");
365            close $pack
366        }
367        my $temp_hdlist = $tempdir . '/hdlist' . $$;
368        unlink $temp_hdlist;
369        print "START: $start END: $end\n";
370        print "Rebuilding $e->{hdlist}\n";
371        $build_urpm->build_hdlist(start  => $start,
372            end    => $end,
373            dir    => $headers_dir,
374            hdlist => $temp_hdlist,
375            ratio  => 9);
376        system('/bin/mv', $temp_hdlist, "$e->{hdlist}");
377
378        unless ($nomediainfo) {
379            print STDERR qq(link alternate locations of synthesis and hdlists\n) unless $nooutput;
380            unlink $e->{hdlist2}, $e->{synthesis2};
381            link $e->{hdlist}, $e->{hdlist2}
382                or print STDERR qq(link failed for "$e->{hdlist2}": $!\n);
383            link $e->{synthesis}, $e->{synthesis2}
384                or print STDERR qq(link failed for "$e->{synthesis2}": $!\n);
385        }
386        unless ($nomd5sum) {
387            print STDERR qq(generate media-specific MD5SUM in $e->{thismediainfo}\n) unless $nooutput;
388            my $here = getcwd();
389            chdir $e->{thismediainfo};
390            my $md5sum = `/usr/bin/md5sum hdlist* synthesis*`;
391            chdir $here;
392            if (open my $md5sumfh, '>', $e->{md5sum}) {
393                print $md5sumfh $md5sum;
394                close $md5sumfh;
395            } else {
396                print STDERR qq(Can't create "$e->{md5sum}": $!\n);
397            }
398        }
399    }
400    unless ($nomd5sum) {
401        my $here = getcwd();
402        chdir $destinfodir;
403        my $md5sum = `/usr/bin/md5sum hdlist* synthesis*`;
404        chdir $here;
405        if (open my $md5sumfh, '>', $urpmfiles{md5sum}) {
406            print $md5sumfh $md5sum;
407            close $md5sumfh;
408        } else {
409            print STDERR qq(Can't create "$urpmfiles{md5sum}": $!\n);
410        }
411    }
412    exit;
413}
414
415sub add_info {
416    my ($rpm, $fh, $build_urpm, $prev_id) = @_;
417    my $tmp_urpm;
418    if ($prev_id) {
419        print "Replacing $prev_id with $rpm\n";
420        $tmp_urpm = new URPM
421    } else {
422        $tmp_urpm = $build_urpm
423    }
424    my $id = $tmp_urpm->parse_rpm($rpm);
425    print "$rpm ID $id\n";
426    my $pkg = $tmp_urpm->{depslist}[$id];
427    die "FATAL: could not parse $rpm (id $id pkg $pkg)" if ! ref $pkg;
428    my $filename = $pkg->fullname;
429    unless (-s "$headers_dir/$filename") {
430        print "Creating $headers_dir/$filename\n";
431        open my $fh, ">$headers_dir/$filename" or die "unable to open $headers_dir/$filename for writing\n";
432        $pkg->build_header(fileno $fh);
433        close $fh;
434    }
435    # adding all the files to be sure no provides are missed
436    my $files = join '@', $pkg->files;
437    $pkg->pack_header;
438    #@files{@{$pkg->files}} = undef;                                                                                                     
439    my $tmp_file = mktemp("$tempdir/toto.XXXXX");
440    open my $tmp, ">$tmp_file" or die "Could not open $tmp_file";
441    #print "Adding packages files $files\n";
442    $pkg->build_info(fileno $tmp, join('@', $files));
443    close $tmp;
444    open my $tmp, $tmp_file;
445    {
446        local $/;
447        my $data = <$tmp>;
448        print $fh $data;
449    }
450    close $tmp;
451    if ($prev_id) {
452        $build_urpm->{depslist}[$prev_id] = $pkg
453    }
454    $id
455}
456
457if ($noemptymedia) {
458    foreach my $e (@hdlists) {
459        $e->{headers} or die "Empty media were found, stopping\n";
460    }
461}
462
463#- clean everything to start second pass.
464print STDERR "clean data for second pass\n" unless $nooutput;
465$urpm->unresolved_provides_clean;
466
467#- temporary file where to build hdlists
468my $temp_hdlist = mktemp("$tempdir/hdlistXXXXX");
469foreach (0..$#hdlists) {
470    my $e = $hdlists[$_];
471
472    if ($e->{headers}) { # We have rpms in this media
473
474        print STDERR qq(parsing headers for "$e->{descr}"\n) unless $nooutput;
475        my ($start, $end) = $urpm->parse_headers(dir     => $headers_dir,
476            headers => $e->{headers},
477            dontdie => $dontdie,
478            silent  => $nooutput);
479
480        print STDERR "computing deps\n" unless $nooutput;
481        $urpm->compute_deps;
482
483        # No media change, nothing to write
484        next if $e->{noneedrebuild};
485
486        print STDERR qq(building hdlist for medium "$e->{descr}"\n) unless $nooutput;
487        unlink $temp_hdlist;
488        $urpm->build_hdlist(start  => $start,
489            end    => $end,
490            dir    => $headers_dir,
491            hdlist => $temp_hdlist,
492            ratio  => 9);
493        system('/bin/mv', $temp_hdlist, $e->{hdlist});
494
495        print STDERR qq(building synthesis for medium "$e->{descr}"\n) unless $nooutput;
496        $urpm->build_synthesis(start     => $start,
497            end       => $end,
498            synthesis => $e->{synthesis});
499
500    } else { # no rpm, creating empty but valid index
501        if (my $pack = MDV::Packdrakeng->new(archive => $temp_hdlist)) {
502            $pack = undef; # closing archive
503            system('/bin/mv', $temp_hdlist, $e->{hdlist});
504        } else {
505            print STDERR "Can't create empty archive $temp_hdlist: $MDV::Packdrakeng::error\n";
506        }
507        open(my $hsynth, "| /bin/gzip > $e->{synthesis}")
508            or print STDERR "Can't create empty synthesis $e->{synthesis}: $!\n";
509        close($hsynth);
510    }
511
512    unless ($nomediainfo) {
513        print STDERR qq(link alternate locations of synthesis and hdlists\n) unless $nooutput;
514        unlink $e->{hdlist2}, $e->{synthesis2};
515        link $e->{hdlist}, $e->{hdlist2}
516            or print STDERR qq(link failed for "$e->{hdlist2}": $!\n);
517        link $e->{synthesis}, $e->{synthesis2}
518            or print STDERR qq(link failed for "$e->{synthesis2}": $!\n);
519    }
520
521    unless ($nomd5sum) {
522        print STDERR qq(generate media-specific MD5SUM in $e->{thismediainfo}\n) unless $nooutput;
523        my $here = getcwd();
524        chdir $e->{thismediainfo};
525        my $md5sum = `/usr/bin/md5sum hdlist* synthesis*`;
526        chdir $here;
527        if (open my $md5sumfh, '>', $e->{md5sum}) {
528            print $md5sumfh $md5sum;
529            close $md5sumfh;
530        } else {
531            print STDERR qq(Can't create "$e->{md5sum}": $!\n);
532        }
533    }
534}
535
536clean_cache();
537
538if (grep { ! $_->{noneedrebuild} } @hdlists) {
539
540    print STDERR "building base files\n" unless $nooutput;
541    $urpm->build_base_files(
542        depslist => $urpmfiles{depslist},
543        provides => $urpmfiles{provides},
544        compss   => $urpmfiles{compss},
545    );
546
547    if (-f $destinfodir . '/media.cfg') {
548        if (! -f $destinfodir . '/hdlists' ||
549            ((stat($distrib->getfullpath(undef, 'infodir') . '/media.cfg'))[9] >
550                (stat($destinfodir . '/hdlists'))[9])) {
551            print STDERR "Write hdlists file\n" unless $nooutput;
552            $distrib->write_hdlists($destinfodir . '/hdlists')
553                or print STDERR "Can't write $destinfodir/hdlists file\n";
554        }
555    }
556
557    #- safety cleaning
558    unlink $urpmfiles{md5sum};
559    unless ($nomd5sum) {
560        my $here = getcwd();
561        chdir $destinfodir;
562        my $md5sum = `/usr/bin/md5sum hdlist* synthesis*`;
563        chdir $here;
564        if (open my $md5sumfh, '>', $urpmfiles{md5sum}) {
565            print $md5sumfh $md5sum;
566            close $md5sumfh;
567        } else {
568            print STDERR qq(Can't create "$urpmfiles{md5sum}": $!\n);
569        }
570    }
571
572    print STDERR "Building version file\n" unless $nooutput;
573    $distrib->write_version($urpmfiles{version});
574}
575
576#- check if there are NOTFOUND in dependencies, check if they are in other media, warn the user.
577if ($nooutput || !$nochkdep) {
578    foreach (0 .. $#{$urpm->{depslist}}) {
579        my $pkg = $urpm->{depslist}[$_];
580
581        foreach (split " ", $urpm->{deps}[$_]) {
582            /NOTFOUND_(.*)/ or next;
583            print STDERR $pkg->fullname . " requires [$1] which\n";
584            if ($urpm->{provides}{$1}) {
585                print STDERR "  is available on packages not listed in this medium or previous medium:\n";
586                foreach (keys %{$urpm->{provides}{$1}}) {
587                    my $dep_pkg = $urpm->{depslist}[$_];
588                    print STDERR "    " . $dep_pkg->fullname . "\n";
589                }
590            } else {
591                print STDERR "  is not available in any medium listed\n";
592                if (/NOTFOUND_(\D*)(\d+[\.\-\d]*)?(.*)?\.so\./) {
593                    my $re = (quotemeta $1) . '(\d+[\.\-\d]*)' . (!$2 && "?") . '\.so\.';
594                    foreach (keys %{$urpm->{provides}}) {
595                        /$re/ or next;
596                        print STDERR "  but a similar provides is available as [$_], need rebuild ?\n";
597                    }
598                }
599            }
600        }
601    }
602}
603
604__END__
605
606=head1 NAME
607
608gendistrib - generates a mirror tree for a distribution
609
610=head1 SYNOPSIS
611
612    gendistrib [options] directory
613
614=head1 OPTIONS
615
616=over 4
617
618=item --blind
619
620Always rebuild indexes, without checking whether it's needed.
621
622=item --compss file
623
624Path of F<compss> file (defaults to F<media/media_info/compss>).
625
626=item --depslist file
627
628Path of F<depslist> file (defaults to F<media/media_info/depslist.ordered>).
629
630=item --destdir dir
631
632Create all new files in the specified directory. All subdirectories should
633exist. This option is mostly useful for testing, or while using a read-only
634repository.
635
636=item --hdlists file
637
638Path of the F<hdlists> file (defaults to F<media/media_info/hdlists>)
639
640=item --headersdir dir
641
642Put temporary files in this directory (defaults to TMPDIR).
643
644=item --mediacfg file
645
646Use the specified F<media.cfg> file (defaults to F<media/media_info/media.cfg>).
647
648=item --nobadrpm
649
650Don't abort when encountering bad rpms.
651
652=item --nochkdep
653
654Don't search for missing dependencies.
655
656=item --noclean
657
658Keep cache files.
659
660=item --noemptymedia
661
662Stop and abort if an empty media is found.
663
664=item --nomd5sum
665
666Don't generate MD5SUM files.
667
668=item --nomediainfo
669
670Don't create per-media F<media_info> subdirectories.
671
672=item --provides file
673
674Path of F<provides> file (defaults to F<media/media_info/provides>)
675
676=item --skipmissingdir
677
678If a media dir is missing, ignore it instead of aborting.
679
680=item -s
681
682Silent mode.
683
684=back
685
686=head1 DESCRIPTION
687
688F<gendistrib> is a tool that helps to generate the structure of a Mandriva
689RPM repository, compatible with Mandriva tools (F<urpmi>, F<rpmdrake>,
690etc.)
691
692=head2 General Structure of a Repository
693
694A typical repository, under a root directory F</ROOT/>, has the following
695structure:
696
697    ROOT/ - media/
698            |- contrib/
699            |   `- media_info/
700            |- main/
701            |   `- media_info/
702            `- media_info/
703
704In this example, we have two media, called I<main> and I<contrib>. The
705RPMs packages are placed in the F<main> and F<contrib> subdirectories.
706Repository metadata is contained in the top-level F<media_info> directory.
707Per-media metadata are contained in the F<main/media_info> and
708F<contrib/media_info> subdirectories.
709
710=head2 Configuration of the distribution tree
711
712Before using F<gendistrib>, you must create a file F<media_info/media.cfg>
713to describe your repository. (An empty file will work, but this isn't
714recommended.) The syntax of this file is reminiscent of F<.ini> files.
715
716A first section C<[media_info]> contains global information about the
717repository:
718
719    [media_info]
720    version=2006.0
721    branch=Cooker
722    arch=i586
723
724Then, supply one section per media.
725
726    [main]
727    hdlist=hdlist_main.cz
728    name=Main
729
730Here, the C<hdlist> parameter specifies what will be the name of the
731hdlist file in the top-level F<media_info> directory. C<name> is a human
732readable label for the media.
733
734=head2 Operation
735
736F<genhdlist> should be passed the F<ROOT> directory as parameter. It will
737then generate the hdlist and synthesis files and all other files needed
738for proper repository operation.
739
740F<genhdlist> will also verify any broken dependencies in your repository
741and report them.
742
743=head1 SEE ALSO
744
745genhdlist(1), and MDV::Distribconf(3) for description of the format of the
746F<media.cfg> file.
747
748=head1 COPYRIGHT
749
750Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 MandrakeSoft SA
751
752Copyright (C) 2005, 2006 Mandriva SA
753
754This program is free software; you can redistribute it and/or modify
755it under the terms of the GNU General Public License as published by
756the Free Software Foundation; either version 2, or (at your option)
757any later version.
758
759This program is distributed in the hope that it will be useful,
760but WITHOUT ANY WARRANTY; without even the implied warranty of
761MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
762GNU General Public License for more details.
763
764You should have received a copy of the GNU General Public License
765along with this program; if not, write to the Free Software
766Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
767
768=cut
Note: See TracBrowser for help on using the repository browser.