/[qa]/trunk/pts/bin/pts
ViewVC logotype

Contents of /trunk/pts/bin/pts

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2003 - (hide annotations) (download)
Sat Oct 11 23:02:15 2008 UTC (4 years, 7 months ago) by myon
File size: 12080 byte(s)
Print keywords in package list when they differ from the default set (Closes: #501907)
While we are at it, add "who" as an alias for "list" in control.pl
1 myon 1451 #!/usr/bin/perl -w
2     # vim:sw=4:
3    
4     # Copyright 2002-2006 Raphaël Hertzog <hertzog@debian.org>
5 myon 1518 # Copyright 2006-2007 Christoph Berg <myon@debian.org>
6 myon 1451 # Available under the terms of the General Public License version 2
7     # or (at your option) any later version
8    
9     use lib '/org/packages.qa.debian.org/perl';
10    
11     use ConfirmationSpool;
12     use DB_File;
13    
14     use strict;
15     use vars qw($spool_dir $conf_sub_template $conf_unsub_template
16     $conf_unsuball_template $sendmaildefault $sendmailnobody
17     %db_tags_content);
18    
19     # Command line frontend for pts@qa.debian.org
20    
21     require "common.pl";
22    
23     my $email = ((getpwuid($<))[0]) . "\@debian.org";
24    
25     # Lines of the mail we got
26     my @lines = @ARGV ? join " ", @ARGV : <>;
27    
28     # Lines of the answer that we'll send
29     my @ans; # = ("Processing commands for pts\@qa.debian.org:\n", "\n");
30    
31     foreach my $line (@lines) {
32     #push @ans, "> $line\n";
33    
34     # Try to detect commands
35     if ($line =~ /^\s*#/) {
36     next;
37    
38     } elsif ($line =~ /^\s*subscribe\s+(\S+)(?:\s+(\S+))?/i) {
39     my ($package, $address) = (lc($1), lc($2));
40     $address = $email if (! (defined($address) && $address));
41     my @explanation;
42     ($package, @explanation) = map_package($package);
43     push @ans, @explanation;
44     if (subscribe($address, $package)) {
45     push @ans, "$address has been subscribed to " .
46     "$package\@packages.qa.debian.org.\n";
47     } else {
48     push @ans, "$address is already subscribed ...\n";
49     }
50    
51     } elsif ($line =~ /^\s*unsubscribe\s+(\S+)(?:\s+(\S+))?/i) {
52     my ($package, $address) = (lc($1), lc($2));
53     $address = $email if (! (defined($address) && $address));
54     if (unsubscribe($address, $package)) {
55 myon 1518 # users might still be subscribed to a renamed package
56 myon 1451 push @ans, "$address has been unsubscribed from " .
57     "$package\@packages.qa.debian.org.\n";
58     } else {
59 myon 1518 # try the canonical name
60     my ($new_package, @explanation) = map_package($package);
61     push @ans, @explanation;
62     if (unsubscribe($address, $new_package)) {
63     push @ans, "$address has been unsubscribed from " .
64     "$new_package\@packages.qa.debian.org.\n";
65     } else {
66     push @ans, "$address is not subscribed, you can't unsubscribe.\n";
67     }
68 myon 1451 }
69    
70     } elsif ($line =~ /^\s*unsubscribeall(?:\s+(\S+))?/i) {
71     my $address = lc($1);
72     $address = $email if (! (defined($address) && $address));
73     my @explanation;
74     push @ans, "All your subscriptions have been terminated :\n";
75     foreach my $package (which($address)) {
76     if (unsubscribe($address, $package)) {
77     push @ans, "$address has been unsubscribed from " .
78     "$package\@packages.qa.debian.org.\n";
79     } else {
80     push @ans, "$address is not subscribed, you can't unsubscribe.\n";
81     }
82     }
83    
84     } elsif ($line =~ /^\s*confirm\s+(\S+)/i) {
85     # my $key = $1;
86     # next if (defined($done{"CONFIRM $key"})); # Not twice..
87     # if (defined($cmd)) {
88     # my ($package, $address);
89     # if ($cmd =~ /^SUBSCRIBE (\S+) (\S+)/) {
90     # ($package, $address) = (lc($1), lc($2));
91     # if (subscribe($address, $package)) {
92     # push @ans, "$address has been subscribed to " .
93     # "$package\@packages.qa.debian.org.\n";
94     # $subject = "You are now subscribed to $package";
95     # } else {
96     # push @ans, "$address is already subscribed ...\n";
97     # }
98     # } elsif ($cmd =~ /^UNSUBSCRIBE (\S+) (\S+)/) {
99     # ($package, $address) = (lc($1), lc($2));
100     # if (unsubscribe($address, $package)) {
101     # push @ans, "$address has been unsubscribed from " .
102     # "$package\@packages.qa.debian.org.\n";
103     # $subject = "You are no longer subscribed to $package";
104     # } else {
105     # push @ans, "$address is not subscribed, you can't unsubscribe.\n";
106     # }
107     # } elsif ($cmd =~ /^UNSUBSCRIBEALL (\S+)/) {
108     # $address = lc($1);
109     # push @ans, "All your subscriptions have been terminated :\n";
110     # foreach my $package (which($address)) {
111     # if (unsubscribe($address, $package)) {
112     # push @ans, "$address has been unsubscribed from " .
113     # "$package\@packages.qa.debian.org.\n";
114     # $subject = "All your subcriptions have been terminated";
115     # } else {
116     # push @ans, "$address is not subscribed, you can't unsubscribe.\n";
117     # }
118     # }
119     # } else {
120     # push @ans, "Confirmation failed. Retry with a new command.\n";
121     # }
122     # $done{"CONFIRM $key"} = 1;
123     # #push @cc, $address if ($address ne $email);
124     # } else {
125     push @ans, "Confirmation failed. Retry with a new command.\n";
126     # }
127     push @ans, "\n";
128    
129     } elsif ($line =~ /^\s*which(?:\s+(\S+))?/i) {
130    
131     my $address = lc($1);
132     $address = $email if (! (defined($address) && $address));
133 myon 2003 my $default_tags = join ',', get_default_tags($address);
134 myon 1451 push @ans, "Here's the list of subscriptions for $address :\n";
135 myon 2003 push @ans, map {
136     my $tags = join ',', get_tags($address, $_);
137     "* $_" . ($tags ne $default_tags ? " [$tags]" : "") . "\n"
138     } (which($address));
139 myon 1451 push @ans, "\n";
140    
141 myon 1518 } elsif ($line =~ /^\s*(?:list|who)\s+(\S+)/i) {
142 myon 1451
143     my $package = lc($1);
144     push @ans, "Here's the list of subscribers to $package :\n";
145     push @ans, map { $_ . "\n" } (list($package));
146     push @ans, "\n";
147    
148     } elsif ($line =~ /^\s*(?:keyword|tag)s?(?:\s+(\S+@\S+))?\s*$/i) {
149    
150     my $address = lc($1);
151     $address = $email if (! (defined($address) && $address));
152     push @ans, "Here's the default list of accepted keywords " .
153     "for $address :\n";
154     push @ans, map { "* " . $_ . "\n" } (get_default_tags($address));
155     push @ans, "\n";
156    
157 myon 1453 } elsif ($line =~ /^\s*(?:keyword|tag)s?\s+(\S+)(?:\s+(\S+@\S+))?\s*$/i) {
158 myon 1451
159     my $package = lc($1);
160     my $address = lc($2);
161     $address = $email if (! (defined($address) && $address));
162     push @ans, "Here's the list of accepted keywords associated to " .
163     "package\n";
164     push @ans, "$package for $address :\n";
165     push @ans, map { "* " . $_ . "\n" } (get_tags($address, $package));
166     push @ans, "\n";
167    
168     } elsif ($line =~ /^\s*(?:keyword|tag)s?(?:\s+(\S+@\S+))?\s+([-+=])\s+(\S+(?:\s+\S+)*)\s*$/i) {
169    
170     my $address = lc($1);
171     $address = $email if (! (defined($address) && $address));
172     my $cmd = $2;
173     my @t = split(/[,\s]+/, lc($3));
174     foreach (@t) {
175     push @ans, "WARNING: $_ is not a valid keyword.\n"
176     if (! is_valid_tag($_));
177     }
178     open_db_write();
179     if ($cmd eq "=") {
180     set_default_tags($address, @t);
181     } elsif ($cmd eq "+") {
182     my @tags = get_default_tags($address);
183     push @tags, @t;
184     set_default_tags($address, @tags);
185     } elsif ($cmd eq "-") {
186     my $check = sub {
187     foreach my $t (@t) {
188     return 0 if ($_[0] eq $t);
189     }
190     return 1;
191     };
192     my @tags = grep { &$check($_) } (get_default_tags($address));
193     set_default_tags($address, @tags);
194     }
195     push @ans, "Here's the new default list of accepted keywords " .
196     "for $address :\n";
197     push @ans, map { "* " . $_ . "\n" } (get_default_tags($address));
198     push @ans, "\n";
199     close_db();
200    
201     } elsif ($line =~ /^\s*(?:keyword|tag)s?all(?:\s+(\S+@\S+))?\s+([-+=])\s+(\S+(?:\s+\S+)*)\s*$/i) {
202    
203     my $address = lc($1);
204     $address = $email if (! (defined($address) && $address));
205     my $cmd = $2;
206     my @t = split(/[,\s]+/, lc($3));
207     foreach (@t) {
208     push @ans, "WARNING: $_ is not a valid keyword.\n"
209     if (! is_valid_tag($_));
210     }
211     open_db_write();
212     if (not exists $db_tags_content{$address}) {
213     my @tags = get_default_tags($address);
214     set_default_tags($address, @tags);
215     }
216     foreach (sort keys %db_tags_content) {
217     if (/^\Q$address\E(?:#([^#]+))?$/) {
218     my $package = (defined($1) && $1) ? $1 : "";
219     if ($cmd eq "=") {
220     if ($package) {
221     set_tags($address, $package, @t);
222     } else {
223     set_default_tags($address, @t);
224     }
225     } elsif ($cmd eq "+") {
226     if ($package) {
227     my @tags = get_tags($address, $package);
228     push @tags, @t;
229     set_tags($address, $package, @tags);
230     } else {
231     my @tags = get_default_tags($address);
232     push @tags, @t;
233     set_default_tags($address, @tags);
234     }
235     } elsif ($cmd eq "-") {
236     my $check = sub {
237     foreach my $t (@t) {
238     return 0 if ($_[0] eq $t);
239     }
240     return 1;
241     };
242     if ($package) {
243     my @tags = grep { &$check($_) } (get_tags($address, $package));
244     set_tags($address, $package, @tags);
245     } else {
246     my @tags = grep { &$check($_) } (get_default_tags($address));
247     set_default_tags($address, @tags);
248     }
249     }
250     if ($package) {
251     push @ans, "Updated the list of keywords accepted by $address ".
252     "for the package $package.\n";
253     } else {
254     push @ans, "Updated the default list of keywords accepted by $address.\n";
255     }
256     }
257     }
258     close_db();
259    
260     } elsif ($line =~ /^\s*(?:keyword|tag)s?\s+(\S+)(?:\s+(\S+@\S+))?\s+([-+=])\s+(\S+(?:\s+\S+)*)\s*$/i) {
261    
262     my $package = lc($1);
263     my $address = lc($2);
264     $address = $email if (! (defined($address) && $address));
265     my $cmd = $3;
266     my @t = split(/[,\s]+/, lc($4));
267     foreach (@t) {
268     push @ans, "$_ is not a valid keyword.\n" if (! is_valid_tag($_));
269     }
270     open_db_write();
271     if ($cmd eq "=") {
272     set_tags($address, $package, @t);
273     } elsif ($cmd eq "+") {
274     my @tags = get_tags($address, $package);
275     push @tags, @t;
276     set_tags($address, $package, @tags);
277     } elsif ($cmd eq "-") {
278     my $check = sub {
279     foreach my $t (@t) {
280     return 0 if ($_[0] eq $t);
281     }
282     return 1;
283     };
284     my @tags = grep { &$check($_) } (get_tags($address, $package));
285     set_tags($address, $package, @tags);
286     }
287     push @ans, "Here's the new list of accepted keywords associated to " .
288     "package\n";
289     push @ans, "$package for $address :\n";
290     push @ans, map { "* " . $_ . "\n" } (get_tags($address, $package));
291     push @ans, "\n";
292     close_db();
293    
294     } elsif ($line =~ /^\s*help/i) {
295     push @ans, <DATA>;
296    
297     } elsif ($line =~ /^(--|\s*quit|\s*thanks?|\s*txs)/i) {
298     push @ans, "Stopping processing here.\n";
299     last;
300    
301     } else {
302 myon 1452 push @ans, "Invalid command.\n";
303 myon 1451 }
304     }
305    
306     print join "", @ans;
307    
308    
309     __DATA__
310    
311     Debian Package Tracking System
312     ------------------------------
313    
314     The Package Tracking System (PTS) has the following commands:
315    
316     subscribe <srcpackage> [<email>]
317     Subscribes <email> to all messages regarding <srcpackage>. If
318     <email> is not given, it subscribes the From address. If the
319     <srcpackage> is not a valid source package, you'll get a warning.
320     If it's a valid binary package, the mapping will automatically be
321     done for you.
322    
323     unsubscribe <srcpackage> [<email>]
324     Unsubscribes <email> from <srcpackage>. Like the subscribe command,
325     it will use the From address if <email> is not given.
326    
327     unsubscribeall [<email>]
328     Cancel all subscriptions of <email>. Like the subscribe command,
329     it will use the From address if <email> is not given.
330    
331     which [<email>]
332     Tells you which packages <email> is subscribed to.
333    
334     keyword [<email>]
335     Tells you the keywords that you are accepting. Each mail sent through
336     the Package Tracking System is associated to a keyword and you receive
337     only the mails associated to keywords that you are accepting. Here is
338     the list of available keywords :
339     * bts: mails coming from the Debian Bug Tracking System
340     * bts-control: mails sent to control@bugs.debian.org
341     * summary: automatic summary mails about the state of a package
342     * cvs: notification of cvs commits
343     * ddtp: notification of translations from the DDTP (cf ddtp.debian.org)
344     * derivatives: notification of changes in derivative distributions
345     * upload-source: announce of a new source upload that has been installed
346     * upload-binary: announce of a new binary-only upload (porting)
347     * katie-other: other mails from ftpmasters (override disparity, etc.)
348     * default: all the other mails (those which aren't "automatic")
349     By default you have the following keywords : bts, bts-control, summary,
350     upload-source, katie-other, default.
351    
352     keyword <srcpackage> [<email>]
353     Same as previous item but for the given source package since
354     you may select a different set of keywords for each source package.
355    
356     keyword [<email>] {+|-|=} <list of keywords>
357     Accept (+) or refuse (-) mails associated to the given keyword(s).
358     Define the list (=) of accepted keywords.
359    
360     keyword <srcpackage> [<email>] {+|-|=} <list of keywords>
361     Same as previous item but overrides the keywords list for the indicated
362     source package.
363    
364     quit
365     thanks
366     Stops processing commands.
367    

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.5