From 83cedfd65c1c6b0dd70058dfed7c78424f7212f7 Mon Sep 17 00:00:00 2001 From: Paul D Weaver Date: Mon, 27 Feb 2012 17:11:59 -0500 Subject: [PATCH] Barnowl-RT readable source --- rt/BarnOwl/Makefile.PL | 8 + rt/{README.RT.par => BarnOwl/README} | 6 +- rt/BarnOwl/lib/BarnOwl/Module/RT.pm | 217 +++++++++++++++++++++++++++ rt/RT.par | Bin 2974 -> 0 bytes 4 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 rt/BarnOwl/Makefile.PL rename rt/{README.RT.par => BarnOwl/README} (57%) create mode 100644 rt/BarnOwl/lib/BarnOwl/Module/RT.pm delete mode 100644 rt/RT.par diff --git a/rt/BarnOwl/Makefile.PL b/rt/BarnOwl/Makefile.PL new file mode 100644 index 0000000..b32d97d --- /dev/null +++ b/rt/BarnOwl/Makefile.PL @@ -0,0 +1,8 @@ +use strict; +use warnings; + +use inc::Module::Install; + +barnowl_module('RT'); + +WriteAll; diff --git a/rt/README.RT.par b/rt/BarnOwl/README similarity index 57% rename from rt/README.RT.par rename to rt/BarnOwl/README index a71aaed..27e9b4b 100644 --- a/rt/README.RT.par +++ b/rt/BarnOwl/README @@ -1,7 +1,7 @@ Barnowl RT module -To install add RT.par to your modules directory in you bawnowl config -directory (usually ~/.owl/modules) +To install barnowl RT +ln -s /mit/snippets/rt/BarnOwl ~/.owl/modules/RT Go to help.mit.edu to set you rt password @@ -10,6 +10,6 @@ user passwd -Source is located at /mit/pweaver/git/rt-barnowl.git/ +Source tree is located at /mit/pweaver/git/rt-barnowl.git/ Email rt-barnowl if you would like commit access or if you have questions or bugs. \ No newline at end of file diff --git a/rt/BarnOwl/lib/BarnOwl/Module/RT.pm b/rt/BarnOwl/lib/BarnOwl/Module/RT.pm new file mode 100644 index 0000000..febf584 --- /dev/null +++ b/rt/BarnOwl/lib/BarnOwl/Module/RT.pm @@ -0,0 +1,217 @@ +use warnings; +use strict; + +=head1 NAME + +BarnOwl::Module::Rt + +=head1 DESCRIPTION + +Foo + +=cut + +package BarnOwl::Module::RT; +use IPC::Open3; +use Text::ParseWords; + +our $VERSION = '1.0.1'; + +my %queuemap; +my %commands = ( + "((?:set|add|del)\\s.*)", "edit ticket/\$t \$1", + "status\\s(deleted|resolved|rejected|open|new|waiting)", "edit ticket/\$t set status=\$1", + "(d|del|delete)", "edit ticket/\$t set status=deleted", + "(r|res|resolve)", "edit ticket/\$t set status=resolved", + "show", "show -l ticket/\$t/history", + "show (\\d+)", "show -l ticket/\$1/history", + "list", 'rt list -o +Created "((Status=new or Status=stalled or Status=open) and (Queue=\'$q\'))"', + "list (\\w+)", 'rt list -o +Created "((Status=new or Status=stalled or Status=open) and (Queue=\'\$1\'))"', + "merge (\\d+)", "rt merge \$t \$1", + "(take|untake|steal)", "rt \$1 \$t", + "(?:owner|give)\\s(\\w+)", "edit ticket/\$t set owner=\$1", + ); + + + +my $cfg = BarnOwl::get_config_dir(); +my $file_path = "$cfg/rtqueuemap"; +if(-r "$file_path") { + open(my $fh, "<:encoding(UTF-8)", "$file_path") or die("Unable to read $file_path:$!\n"); + while(defined(my $line = <$fh>)) { + next if $line =~ /^\s+#/; + next if $line =~ /^\s+$/; + my ($class, $q) = quotewords('\s+', 0, $line); + $queuemap{lc($class)} = $q; + } + close($fh); +} + +my $file_path = "$cfg/rtcommands"; +if(-r "$file_path") { + open(my $fh, "<:encoding(UTF-8)", "$file_path") or die("Unable to read $file_path:$!\n"); + while(defined(my $line = <$fh>)) { + next if $line =~ /^\s+#/; + next if $line =~ /^\s+$/; + my ($match, $command) = quotewords('\s+', 0, $line); + $commands{$match} = $command; + } + close($fh); +} + + + +sub cmd_rt{ + shift @_; + my $args = join(' ', @_); + my $m = owl::getcurmsg(); + my ($ticket) = $m->instance =~ m/^\D*(\d{7})\D*$/; + my ($class) = $m->class =~ /^(?:un)*(.+?)(?:[.]d)*$/i; + my $queue = $queuemap{$class}; + + for my $key (keys %commands) + { + my $value = $commands{$key}; + if($args =~ m/^\s*$key\s*$/){ + my $match = $value; + my @numargs = @+; + #my $match = qr/\Q$key\E/ + if($value =~ m/\$t/){ + if(!$ticket){ + BarnOwl::error("Command 'rt " . $args . "' requires a message with ticket number selected"); + return; + } + $match =~ s/\$t/$ticket/; + } + if($value =~ m/\$q/){ + if(!$queue){ + BarnOwl::error("Command 'rt " . $args . "' requires a class in rtqueuemap selected"); + return; + } + $match =~ s/\$q/$queue/; + } + for my $digit ($value =~ m/\$(\d)/g){ + $args =~ m/^\s*$key\s*$/; + my $replace = substr($args, $-[$digit], $+[$digit] - $-[$digit]); + $match =~ s/\$$digit/$replace/; + } + return run_rt_command( quotewords('\s+', 0, $match) ); + } + } + + BarnOwl::error("No Matching RT command found for: '" . $args . "'" ); + return; +} + +sub run_rt_command{ + my @args = ("athrun","tooltime","rt"); + push (@args, @_); + local(*IN, *OUT, *ERR); + open3(*IN, *OUT, *ERR, @args) || die("RT threw $!"); + close(*IN); + my $out = do { local $/; }; + close(*OUT); + $out .= do { local $/; }; + close(*ERR); + if (($out =~ tr/\n//) eq 1){ + return $out; + } + BarnOwl::popless_text($out); + return; +} + +BarnOwl::new_command("rt", + \&cmd_rt, + { + summary => "rt commands in barnowl", + usage => "rt ", + description => < - runs rt (set|add|del) with relevent args - Dangerous if not careful + rt [d|del|delete] - mark a ticket deleted + rt [r|res|resolve] - mark a ticked resolved + rt status [deleted|resolved|new|open|waiting|rejected] - set status of a ticket + rt show - show detailed history of selected ticket + rt show - show history of + rt list - list open tickets of current queue + rt list - lists open tickets of + rt merge - merges current ticket with + rt [take|untake|steal] - takes, untakes, or steals ticket + rt [owner|give] - gives selected ticket to + +config: + Go to help.mit.edu to set you rt password + + In ~\/.rtrc add the following lines: + user + passwd + + +rtqueuemap: + ~\/.owl\/rtqueuemap is a list of queues in the form of + class queue + which is used for the queue in commands like the rt list function which select the current queue + help "Some Help Queue" +rtcommands: + ~\/.owl\/rtcommands is a file where you can put custom + commands to map the barnowl rt module with the rt command + line tool + + It is a good place to put custom queries which will be used frequently. + Examples: + "list-owner (\w+)" "rt list -o +Created \"((Status=new or Status=stalled or Status=open) and (Queue='\$q') and 'Owner='\$1')\"" + + \$t is the current ticket + \$q is the current queue + \$[digit] matches control groups in the first reg-exp +END_DESCR + }); + + +sub cmd_rt_reply { + my $cmd = shift; + my $type = "comment"; + if ($cmd eq "rt-reply"){ + $type = "correspond"; + } + + my $m = owl::getcurmsg(); + my ($ticket) = $m->instance =~ m/^\D*(\d{7})\D*$/; + if (!$ticket){ + BarnOwl::error("Command: '" . $cmd . "' requires a message with a ticket number selected"); + return; + } + + if(@_) { + return run_rt_command("rt", $type, "-m", join(" ", @_), $ticket); + } + return BarnOwl::start_edit_win($cmd . " ticket " . $ticket, sub {run_rt_command("rt", $type, "-m", @_, $ticket)}); + +} + +BarnOwl::new_command("rt-reply", + \&cmd_rt_reply, + { + summary => "Reply to current ticket", + usage => "rt-reply [message]", + description => < "Comment on the current ticket", + usage => "rt-reply [message]", + description => <16_jTkjb zaf2FH?OmHHQM!z4w6Qf_ZoT97?S0pCKF|4_^T+f3ob&tZYpBNzVh8M(8^~1c_rt*k z0tf<}9c`seP1pd;Vv-sL`|at&0RVzVU_bzfu?qkg{^>N^!L*I12jTxjKn@VCer50-Ohi`CyLqQX8p3Zh(VfQC=4EFmwzv9_T0SqYHgGt0%H3WhIfYW>c0N?jv z#wJp(w|>v*?jCKwzahTEj9(pZI~Jf7(5&e;0^N9)ddDH=7Wmo=FJCZ@%@OW8Cz@T_ zhj3iz6X#@A3Ai0V>-uPm)gE_FpCgt~QkH(&6?gARBy~+YCmv2?B2>k><%L8OJz9f4 zlCSNoPNdB2K$1J{uL4%$od-BRO@@cqA*i_!uQr2BFl0s zM?!`+w+9-g+yS5c~GY#Og`^zvj+_YKaFc|$V_9y`EBL5)Xt&O7kZ3C6pWIs3tJ2&VP6TKW%VF}5*cUgSw9yTUeaHz@0K^pga<|%9d8w;qe4N=LXYP;v zru)NdFdQEH6k89|w+GWDD)3fl^;q=G*og?rhxr5t^vpej_oQm(JU#I{`5oDAq57(; z)lgno@_gBk-J#Aij_lqqu?kb>;s{Xn`pQ<)qIJ2u0H(x=huHfinT5(`uPak2>I9Z? zsO7hpYC_C)stAhK=D4+pc8fJ|;{-{xQfu~0>5!A8<^kyRnfYB}D!gX#a6PckNiC2x z!X7Wut5R68++c46ZcZ|>tx*ab7h1!%axLF1H*?HyJyE{F;BPAmCYjGK$sGC1y2v@1 zk)AR$>7NI7Q-%iAf?rbXhIZF)S-+a^Bfs>b+Dl_-Zl9(TgB=xOI~?L^%~zWB#SVoh zaK4SSXj($_)F?4;$A??faw?%p886gxHoFQ4wTU_g###5hVrC$wCpjt@ryU$D2G^s5*ml^nrDfm3hdH8c2a+RpJ*@WZ=&m$mET)CEQf}B z^GY1@9^Y9_<4+b3mp8k*uxm(1(ZJ76`W}-tQq`y*>t|Y-U$>`>dx{~s`J3X~w2=l( zy1o1Jd~};V$KN&)Uc|Zh^K*c^GP7H6OcJ zbgS9bt7=BQ#2XZGzO%SEg~Bcm+p^@u+#b-ADuZPxFkU63p-Y83d61>;Z>q%G0^L-K zp$H?ljumlJ^G6?0Keg6yV{4y?okT#Ogx#IY#x?1S*JrjD<~k;go^LpA7i0OhoGawI zf#*rm_>AF#xcm7J)aapwPZTl@$#T$zJ{h}ZSpm|btR>;`o3{Qw<=R|rF04R)B0swE zGlcr|a)uJ_OI`2AT_NL9bKZeFWj$B*AO7rn_w^%jIvo8jUs?hK2{a{>GrGZwj0SpW zG&)0Typsda$?D}%Xis&@P&+z#SA6R()Jd ze3C5qVL^`^x4|sX6EUGM9B+`w?hdkv8>kq0ef_d*d>$~}Hz%31K_TY8g(Y?F*Rf3w3xfFO(!;4HmpEFIbUKY6H-HmhG)G3_LH=Qx1@&5T8hqj=u;bxNRdo`~widXI9$$@y zQB#eDFoc{a@nTp)nf0vE)AZsi1U3WDf}2NXwV090ZtWGDjUpP`YID3``rs2Y#II-^ zH?;YvtPpw2TGk6G=ZAp=6}S4$U5WOj$feq=Yj%0~a}}q=`N@T(MKL;+bw(wr`0Ua{ zV%oxfn$896bCkLQEYCwF$;RqTr1?TCt#k}qYF*x~vu*rzuzZgCrF8!MZ7s;F$_$$U zY_}>C>9_e1jn*Oo723!AAgCoyH{xEm;e!vJ^k%4q4s!mJG%U-%VL2$$C>Ru;Mxfx%1fn(JmRsj6+MEcKX-9x*N%mzFI z$EtSEGEzz_1*zJfcyqU=C{=ZWto*t*a;+vqAJ?Ae>Rb@#duThcnB&t|fXFnCvGcI^ zaOgReXhz}g0zRO_)7YHSt~y