cl-debian.pl 5.2 KB

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