summaryrefslogtreecommitdiffstats
path: root/_testing/_irssi_test.pl
diff options
context:
space:
mode:
authorAilin Nemui2014-06-16 04:11:29 +0200
committerAilin Nemui2014-06-24 18:28:59 +0200
commitca374a4a1acec99b19486549071ef6c9968b749a (patch)
treeec4f7f7e66b423c392b5dbb46e424ec56a43247c /_testing/_irssi_test.pl
parent525b2128888f1e3ca2088a54cc086b102dbfe690 (diff)
downloadscripts.irssi.org-ca374a4a1acec99b19486549071ef6c9968b749a.tar.bz2
Add travis testing to Irssi scripts.
Diffstat (limited to '_testing/_irssi_test.pl')
-rw-r--r--_testing/_irssi_test.pl78
1 files changed, 78 insertions, 0 deletions
diff --git a/_testing/_irssi_test.pl b/_testing/_irssi_test.pl
new file mode 100644
index 0000000..1da8f59
--- /dev/null
+++ b/_testing/_irssi_test.pl
@@ -0,0 +1,78 @@
+use strict;
+use warnings;
+
+BEGIN {
+ *CORE::GLOBAL::exit = sub (;$) {
+ require Carp;
+ Carp::croak("script tried to call exit @_");
+ };
+}
+
+my $CURRENT_SCRIPT = $ENV{CURRENT_SCRIPT};
+my $PWD = $ENV{PWD};
+my $SWD = "$PWD/../..";
+Irssi::command('^window log on');
+Irssi::command("script load $CURRENT_SCRIPT");
+Irssi::command('^window log off');
+
+my ($package) = grep { !/^_/ } keys %Irssi::Script::;
+
+require YAML::Tiny;
+require Module::CoreList;
+require CPAN::Meta::Requirements;
+require Perl::PrereqScanner;
+my $prereq_results = Perl::PrereqScanner->new->scan_file("$SWD/scripts/$CURRENT_SCRIPT.pl");
+my @modules = grep {
+ $_ ne 'perl' &&
+ $_ ne 'Irssi' && $_ ne 'Irssi::UI' && $_ ne 'Irssi::TextUI' && $_ ne 'Irssi::Irc'
+ && !Module::CoreList->first_release($_)
+} sort keys %{ $prereq_results->as_string_hash };
+
+my (%info, $version);
+unless (defined $package) {
+ my %fail = (failed => 1, name => $CURRENT_SCRIPT);
+ $fail{modules} = \@modules if @modules;
+ { open my $ef, '>:utf8', "failed.yml";
+ print $ef YAML::Tiny::Dump([\%fail]); }
+ # Grep for the code instead
+ require PPI;
+ require PPIx::XPath;
+ require Tree::XPathEngine;
+ my $xp = Tree::XPathEngine->new;
+ my $doc = PPI::Document->new("$SWD/scripts/$CURRENT_SCRIPT.pl");
+ my ($version_code) = $xp->findnodes(q{//*[./Token-Symbol[1] = "$VERSION" and ./Token-Operator = "="]}, $doc);
+ my ($irssi_code) = $xp->findnodes(q{//*[./Token-Symbol[1] = "%IRSSI" and ./Token-Operator = "="]}, $doc);
+ $version = eval "no strict; package DUMMY; undef; $version_code";
+ %info = eval "no strict; package DUMMY; (); $irssi_code";
+}
+else {
+ %info = do { no strict 'refs'; %{"Irssi::Script::${package}IRSSI"} };
+ $version = do { no strict 'refs'; ${"Irssi::Script::${package}VERSION"} };
+}
+delete $info{''};
+for my $rb (keys %info) {
+ delete $info{$rb} if $rb =~ /\(0x[[:xdigit:]]+\)$/;
+ delete $info{$rb} unless defined $info{$rb};
+}
+
+if (!%info || !defined $info{name}) {
+ open my $ef, '>>', "perlcritic.log";
+ print $ef 'No %IRSSI header in script or name not given. (Severity: 6)', "\n";
+ $info{name} //= $CURRENT_SCRIPT;
+}
+if (!defined $version) {
+ open my $ef, '>>', "perlcritic.log";
+ print $ef 'Missing $VERSION in script. (Severity: 6)', "\n";
+}
+else {
+ $info{version} = $version;
+}
+chomp(my $loginfo = `git log 2d0759e6... -1 --format=%ai -- "$SWD/scripts/$CURRENT_SCRIPT.pl"`);
+if ($loginfo) {
+ my ($date, $time) = split ' ', $loginfo;
+ $info{modified} = "$date $time";
+}
+$info{modules} = \@modules if @modules;
+$info{default_package} = $package =~ s/::$//r if $package;
+{ open my $ef, '>:utf8', "info.yml";
+ print $ef YAML::Tiny::Dump([\%info]); }