t 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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. defined($p1{$p}) && die "$fn $p repeat";
  65. if (defined($tv{'filename'})) {
  66. print(STDERR " ! Package $p (filename $fn) has Filename field !\n") || die $!;
  67. }
  68. $tv{'filename'}= "$pathprefix$fn";
  69. open(C,"md5sum <$fn |") || die "$fn $!";
  70. chop($_=<C>); m/^[0-9a-f]{32}$/ || die "$fn \`$_' $!";
  71. $!=0; close(C); $? && die "$fn $? $!";
  72. $tv{'md5sum'}= $_;
  73. defined(@stat= stat($fn)) || die "$fn $!";
  74. $stat[7] || die "$fn $stat[7]";
  75. $tv{'size'}= $stat[7];
  76. if (length($tv{'revision'})) {
  77. $tv{'version'}.= '-'.$tv{'revision'};
  78. delete $tv{'revision'};
  79. }
  80. for $k (keys %tv) {
  81. $pv{$p,$k}= $tv{$k};
  82. $k1{$k}= 1;
  83. $p1{$p}= 1;
  84. }
  85. $_= substr($fn,length($binarydir));
  86. s#/[^/]+$##; s#^/*##;
  87. $psubdir{$p}= $_;
  88. $pfilename{$p}= $fn;
  89. }
  90. $!=0; close(F); $? && die "$? $!";
  91. select(STDERR); $= = 1000; select(STDOUT);
  92. format STDERR =
  93. ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  94. $packages
  95. .
  96. sub writelist {
  97. $title= shift(@_);
  98. return unless @_;
  99. print(STDERR " $title\n") || die $!;
  100. $packages= join(' ',sort @_);
  101. while (length($packages)) { write(STDERR) || die $!; }
  102. print(STDERR "\n") || die $!;
  103. }
  104. @samemaint=();
  105. open(O,"<$override") || die $!;
  106. while(<O>) {
  107. s/\s+$//;
  108. ($p,$priority,$section,$maintainer)= split(/\s+/,$_,4);
  109. next unless defined($p1{$p});
  110. if (length($maintainer)) {
  111. if ($maintainer =~ m/\s*=\>\s*/) {
  112. $oldmaint= $`; $newmaint= $';
  113. if ($pv{$p,'maintainer'} ne $oldmaint) {
  114. push(@changedmaint," $p ($pv{$p,'maintainer'}, not $oldmaint)\n");
  115. } else {
  116. $pv{$p,'maintainer'}= $newmaint;
  117. }
  118. } elsif ($pv{$p,'maintainer'} eq $maintainer) {
  119. push(@samemaint," $p ($maintainer)\n");
  120. } else {
  121. $pv{$p,'maintainer'}= $maintainer;
  122. }
  123. }
  124. $pv{$p,'priority'}= $priority;
  125. $pv{$p,'section'}= $section;
  126. if (length($psubdir{$p}) && $section ne $psubdir{$p}) {
  127. print(STDERR " !! Package $p has \`Section: $section',".
  128. " but file is in \`$psubdir{$p}' !!\n") || die $!;
  129. $ouches++;
  130. }
  131. $o1{$p}= 1;
  132. }
  133. close(O);
  134. if ($ouches) { print(STDERR "\n") || die $!; }
  135. $k1{'maintainer'}= 1;
  136. $k1{'priority'}= 1;
  137. $k1{'section'}= 1;
  138. @missingover=();
  139. for $p (sort keys %p1) {
  140. if (!defined($o1{$p})) {
  141. push(@missingover,$p);
  142. }
  143. $r= "Package: $p\n";
  144. for $k (sort { $pri{$b} <=> $pri{$a} } keys %k1) {
  145. next unless length($pv{$p,$k});
  146. $r.= "$k: $pv{$p,$k}\n";
  147. }
  148. $r.= "\n";
  149. $written++;
  150. print(STDOUT $r) || die $!;
  151. }
  152. close(STDOUT) || die $!;
  153. &writelist("** Packages in archive but missing from override file: **",
  154. @missingover);
  155. <<<<<<< dpkg-scanpackages.pl
  156. ||||||| /usr/ian-home/junk/u
  157. &writelist("++ Packages appearing in override file but not in archive: ++",
  158. @inover);
  159. =======
  160. &writelist("++ Packages appearing in override file but not in archive: ++",
  161. @inover);
  162. if (@changedmaint) {
  163. print(STDERR
  164. " ++ Packages in override file with incorrect old maintainer value: ++\n",
  165. @changedmaint,
  166. "\n") || die $!;
  167. }
  168. >>>>>>> /usr/ian-home/junk/t
  169. if (@samemaint) {
  170. print(STDERR
  171. " -- Packages specifying same maintainer as override file: --\n",
  172. @samemaint,
  173. "\n") || die $!;
  174. }
  175. print(STDERR " Wrote $written entries to output Packages file.\n") || die $!;