debian.pl 6.0 KB

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