chiark / gitweb /
Test suite: Use stunt dpkg-parsechangelog
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 30 May 2015 12:28:21 +0000 (13:28 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 31 May 2015 11:21:36 +0000 (12:21 +0100)
This program takes 16ms instead of ~700ms on my computer.  This saves
15s out of 100s for the debpolicy-newreject test (in its current
state).

Currently this is only used by various things in devscripts because
dpkg-source uses /usr/lib/dpkg/parsechangelog/debian directly via a
Perl module Dpkg::Changelog::Parse.

tests/tests/debpolicy-newreject
tests/tstunt/dpkg-parsechangelog [new file with mode: 0755]

index f161149..c6260a7 100755 (executable)
@@ -2,6 +2,8 @@
 set -e
 . tests/lib
 
+t-tstunt dpkg-parsechangelog
+
 t-debpolicy
 t-prep-newpackage example 1.0
 
diff --git a/tests/tstunt/dpkg-parsechangelog b/tests/tstunt/dpkg-parsechangelog
new file mode 100755 (executable)
index 0000000..2e0360d
--- /dev/null
@@ -0,0 +1,53 @@
+#!/usr/bin/perl -w
+#
+# In an example:
+#
+# $ time dpkg-parsechangelog >/dev/null
+#
+# real    0m0.712s
+# user    0m0.656s
+# sys     0m0.048s
+# $ time ~/things/Dgit/dgit/tests/tstunt/dpkg-parsechangelog >/dev/null
+#
+# real    0m0.016s
+# user    0m0.000s
+# sys     0m0.012s
+# $
+
+die if @ARGV;
+
+use strict;
+open C, "debian/changelog" or die $!;
+
+$!=0; $_ = <C>;
+m/^(\S+) \(([^()]+)\) (\S+)\; urgency=(\S+)$/ or die "$!, $_ ?";
+print <<END or die $!;
+Source: $1
+Version: $2
+Distribution: $3
+Urgency: $4
+Changes: 
+ $&
+END
+
+my $blanks = 0;
+for (;;) {
+    $!=0; $_ = <C>;
+    if (m/^ -- ([^<>]+\<\S+\>)  (\w[^<>]+\w)$/) {
+       print <<END or die $!;
+Maintainer: $1
+Date: $2
+END
+        last;
+    } elsif (m/^ --\s*$/) {
+       last;
+    } elsif (!m/\S/) {
+       $blanks++;
+    } elsif (m/^  .*\n/) {
+       print " .\n" x $blanks or die $!;
+       $blanks=0;
+       print " $_" or die $!;
+    } else {
+       die "$!, $_ ?";
+    }
+}