dpkg-parsechangelog.pl 2.8 KB

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