diff options
author | Jesse Clark <jjclark1982@gmail.com> | 2010-02-01 21:44:09 +0100 |
---|---|---|
committer | Max Kanat-Alexander <mkanat@bugzilla.org> | 2010-02-01 21:44:09 +0100 |
commit | 094de4b3291a18c1da8b8e80825a98c429e4b735 (patch) | |
tree | 7d351e0bc46cd0f09aa0274eb1107f4cb4112a51 /contrib | |
parent | 7c239a7a387bf1a22df708a7ca05e596026ab73a (diff) | |
download | bugzilla-094de4b3291a18c1da8b8e80825a98c429e4b735.tar.gz bugzilla-094de4b3291a18c1da8b8e80825a98c429e4b735.tar.xz |
Bug 537766: Add contrib/console.pl, a script which allows using Perl with Bugzilla libraries in a read-eval-print loop.
Patch by Jesse Clark <jjclark1982@gmail.com> r=mkanat, a=mkanat
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/console.pl | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/contrib/console.pl b/contrib/console.pl new file mode 100644 index 000000000..e9d06cd94 --- /dev/null +++ b/contrib/console.pl @@ -0,0 +1,186 @@ +#!/usr/bin/perl -w +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is the Bugzilla Bug Tracking System. +# +# The Initial Developer of the Original Code is the National Aeronautics +# and Space Administration of the United States Government. +# Portions created by the Initial Developer are Copyright (C) 2010 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): Jesse Clark <jjclark1982@gmail.com> + +use File::Basename; +BEGIN { chdir dirname($0) . "/.."; } +use lib qw(. lib); + +use Bugzilla; +use Bugzilla::Constants; +use Bugzilla::Util; +use Bugzilla::Bug; + +use Term::ReadLine; +use Data::Dumper; +$Data::Dumper::Sortkeys = 1; +$Data::Dumper::Terse = 1; +$Data::Dumper::Indent = 1; +$Data::Dumper::Useqq = 1; +$Data::Dumper::Maxdepth = 1; +$Data::Dumper::Deparse = 0; + +my $sysname = get_text('term', {term => 'Bugzilla'}); +my $term = new Term::ReadLine "$sysname Console"; +read_history($term); +END { write_history($term) } + +while ( defined (my $input = $term->readline("$sysname> ")) ) { + my @res = eval($input); + if ($@) { + warn $@; + } + else { + print Dumper(@res); + } +} +print STDERR "\n"; +exit 0; + +# d: full dump (normal behavior is limited to depth of 1) +sub d { + local $Data::Dumper::Maxdepth = 0; + local $Data::Dumper::Deparse = 1; + print Dumper(@_); + return (); +} + +# p: print as a single string (normal behavior puts list items on separate lines) +sub p { + local $^W=0; # suppress possible undefined var message + print(@_, "\n"); + return (); +} + +sub filter { + my $name = shift; + my $filter = Bugzilla->template->{SERVICE}->{CONTEXT}->{CONFIG}->{FILTERS}->{$name}; + if (scalar @_) { + return $filter->(@_); + } + else { + return $filter; + } +} + +sub b { get_object('Bugzilla::Bug', @_) } +sub u { get_object('Bugzilla::User', @_) } +sub f { get_object('Bugzilla::Field', @_) } + +sub get_object { + my $class = shift; + $_ = shift; + my @results = (); + + if (ref $_ eq 'HASH' && keys %$_) { + @results = @{$class->match($_)}; + } + elsif (m/^\d+$/) { + @results = ($class->new($_)); + } + elsif (m/\w/i && grep {$_ eq 'name'} ($class->DB_COLUMNS)) { + @results = @{$class->match({name => $_})}; + } + else { + @results = (); + } + + if (wantarray) { + return @results; + } + else { + return shift @results; + } +} + +sub read_history { + my ($term) = @_; + + if (open HIST, "<$ENV{HOME}/.bugzilla_console_history") { + foreach (<HIST>) { + chomp; + $term->addhistory($_); + } + close HIST; + } +} + +sub write_history { + my ($term) = @_; + + if ($term->can('GetHistory') && open HIST, ">$ENV{HOME}/.bugzilla_console_history") { + my %seen_hist = (); + my @hist = (); + foreach my $line (reverse $term->GetHistory()) { + next unless $line =~ m/\S/; + next if $seen_hist{$line}; + $seen_hist{$line} = 1; + push @hist, $line; + last if (scalar @hist > 500); + } + foreach (reverse @hist) { + print HIST $_, "\n"; + } + close HIST; + } +} + +__END__ + +=head1 NAME + +B<console.pl> - command-line interface to Bugzilla API + +=head1 SYNOPSIS + +$ B<contrib/console.pl> + +Bugzilla> B<b(5)-E<gt>short_desc> + +=over 8 + +"Misplaced Widget" + +=back + +Bugzilla> B<$f = f "cf_subsystem"; scalar @{$f-E<gt>legal_values}> + +=over 8 + +177 + +=back + +Bugzilla> B<p filter html_light, "1 E<lt> 2 E<lt>bE<gt>3E<lt>/bE<gt>"> + +=over 8 + +1 < 2 E<lt>bE<gt>3E<lt>/bE<gt> + +=back + +Bugzilla> B<$u = u 5; $u-E<gt>groups; d $u> + +=head1 DESCRIPTION + +Loads Bugzilla packages and prints expressions with Data::Dumper. +Useful for checking results of Bugzilla API calls without opening +a debug file from a cgi. |