debian.pl 5.4 KB

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