dpkg-scanpackages.pl 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #!/usr/bin/perl
  2. $version= '1.2.6'; # This line modified by Makefile
  3. %kmap= ('optional','suggests',
  4. 'recommended','recommends',
  5. 'class','priority',
  6. 'package_revision','revision');
  7. @fieldpri= ('Package',
  8. 'Version',
  9. 'Priority',
  10. 'Section',
  11. 'Essential',
  12. 'Maintainer',
  13. 'Pre-Depends',
  14. 'Depends',
  15. 'Recommends',
  16. 'Suggests',
  17. 'Conflicts',
  18. 'Provides',
  19. 'Replaces',
  20. 'Architecture',
  21. 'Filename',
  22. 'Size',
  23. 'MD5sum',
  24. 'Description');
  25. $i=100; grep($pri{$_}=$i--,@fieldpri);
  26. $#ARGV == 1 || $#ARGV == 2
  27. or die "Usage: dpkg-scanpackages binarypath overridefile pathprefix > Packages\n";
  28. ($binarydir, $override, $pathprefix) = @ARGV;
  29. -d $binarydir or die "Binary dir $binarydir not found\n";
  30. -e $override or die "Override file $override not found\n";
  31. # The extra slash causes symlinks to be followed.
  32. open(F,"find $binarydir/ -follow -name '*.deb' -print |")
  33. or die "Couldn't open pipe to find: $!\n";
  34. while (<F>) {
  35. chop($fn=$_);
  36. substr($fn,0,length($binarydir)) eq $binarydir
  37. or die "$fn not in binary dir $binarydir\n";
  38. $t= `dpkg-deb -I $fn control`
  39. or die "Couldn't call dpkg-deb on $fn: $!\n";
  40. $? and die "\`dpkg-deb -I $fn control' exited with $?\n";
  41. undef %tv;
  42. $o= $t;
  43. while ($t =~ s/^\n*(\S+):[ \t]*(.*(\n[ \t].*)*)\n//) {
  44. $k= lc $1; $v= $2;
  45. if (defined($kmap{$k})) { $k= $kmap{$k}; }
  46. if (@kn= grep($k eq lc $_, @fieldpri)) {
  47. @kn==1 || die $k;
  48. $k= $kn[0];
  49. }
  50. $v =~ s/\s+$//;
  51. $tv{$k}= $v;
  52. }
  53. $t =~ /^\n*$/
  54. or die "Unprocessed text from $fn control file; info:\n$o / $t\n";
  55. defined($tv{'Package'})
  56. or die "No Package field in control file of $fn\n";
  57. $p= $tv{'Package'}; delete $tv{'Package'};
  58. if (defined($p1{$p})) {
  59. print(STDERR " ! Package $p (filename $fn) is repeat;\n".
  60. " ignored that one and using data from $pfilename{$p} !\n")
  61. || die $!;
  62. next;
  63. }
  64. print(STDERR " ! Package $p (filename $fn) has Filename field!\n") || die $!
  65. if defined($tv{'Filename'});
  66. $tv{'Filename'}= "$pathprefix$fn";
  67. open(C,"md5sum <$fn |") || die "$fn $!";
  68. chop($_=<C>); close(C); $? and die "\`md5sum < $fn' exited with $?\n";
  69. /^[0-9a-f]{32}$/ or die "Strange text from \`md5sum < $fn': \`$_'\n";
  70. $tv{'MD5sum'}= $_;
  71. @stat= stat($fn) or die "Couldn't stat $fn: $!\n";
  72. $stat[7] or die "$fn is empty\n";
  73. $tv{'Size'}= $stat[7];
  74. if (length($tv{'Revision'})) {
  75. $tv{'Version'}.= '-'.$tv{'Revision'};
  76. delete $tv{'Revision'};
  77. }
  78. for $k (keys %tv) {
  79. $pv{$p,$k}= $tv{$k};
  80. $k1{$k}= 1;
  81. $p1{$p}= 1;
  82. }
  83. $_= substr($fn,length($binarydir));
  84. s#/[^/]+$##; s#^/*##;
  85. $psubdir{$p}= $_;
  86. $pfilename{$p}= $fn;
  87. }
  88. close(F);
  89. $? and die "find exited with $?\n";
  90. select(STDERR); $= = 1000; select(STDOUT);
  91. format STDERR =
  92. ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  93. $packages
  94. .
  95. sub writelist {
  96. $title= shift(@_);
  97. return unless @_;
  98. print(STDERR " $title\n") || die $!;
  99. $packages= join(' ',sort @_);
  100. while (length($packages)) { write(STDERR) || die $!; }
  101. print(STDERR "\n") || die $!;
  102. }
  103. @samemaint=();
  104. open(O, $override)
  105. or die "Couldn't open override file $override: $!\n";
  106. while (<O>) {
  107. s/\#.*//;
  108. s/\s+$//;
  109. ($p,$priority,$section,$maintainer)= split(/\s+/,$_,4);
  110. next unless defined($p1{$p});
  111. if (length($maintainer)) {
  112. if ($maintainer =~ m/\s*=\>\s*/) {
  113. $oldmaint= $`; $newmaint= $'; $debmaint= $pv{$p,'Maintainer'};
  114. if (!grep($debmaint eq $_, split(m:\s*//\s*:, $oldmaint))) {
  115. push(@changedmaint,
  116. " $p (package says $pv{$p,'Maintainer'}, not $oldmaint)\n");
  117. } else {
  118. $pv{$p,'Maintainer'}= $newmaint;
  119. }
  120. } elsif ($pv{$p,'Maintainer'} eq $maintainer) {
  121. push(@samemaint," $p ($maintainer)\n");
  122. } else {
  123. print(STDERR " * Unconditional maintainer override for $p *\n") || die $!;
  124. $pv{$p,'Maintainer'}= $maintainer;
  125. }
  126. }
  127. $pv{$p,'Priority'}= $priority;
  128. $pv{$p,'Section'}= $section;
  129. if (length($psubdir{$p}) && $section ne $psubdir{$p}) {
  130. print(STDERR " !! Package $p has \`Section: $section',".
  131. " but file is in \`$psubdir{$p}' !!\n") || die $!;
  132. $ouches++;
  133. }
  134. $o1{$p}= 1;
  135. }
  136. close(O);
  137. print(STDERR "\n") || die $! if $ouches;
  138. $k1{'Maintainer'}= 1;
  139. $k1{'Priority'}= 1;
  140. $k1{'Section'}= 1;
  141. @missingover=();
  142. for $p (sort keys %p1) {
  143. if (!defined($o1{$p})) {
  144. push(@missingover,$p);
  145. }
  146. $r= "Package: $p\n";
  147. for $k (sort { $pri{$b} <=> $pri{$a} } keys %k1) {
  148. next unless length($pv{$p,$k});
  149. $r.= "$k: $pv{$p,$k}\n";
  150. }
  151. $r.= "\n";
  152. $written++;
  153. $p1{$p}= 1;
  154. print(STDOUT $r) or die "Failed when writing stdout: $!\n";
  155. }
  156. close(STDOUT) or die "Couldn't close stdout: $!\n";
  157. @spuriousover= grep(!defined($p1{$_}),sort keys %o1);
  158. &writelist("** Packages in archive but missing from override file: **",
  159. @missingover);
  160. if (@changedmaint) {
  161. print(STDERR
  162. " ++ Packages in override file with incorrect old maintainer value: ++\n",
  163. @changedmaint,
  164. "\n") || die $!;
  165. }
  166. if (@samemaint) {
  167. print(STDERR
  168. " -- Packages specifying same maintainer as override file: --\n",
  169. @samemaint,
  170. "\n") || die $!;
  171. }
  172. if (@spuriousover) {
  173. print(STDERR
  174. " -- Packages in override file but not in archive: --\n",
  175. @spuriousover,
  176. "\n") || die $!;
  177. }
  178. print(STDERR " Wrote $written entries to output Packages file.\n") || die $!;