Autocommit of file /home/julien/scripts/mutt-fetchbug changed on host ares
[dotfiles/scripts.git] / mutt-fetchbug
1 #!/usr/bin/perl -w
2 #
3 # mutt-fetchbug, extensively based off of
4 #       mutt-notmuch - notmuch (of a) helper for Mutt
5 #
6 #       Copyright: © 2011 Stefano Zacchiroli <zack@upsilon.cc>
7 #       License: GNU General Public License (GPL), version 3 or above
8 #
9 # Differences between mutt-notmuch and mutt-fetchbug are
10 #       Copyright: © 2012 Ryan Kavanagh <rak@debian.org>
11 #       License: GNU General Public License (GPL), version 3 or above
12 #
13 # See the bottom of this file for more documentation.
14 # A manpage can be obtained by running "pod2man mutt-fetchbug > mutt-fetchbug.1"
15
16 use strict;
17 use warnings;
18
19 use File::Path;
20 use Getopt::Long;
21 use Pod::Usage;
22
23 # search($btsmbox, $query)
24 # Fetch bugs matching $query with bts; store results in $btsmbox
25 sub search($$) {
26     my ($btsmbox, $query) = @_;
27
28     system("bts --cache-mode=mbox cache $query"
29            . " && ln -fs ~/.devscripts_cache/bts/$query.mbox $btsmbox");
30 }
31
32 sub search_action($$@) {
33     my ($interactive, $btsmbox, @params) = @_;
34
35     if (! $interactive) {
36         fetch($btsmbox, join(' ', @params));
37     } else {
38         my $query = "";
39         my $done = 0;
40         while (! $done) {
41             print "bug number ('?' for man): ";
42             chomp($query = <STDIN>);
43             if ($query eq "?") {
44                 system("man bts");
45             } elsif ($query eq "") {
46                 $done = 1;      # quit doing nothing
47             } else {
48                 search($btsmbox, $query);
49                 $done = 1;
50             }
51         }
52     }
53 }
54
55 sub die_usage() {
56     my %podflags = ( "verbose" => 1,
57                     "exitval" => 2 );
58     pod2usage(%podflags);
59 }
60
61 sub main() {
62     my $btsmbox = "$ENV{HOME}/.cache/mutt_btsresults";
63     my $interactive = 0;
64     my $help_needed = 0;
65
66     my $getopt = GetOptions(
67         "h|help" => \$help_needed,
68         "o|output-mbox=s" => \$btsmbox,
69         "p|prompt" => \$interactive);
70     if (! $getopt || $#ARGV < 0) { die_usage() };
71     my ($action, @params) = ($ARGV[0], @ARGV[1..$#ARGV]);
72
73     if ($help_needed) {
74         die_usage();
75     } elsif ($action eq "search" && $#ARGV == 0 && ! $interactive) {
76         print STDERR "Error: no search term provided\n\n";
77         die_usage();
78     } elsif ($action eq "search") {
79         search_action($interactive, $btsmbox, @params);
80     } else {
81         die_usage();
82     }
83 }
84
85 main();
86
87 __END__
88
89 =head1 NAME
90
91 mutt-fetchbug - 'bts show' frontend for Mutt
92
93 =head1 SYNOPSIS
94
95 =over
96
97 =item B<mutt-fetchbug> [I<OPTION>]... search [I<SEARCH-TERM>]...
98
99 =back
100
101 =head1 DESCRIPTION
102
103 mutt-fetchbug is a frontend to the 'bts show' command (Debian package:
104 devscripts) designed to fetch bugs and place them in a predefined mbox. The
105 search term should typically be a bug number.
106
107 =head1 OPTIONS
108
109 =over 4
110
111 =item -o DIR
112
113 =item --output-mbox DIR
114
115 Store search results as (symlink) mbox MBOX. Beware: MBOX will be overwritten.
116 (Default: F<~/.cache/mutt_btsresults/>)
117
118 =item -p
119
120 =item --prompt
121
122 Instead of using command line search terms, prompt the user for them (only for
123 "search").
124
125 =item -h
126
127 =item --help
128
129 Show usage information and exit.
130
131 =back
132
133 =head1 INTEGRATION WITH MUTT
134
135 mutt-fetchbug can be used to integrate 'bts show' with the Mutt mail user agent
136 (unsurprisingly, given the name). To that end, you should define the following
137 macros in your F<~/.muttrc> (replacing F<~/bin/mutt-fetchbug> for the actual
138 location of mutt-fetchbug on your system):
139
140     macro index <F7> \
141         "<enter-command>unset wait_key<enter><shell-escape>~/bin/mutt-fetchbug --prompt search<enter><change-folder-readonly>~/.cache/mutt_btsresults<enter><enter-command>set wait_key<enter>" \
142         "fetch bug(s) (using bts show)"
143
144 The macro (activated by <F7>) will prompt the user for a bug number and then
145 jump to a temporary mbox showing the fetched bug.
146
147 =head1 SEE ALSO
148
149 mutt(1), bts(1)
150
151 =head1 AUTHOR
152
153 mutt-fetchbug is extensively based off of 'mutt-notmuch', which is
154 Copyright: (C) 2011 Stefano Zacchiroli <zack@upsilon.cc>.
155
156 All differences between mutt-fetchbug and mutt-notmuch are
157 Copyright (C) 2012 Ryan Kavanagh <rak@debian.org>
158
159 License: GNU General Public License (GPL), version 3 or higher
160
161 =cut