aboutsummaryrefslogtreecommitdiffstats
path: root/genhdlist_cz2
blob: 2a128583ade43523045d50102b807e45cc46dbb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/perl

($noclean,         @ARGV) = @ARGV if $ARGV[0] eq "--noclean";
(undef, $depslist, @ARGV) = @ARGV if $ARGV[0] eq "--ordered-depslist";
(undef, $hdlist,   @ARGV) = @ARGV if $ARGV[0] eq "-o";
(undef, $root,     @ARGV) = @ARGV if $ARGV[0] eq "--distrib";

$hdlist && @ARGV == 1 || $root && @ARGV == 0 or die 
"usage: genhdlist_cz2 [--noclean] [--ordered-depslist <depslist>] -o <hdlist_cz2> <rpm dir>
   or  genhdlist_cz2 [--noclean] --distrib <root distrib>
";

chop($pwd = `pwd`);

if ($root) {
    $root = "$pwd/$root" if $root !~ m|^/|;
    $depslist = "$root/Mandrake/base/depslist.ordered";
    $hdlist   = "$root/Mandrake/base/hdlist.cz2";
    $dir      = "$root/Mandrake/RPMS";
    $ENV{PATH} = "$ENV{PATH}:$root/misc";
} else {
    ($dir) = @ARGV;
}

$depslist = "$pwd/$depslist" if $depslist !~ m|^/|;
$hdlist   = "$pwd/$hdlist"   if $hdlist   !~ m|^/|;
$dir      = "$pwd/$dir"      if $dir      !~ m|^/|;

$work_dir = "/tmp/.build_hdlist";


-e $work_dir && !-d $work_dir and unlink($work_dir) || die "cannot use $work_dir as a working directory";
chmod 0755, $work_dir or system("rm -rf $work_dir");
-d $work_dir or mkdir $work_dir, 0755 or die "cannot create working directory $work_dir\n";
chdir $work_dir;

my (%keys, @keys);

opendir DIR, $dir or die "unable to opendir $dir: $!\n";
while ($_ = readdir DIR) {
    my ($key, $arch) = /(.*)\.(.*)\.rpm$/ or next;
    system("rpm2header $dir/$_ > $_") unless -e $_;
    $? == 0 or unlink($_), die "bad rpm $dir/$_\n";
    -s $_ or unlink($_), die "bad rpm $dir/$_\n";
    if ($keys{$key}) {
	my ($name, $tail) = $key =~ /(.*)(-[^-]*-[^-]*)/;
	$keys{"$name($keys{$key})$tail"} = $keys{$key}; unlink "$name($keys{$key})$tail"; link "$key.$keys{$key}.rpm", "$name($keys{$key})$tail";
	$keys{"$name($arch)$tail"} = $arch; unlink "$name($arch)$tail"; link $_, "$name($arch)$tail";
	delete $keys{$key};
    } else {
	$keys{$key} = $arch; unlink $key; link $_, $key;
    }
}
if (-e $depslist) {
    open F, $depslist;
    @keys = map { (split)[0] } <F>;
}
@keys = grep { delete $keys{$_} } @keys; 

open B, "| packdrake -b9s $hdlist 400000";
foreach (@keys, keys %keys) { print B "$_\n" }
close B or die "packdrake failed\n";

system("rm -rf $work_dir") unless $noclean;