home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / lib / dpkg / parsechangelog / debian
Text File  |  1999-03-02  |  5KB  |  144 lines

  1. #! /usr/bin/perl
  2. #
  3. # Options:
  4. #  -v<version>
  5. #   changes since <version>
  6.  
  7. $dpkglibdir="/usr/lib/dpkg";
  8. $version="1.4.0.34"; # This line modified by Makefile
  9.  
  10. $controlfile= 'debian/control';
  11. $changelogfile= 'debian/changelog';
  12. $fileslistfile= 'debian/files';
  13. $varlistfile= 'debian/substvars';
  14.  
  15. push(@INC,$dpkglibdir);
  16. require 'controllib.pl';
  17.  
  18. $progname= "parsechangelog/$progname";
  19.  
  20. $since='';
  21.  
  22. sub usageversion {
  23.     print STDERR
  24. "Debian GNU/Linux parsechangelog/dpkg $version.  Copyright (C) 1996
  25. Ian Jackson.  This is free software; see the GNU General Public Licence
  26. version 2 or later for copying conditions.  There is NO warranty.
  27.  
  28. Usage: parsechangelog/dpkg [-v<versionsince>] | -h
  29. ";
  30. }
  31.  
  32. while (@ARGV) {
  33.     $_=shift(@ARGV);
  34.     if (m/^-v(.+)$/) {
  35.         $since= $1;
  36.     } elsif (m/^-h$/) {
  37.         &usageversion; exit(0);
  38.     } else {
  39.         &usageerr("unknown option or argument \`$_'");
  40.     }
  41. }
  42.  
  43. %mapkv=(); # for future use
  44. $i=100;grep($fieldimps{$_}=$i--,
  45.           qw(Source Version Distribution Urgency Maintainer Date Changes));
  46. $i=1;grep($urgencies{$_}=$i++,
  47.           qw(low medium routine high urgent emergency));
  48.  
  49. $expect='first heading';
  50.  
  51. while (<STDIN>) {
  52.     s/\s*\n$//;
  53. #    printf(STDERR "%-39.39s %-39.39s\n",$expect,$_);
  54.     if (m/^(\w[-+0-9a-z.]+) \(([^\(\) \t]+)\)((\s+[-0-9a-z]+)+)\;/i) {
  55.         if ($expect eq 'first heading') {
  56.             $f{'Source'}= $1;
  57.             $f{'Version'}= $2;
  58.             $f{'Distribution'}= $3;
  59.             &error("-v<since> option specifies most recent version") if
  60.                 $2 eq $since;
  61.             $f{'Distribution'} =~ s/^\s+//;
  62.         } elsif ($expect eq 'next heading or eof') {
  63.             last if $2 eq $since;
  64.             $f{'Changes'}.= " .\n";
  65.         } else {
  66.             &clerror("found start of entry where expected $expect");
  67.         }
  68.         $rhs= $'; $rhs =~ s/^\s+//;
  69.         undef %kvdone;
  70.         for $kv (split(/\s*,\s*/,$rhs)) {
  71.             $kv =~ m/^([-0-9a-z]+)\=\s*(.*\S)$/i ||
  72.                 &clerror("bad key-value after \`;': \`$kv'");
  73.             $k=(uc substr($1,0,1)).(lc substr($1,1)); $v=$2;
  74.             $kvdone{$k}++ && &clwarn("repeated key-value $k");
  75.             if ($k eq 'Urgency') {
  76.                 $v =~ m/^([-0-9a-z]+)((\s+.*)?)$/i ||
  77.                     &clerror("badly formatted urgency value, at changelog ");
  78.                 $newurg= lc $1;
  79.                 $newurgn= $urgencies{lc $1}; $newcomment= $2;
  80.                 $newurgn ||
  81.                     &clwarn("unknown urgency value $newurg - comparing very low");
  82.                 if (defined($f{'Urgency'})) {
  83.                     $f{'Urgency'} =~ m/^([-0-9a-z]+)((\s+.*)?)$/i ||
  84.                         &internerr("urgency >$f{'Urgency'}<");
  85.                     $oldurg= lc $1;
  86.                     $oldurgn= $urgencies{lc $1}; $oldcomment= $2;
  87.                 } else {
  88.                     $oldurgn= -1;
  89.                     $oldcomment= '';
  90.                 }
  91.                 $f{'Urgency'}=
  92.                     (($newurgn > $oldurgn ? $newurg : $oldurg).
  93.                      $oldcomment.
  94.                      $newcomment);
  95.             } elsif (defined($mapkv{$k})) {
  96.                 $f{$mapkv{$k}}= $v;
  97.             } elsif ($k =~ m/^X[BCS]+-/i) {
  98.                 # Extensions - XB for putting in Binary,
  99.                 # XC for putting in Control, XS for putting in Source
  100.                 $f{$k}= $v;
  101.             } else {
  102.                 &clwarn("unknown key-value key $k - copying to XS-$k");
  103.                 $f{"XS-$k"}= $v;
  104.             }
  105.         }
  106.         $expect= 'start of change data'; $blanklines=0;
  107.         $f{'Changes'}.= " $_\n .\n";
  108.     } elsif (m/^\S/) {
  109.         &clerror("badly formatted heading line");
  110.     } elsif (m/^ \-\- (.*) <(.*)>  ((\w+\,\s*)?\d{1,2}\s+\w+\s+\d{4}\s+\d{1,2}:\d\d:\d\d\s+[-+]\d{4}(\s+\([^\\\(\)]\))?)$/) {
  111.         $expect eq 'more change data or trailer' ||
  112.             &clerror("found trailer where expected $expect");
  113.         $f{'Maintainer'}= "$1 <$2>" unless defined($f{'Maintainer'});
  114.         $f{'Date'}= $3 unless defined($f{'Date'});
  115. #        $f{'Changes'}.= " .\n $_\n";
  116.         $expect= 'next heading or eof';
  117.         last if $since eq '';
  118.     } elsif (m/^ \-\-/) {
  119.         &clerror("badly formatted trailer line");
  120.     } elsif (m/^\s{2,}\S/) {
  121.         $expect eq 'start of change data' || $expect eq 'more change data or trailer' ||
  122.             &clerror("found change data where expected $expect");
  123.         $f{'Changes'}.= (" .\n"x$blanklines)." $_\n"; $blanklines=0;
  124.         $expect= 'more change data or trailer';
  125.     } elsif (!m/\S/) {
  126.         next if $expect eq 'start of change data' || $expect eq 'next heading or eof';
  127.         $expect eq 'more change data or trailer' ||
  128.             &clerror("found blank line where expected $expect");
  129.         $blanklines++;
  130.     } else {
  131.         &clerror("unrecognised line");
  132.     }
  133. }
  134.  
  135. $expect eq 'next heading or eof' || die "found eof where expected $expect";
  136.  
  137. $f{'Changes'} =~ s/\n$//;
  138. $f{'Changes'} =~ s/^/\n/;
  139.  
  140. &outputclose(0);
  141.  
  142. sub clerror { &error("$_[0], at changelog line $."); }
  143. sub clwarn { &warn("$_[0], at changelog line $."); }
  144.