3 # dpkg-scanpackages .../binary .../noverride pathprefix >.../Packages.new
4 # mv .../Packages.new .../Packages
6 # This is the core script that generates Packages files (as found
7 # on the Debian FTP site and CD-ROMs).
9 # The first argument should preferably be a relative filename, so that
10 # the Filename field has good information.
12 # Any desired string can be prepended to each Filename value by
13 # passing it as the third argument.
15 # The noverride file is a series of lines of the form
16 # <package> <priority> <section> <maintainer>
17 # where the <maintainer> field is optional. Fields are separated by
18 # whitespace. The <maintainer> field may be <old-maintainer> => <new-maintainer>
19 # (this is recommended).
21 $version= '1.0.12'; # This line modified by Makefile
23 %kmap= ('optional','suggests',
24 'recommended','recommends',
26 'package_revision','revision');
28 %pri= ('priority',300,
44 $binarydir= shift(@ARGV);
45 -d
$binarydir || die $!;
47 $override= shift(@ARGV);
48 -e
$override || die $!;
50 $pathprefix= shift(@ARGV);
52 open(F
,"find $binarydir -name '*.deb' -print |") || die $!;
55 substr($fn,0,length($binarydir)) eq $binarydir || die $fn;
56 open(C
,"dpkg-deb -I $fn control |") || die "$fn $!";
57 $t=''; while (<C
>) { $t.=$_; }
58 $!=0; close(C
); $?
&& die "$fn $? $!";
61 while ($t =~ s/^\n*(\S+):[ \t]*(.*(\n[ \t].*)*)\n//) {
64 if (defined($kmap{$k})) { $k= $kmap{$k}; }
67 #print STDERR "K>$k V>$v<\n";
69 $t =~ m/^\n*$/ || die "$fn $o / $t ?";
70 defined($tv{'package'}) || die "$fn $o ?";
71 $p= $tv{'package'}; delete $tv{'package'};
72 if (defined($p1{$p})) {
73 print(STDERR
" ! Package $p (filename $fn) is repeat;\n".
74 " ignored that one and using data from $pfilename{$p}) !\n")
78 if (defined($tv{'filename'})) {
79 print(STDERR
" ! Package $p (filename $fn) has Filename field !\n") || die $!;
81 $tv{'filename'}= "$pathprefix$fn";
82 open(C
,"md5sum <$fn |") || die "$fn $!";
83 chop($_=<C
>); m/^[0-9a-f]{32}$/ || die "$fn \`$_' $!";
84 $!=0; close(C
); $?
&& die "$fn $? $!";
86 defined(@stat= stat($fn)) || die "$fn $!";
87 $stat[7] || die "$fn $stat[7]";
88 $tv{'size'}= $stat[7];
89 if (length($tv{'revision'})) {
90 $tv{'version'}.= '-'.$tv{'revision'};
91 delete $tv{'revision'};
98 $_= substr($fn,length($binarydir));
103 $!=0; close(F
); $?
&& die "$? $!";
105 select(STDERR
); $= = 1000; select(STDOUT
);
108 ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
115 print(STDERR
" $title\n") || die $!;
116 $packages= join(' ',sort @_);
117 while (length($packages)) { write(STDERR
) || die $!; }
118 print(STDERR
"\n") || die $!;
123 open(O
,"<$override") || die $!;
126 ($p,$priority,$section,$maintainer)= split(/\s+/,$_,4);
127 next unless defined($p1{$p});
128 if (length($maintainer)) {
129 if ($maintainer =~ m/\s*=\>\s*/) {
130 $oldmaint= $`; $newmaint= $'; $debmaint= $pv{$p,'maintainer'};
131 if (!grep($debmaint eq $_, split(m:\s*//\s*:, $oldmaint))) {
133 " $p (package says $pv{$p,'maintainer'}, not $oldmaint)\n");
135 $pv{$p,'maintainer'}= $newmaint;
137 } elsif ($pv{$p,'maintainer'} eq $maintainer) {
138 push(@samemaint," $p ($maintainer)\n");
140 print(STDERR " * Unconditional maintainer override for $p *\n") || die $!;
141 $pv{$p,'maintainer'}= $maintainer;
144 $pv{$p,'priority'}= $priority;
145 $pv{$p,'section'}= $section;
146 if (length($psubdir{$p}) && $section ne $psubdir{$p}) {
147 print(STDERR " !! Package $p has \`Section
: $section',".
148 " but file is in \`$psubdir{$p}' !!\n") || die $!;
155 if ($ouches) { print(STDERR "\n") || die $!; }
157 $k1{'maintainer'}= 1;
163 for $p (sort keys %p1) {
164 if (!defined($o1{$p})) {
165 push(@missingover,$p);
168 for $k (sort { $pri{$b} <=> $pri{$a} } keys %k1) {
169 next unless length($pv{$p,$k});
170 $r.= "$k: $pv{$p,$k}\n";
174 print(STDOUT $r) || die $!;
176 close(STDOUT) || die $!;
178 &writelist("** Packages
in archive but missing from override file
: **",
182 " ++ Packages
in override file with incorrect old maintainer value
: ++\n",
188 " -- Packages specifying same maintainer as override file
: --\n",
193 print(STDERR " Wrote
$written entries to output Packages file
.\n") || die $!;