6 Debbugs::User -- User settings
10 use Debbugs::User qw(is_valid_user read_usertags write_usertags);
12 Debbugs::User::is_valid_user($userid);
14 $u = Debbugs::User::open($userid);
15 $u = Debbugs::User::open(user => $userid, locked => 0);
17 $u = Debbugs::User::open(user => $userid, locked => 1);
26 read_usertags(\%ut, $userid);
27 write_usertags(\%ut, $userid);
33 =item :all -- all functions that can be exported
44 use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT);
45 use base qw(Exporter);
48 ($VERSION) = q$Revision: 1.4 $ =~ /^Revision:\s+([^\s+])/;
49 $DEBUG = 0 unless defined $DEBUG;
52 @EXPORT_OK = qw(is_valid_user open);
53 $EXPORT_TAGS{all} = [@EXPORT_OK];
56 my $gSpoolDir = "/org/bugs.debian.org/spool";
57 if (defined($debbugs::gSpoolDir)) {
58 $gSpoolDir = $debbugs::gSpoolDir;
61 # Obsolete compatability functions
67 my $user = get_user($u);
68 for my $t (keys %{$user->{"tags"}}) {
69 $ut->{$t} = [] unless defined $ut->{$t};
70 push @{$ut->{$t}}, @{$user->{"tags"}->{$t}};
78 my $user = get_user($u, 1); # locked
79 $user->{"tags"} = { %{$ut} };
83 #######################################################################
88 my $l = length($e) % 7;
89 return "$gSpoolDir/user/$l/" . join("",
90 map { m/^[0-9a-zA-Z_+.-]$/ ? $_ : sprintf("%%%02X", ord($_)) }
102 if ($field && m/^ (.*)$/) {
103 $res[-1] .= "\n" . $1;
104 } elsif (m/^([^:]+):(\s+(.*))?$/) {
117 while ($s =~ m/^([^,]*,\s*)(.*)$/ || $s =~ m/^([^,]+)()$/) {
120 unless ($sofar == 0 or $sofar + length($k) <= $n) {
125 $sofar += length($k);
132 return ($u =~ /^[a-zA-Z0-9._+-]+[@][a-z0-9-.]{4,}$/);
135 #######################################################################
143 "visible_cats" => [],
144 "unknown_stanzas" => []
148 my $need_lock = shift || 0;
149 my $p = filefromemail($u);
152 $user->{"filename"} = $p;
154 return bless $user, "Debbugs::User";
156 open($uf, "< $p") or die "Unable to open file $p for reading: $!";
159 $user->{"locked"} = $uf;
163 my @stanza = read_stanza($uf);
164 last if ($#stanza == -1);
165 if ($stanza[0] eq "Tag") {
168 $ut->{$t} = [] unless defined $ut->{$t};
169 push @{$ut->{$t}}, split /\s*,\s*/, $tag{Bugs};
170 } elsif ($stanza[0] eq "Category") {
172 my %stanza = @stanza;
173 my $catname = $stanza{"Category"};
175 while (++$i && defined $stanza{"Cat${i}"}) {
176 if (defined $stanza{"Cat${i}Options"}) {
178 my %c = ("nam" => $stanza{"Cat${i}"});
179 $c{"def"} = $stanza{"Cat${i}Default"}
180 if defined $stanza{"Cat${i}Default"};
181 $c{"ord"} = [ split /,/, $stanza{"Cat${i}Order"} ]
182 if defined $stanza{"Cat${i}Order"};
184 for my $l (split /\n/, $stanza{"Cat${i}Options"}) {
185 if ($l =~ m/^\s*(\S+)\s+-\s+(.*\S)\s*$/) {
188 } elsif ($l =~ m/^\s*(\S+)\s*$/) {
197 push @cat, $stanza{"Cat${i}"};
200 $user->{"categories"}->{$catname} = [@cat];
201 push @{$user->{"visible_cats"}}, $catname
202 unless ($stanza{"Hidden"} || "no") eq "yes";
204 push @{$user->{"unknown_stanzas"}}, [@stanza];
207 close($uf) unless $need_lock;
209 bless $user, "Debbugs::User";
216 my $ut = $user->{"tags"};
217 my $p = $user->{"filename"};
219 if ($p =~ m/^(.+)$/) { $p = $1; } else { return; }
220 open $uf, "> $p" or return;
222 for my $us (@{$user->{"unknown_stanzas"}}) {
225 my $k = shift @us; my $v = shift @us;
227 print $uf "$k: $v\n";
232 for my $t (keys %{$ut}) {
233 next if @{$ut->{$t}} == 0;
234 print $uf "Tag: $t\n";
235 print $uf fmt("Bugs: " . join(", ", @{$ut->{$t}}), 77) . "\n";
239 my $uc = $user->{"categories"};
240 my %vis = map { $_, 1 } @{$user->{"visible_cats"}};
241 for my $c (keys %{$uc}) {
242 next if @{$uc->{$c}} == 0;
244 print $uf "Category: $c\n";
245 print $uf "Hidden: yes\n" unless defined $vis{$c};
247 for my $cat (@{$uc->{$c}}) {
249 if (ref($cat) eq "HASH") {
250 printf $uf "Cat%d: %s\n", $i, $cat->{"nam"};
251 printf $uf "Cat%dOptions:\n", $i;
252 for my $j (0..$#{$cat->{"pri"}}) {
253 if (defined $cat->{"ttl"}->[$j]) {
254 printf $uf " %s - %s\n",
255 $cat->{"pri"}->[$j], $cat->{"ttl"}->[$j];
257 printf $uf " %s\n", $cat->{"pri"}->[$j];
260 printf $uf "Cat%dDefault: %s\n", $i, $cat->{"def"}
261 if defined $cat->{"def"};
262 printf $uf "Cat%dOrder: %s\n", $i, join(", ", @{$cat->{"ord"}})
263 if defined $cat->{"ord"};
265 printf $uf "Cat%d: %s\n", $i, $cat;
272 delete $user->{"locked"};