dpkg-parsechangelog.pl 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use POSIX;
  5. use POSIX qw(:errno_h);
  6. use Dpkg;
  7. use Dpkg::Gettext;
  8. use Dpkg::ErrorHandling qw(warning error syserr subprocerr usageerr);
  9. textdomain("dpkg-dev");
  10. my $format ='debian';
  11. my $changelogfile = 'debian/changelog';
  12. my @parserpath = ("/usr/local/lib/dpkg/parsechangelog",
  13. "$dpkglibdir/parsechangelog");
  14. my $libdir; # XXX: Not used!?
  15. my $force;
  16. sub version {
  17. printf _g("Debian %s version %s.\n"), $progname, $version;
  18. printf _g("
  19. Copyright (C) 1996 Ian Jackson.
  20. Copyright (C) 2001 Wichert Akkerman");
  21. printf _g("
  22. This is free software; see the GNU General Public Licence version 2 or
  23. later for copying conditions. There is NO warranty.
  24. ");
  25. }
  26. sub usage {
  27. printf _g(
  28. "Usage: %s [<option> ...]
  29. Options:
  30. -l<changelogfile> get per-version info from this file.
  31. -v<sinceversion> include all changes later than version.
  32. -F<changelogformat> force change log format.
  33. -L<libdir> look for change log parsers in <libdir>.
  34. -h, --help show this help message.
  35. --version show the version.
  36. "), $progname;
  37. }
  38. my @ap = ();
  39. while (@ARGV) {
  40. last unless $ARGV[0] =~ m/^-/;
  41. $_= shift(@ARGV);
  42. if (m/^-L/ && length($_)>2) { $libdir=$'; next; }
  43. if (m/^-F([0-9a-z]+)$/) { $force=1; $format=$1; next; }
  44. push(@ap,$_);
  45. if (m/^-l/ && length($_)>2) { $changelogfile=$'; next; }
  46. m/^--$/ && last;
  47. m/^-v/ && next;
  48. if (m/^-(h|-help)$/) { &usage; exit(0); }
  49. if (m/^--version$/) { &version; exit(0); }
  50. &usageerr("unknown option \`$_'");
  51. }
  52. @ARGV && usageerr(_g("%s takes no non-option arguments"), $progname);
  53. $changelogfile= "./$changelogfile" if $changelogfile =~ m/^\s/;
  54. if (not $force and $changelogfile ne "-") {
  55. open(STDIN,"< $changelogfile") ||
  56. error(_g("cannot open %s to find format: %s"), $changelogfile, $!);
  57. open(P,"tail -n 40 |") || die sprintf(_g("cannot fork: %s"), $!)."\n";
  58. while(<P>) {
  59. next unless m/\schangelog-format:\s+([0-9a-z]+)\W/;
  60. $format=$1;
  61. }
  62. close(P);
  63. $? && subprocerr(_g("tail of %s"), $changelogfile);
  64. }
  65. my ($pa, $pf);
  66. for my $pd (@parserpath) {
  67. $pa= "$pd/$format";
  68. if (!stat("$pa")) {
  69. $! == ENOENT || syserr(_g("failed to check for format parser %s"), $pa);
  70. } elsif (!-x _) {
  71. warning(_g("format parser %s not executable"), $pa);
  72. } else {
  73. $pf= $pa;
  74. last;
  75. }
  76. }
  77. defined($pf) || error(_g("format %s unknown"), $pa);
  78. if ($changelogfile ne "-") {
  79. open(STDIN,"< $changelogfile") || die sprintf(_g("cannot open %s: %s"), $changelogfile, $!)."\n";
  80. }
  81. exec($pf,@ap); die sprintf(_g("cannot exec format parser: %s"), $!)."\n";