dpkg-parsechangelog.pl 2.7 KB

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