dpkg-scanpackages.pl 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. #!/usr/bin/perl --
  2. # usage:
  3. # dpkg-scanpackages .../binary .../noverride pathprefix >.../Packages.new
  4. # mv .../Packages.new .../Packages
  5. #
  6. # This is the core script that generates Packages files (as found
  7. # on the Debian FTP site and CD-ROMs).
  8. #
  9. # The first argument should preferably be a relative filename, so that
  10. # the Filename field has good information.
  11. #
  12. # Any desired string can be prepended to each Filename value by
  13. # passing it as the third argument.
  14. #
  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).
  20. $version= '1.0.12'; # This line modified by Makefile
  21. %kmap= ('optional','suggests',
  22. 'recommended','recommends',
  23. 'class','priority',
  24. 'package_revision','revision');
  25. %pri= ('priority',300,
  26. 'section',290,
  27. 'maintainer',280,
  28. 'version',270,
  29. 'depends',250,
  30. 'recommends',240,
  31. 'suggests',230,
  32. 'conflicts',220,
  33. 'provides',210,
  34. 'filename',200,
  35. 'size',180,
  36. 'md5sum',170,
  37. 'description',160);
  38. @ARGV==3 || die;
  39. $binarydir= shift(@ARGV);
  40. -d $binarydir || die $!;
  41. $override= shift(@ARGV);
  42. -e $override || die $!;
  43. $pathprefix= shift(@ARGV);
  44. open(F,"find $binarydir -name '*.deb' -print |") || die $!;
  45. while (<F>) {
  46. chop($fn=$_);
  47. substr($fn,0,length($binarydir)) eq $binarydir || die $fn;
  48. open(C,"dpkg-deb -I $fn control |") || die "$fn $!";
  49. $t=''; while (<C>) { $t.=$_; }
  50. $!=0; close(C); $? && die "$fn $? $!";
  51. undef %tv;
  52. $o= $t;
  53. while ($t =~ s/^\n*(\S+):[ \t]*(.*(\n[ \t].*)*)\n//) {
  54. $k= $1; $v= $2;
  55. $k =~ y/A-Z/a-z/;
  56. if (defined($kmap{$k})) { $k= $kmap{$k}; }
  57. $v =~ s/\s+$//;
  58. $tv{$k}= $v;
  59. #print STDERR "K>$k V>$v<\n";
  60. }
  61. $t =~ m/^\n*$/ || die "$fn $o / $t ?";
  62. defined($tv{'package'}) || die "$fn $o ?";
  63. $p= $tv{'package'}; delete $tv{'package'};
  64. if (defined($p1{$p})) {
  65. print(STDERR " ! Package $p (filename $fn) is repeat;\n".
  66. " ignored that one and using data from $pfilename{$p}) !\n")
  67. || die $!;
  68. next;
  69. }
  70. if (defined($tv{'filename'})) {
  71. print(STDERR " ! Package $p (filename $fn) has Filename field !\n") || die $!;
  72. }
  73. $tv{'filename'}= "$pathprefix$fn";
  74. open(C,"md5sum <$fn |") || die "$fn $!";
  75. chop($_=<C>); m/^[0-9a-f]{32}$/ || die "$fn \`$_' $!";
  76. $!=0; close(C); $? && die "$fn $? $!";
  77. $tv{'md5sum'}= $_;
  78. defined(@stat= stat($fn)) || die "$fn $!";
  79. $stat[7] || die "$fn $stat[7]";
  80. $tv{'size'}= $stat[7];
  81. if (length($tv{'revision'})) {
  82. $tv{'version'}.= '-'.$tv{'revision'};
  83. delete $tv{'revision'};
  84. }
  85. for $k (keys %tv) {
  86. $pv{$p,$k}= $tv{$k};
  87. $k1{$k}= 1;
  88. $p1{$p}= 1;
  89. }
  90. $_= substr($fn,length($binarydir));
  91. s#/[^/]+$##; s#^/*##;
  92. $psubdir{$p}= $_;
  93. $pfilename{$p}= $fn;
  94. }
  95. $!=0; close(F); $? && die "$? $!";
  96. select(STDERR); $= = 1000; select(STDOUT);
  97. format STDERR =
  98. ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  99. $packages
  100. .
  101. sub writelist {
  102. $title= shift(@_);
  103. return unless @_;
  104. print(STDERR " $title\n") || die $!;
  105. $packages= join(' ',sort @_);
  106. while (length($packages)) { write(STDERR) || die $!; }
  107. print(STDERR "\n") || die $!;
  108. }
  109. @samemaint=();
  110. open(O,"<$override") || die $!;
  111. while(<O>) {
  112. s/\s+$//;
  113. ($p,$priority,$section,$maintainer)= split(/\s+/,$_,4);
  114. next unless defined($p1{$p});
  115. if (length($maintainer)) {
  116. if ($maintainer =~ m/\s*=\>\s*/) {
  117. $oldmaint= $`; $newmaint= $'; $debmaint= $pv{$p,'maintainer'};
  118. if (!grep($debmaint eq $_, split(m:\s*//\s*:, $oldmaint))) {
  119. push(@changedmaint,
  120. " $p (package says $pv{$p,'maintainer'}, not $oldmaint)\n");
  121. } else {
  122. $pv{$p,'maintainer'}= $newmaint;
  123. }
  124. } elsif ($pv{$p,'maintainer'} eq $maintainer) {
  125. push(@samemaint," $p ($maintainer)\n");
  126. } else {
  127. print(STDERR " * Unconditional maintainer override for $p *\n") || die $!;
  128. $pv{$p,'maintainer'}= $maintainer;
  129. }
  130. }
  131. $pv{$p,'priority'}= $priority;
  132. $pv{$p,'section'}= $section;
  133. if (length($psubdir{$p}) && $section ne $psubdir{$p}) {
  134. print(STDERR " !! Package $p has \`Section: $section',".
  135. " but file is in \`$psubdir{$p}' !!\n") || die $!;
  136. $ouches++;
  137. }
  138. $o1{$p}= 1;
  139. }
  140. close(O);
  141. if ($ouches) { print(STDERR "\n") || die $!; }
  142. $k1{'maintainer'}= 1;
  143. $k1{'priority'}= 1;
  144. $k1{'section'}= 1;
  145. @missingover=();
  146. for $p (sort keys %p1) {
  147. if (!defined($o1{$p})) {
  148. push(@missingover,$p);
  149. }
  150. $r= "Package: $p\n";
  151. for $k (sort { $pri{$b} <=> $pri{$a} } keys %k1) {
  152. next unless length($pv{$p,$k});
  153. $r.= "$k: $pv{$p,$k}\n";
  154. }
  155. $r.= "\n";
  156. $written++;
  157. print(STDOUT $r) || die $!;
  158. }
  159. close(STDOUT) || die $!;
  160. &writelist("** Packages in archive but missing from override file: **",
  161. @missingover);
  162. if (@changedmaint) {
  163. print(STDERR
  164. " ++ Packages in override file with incorrect old maintainer value: ++\n",
  165. @changedmaint,
  166. "\n") || die $!;
  167. }
  168. if (@samemaint) {
  169. print(STDERR
  170. " -- Packages specifying same maintainer as override file: --\n",
  171. @samemaint,
  172. "\n") || die $!;
  173. }
  174. print(STDERR " Wrote $written entries to output Packages file.\n") || die $!;