]> git.donarmstrong.com Git - debbugs.git/commitdiff
support usertags in Debbugs::Bug and Debbugs::Bug::Tag
authorDon Armstrong <don@donarmstrong.com>
Thu, 14 Jun 2018 00:30:08 +0000 (17:30 -0700)
committerDon Armstrong <don@donarmstrong.com>
Thu, 14 Jun 2018 00:30:08 +0000 (17:30 -0700)
Debbugs/Bug.pm
Debbugs/Bug/Tag.pm
Debbugs/User.pm

index 641881a8fcb849b7568b959a2c6a245ffb1d151d..4af9b735f071041adf7b73827d8fc41ea6a73dc6 100644 (file)
@@ -446,13 +446,18 @@ sub _build_archived {
     return $_[0]->location eq 'archived'?1:0;
 }
 
-has tags => (is => 'ro', isa => 'Object',
+has tags => (is => 'ro',
+             isa => 'Debbugs::Bug::Tag',
             clearer => '_clear_tags',
             builder => '_build_tags',
             lazy => 1,
            );
 sub _build_tags {
-    return Debbugs::Bug::Tag->new($_[0]->status->{keywords});
+    my $self = shift;
+    return Debbugs::Bug::Tag->new(keywords => $self->status->{keywords},
+                                  bug => $self,
+                                  users => $self->bug_collection->users,
+                                 );
 }
 
 =item buggy
index 7b3df32074f8ecf1833094302c86c2265d3e3602..a124af9f9710ef0313c050166d845a98fbadaa11 100644 (file)
@@ -41,36 +41,74 @@ around BUILDARGS => sub {
     my $orig = shift;
     my $class = shift;
     if (@_ == 1 && !ref $_[0]) {
-       my @tags = split / /,$_[0];
-       my %tags;
-       @tags{@tags} = (1) x @tags;
-       return $class->$orig(tags => \%tags);
+       return $class->$orig(keywords => $_[0]);
     } else {
        return $class->$orig(@_);
     }
 };
 
+sub BUILD {
+    my $self = shift;
+    my $args = shift;
+    if (exists $args->{keywords}) {
+        my @tags = split /[, ]/,$args->{keywords};
+        return unless @tags;
+        $self->_set_tag(map {($_,1)} @tags);
+        delete $args->{keywords};
+    }
+}
+
 has tags => (is => 'ro',
             isa => 'HashRef[Str]',
             traits => ['Hash'],
             lazy => 1,
             reader => '_tags',
             builder => '_build_tags',
-            handles => {has_tags => 'count'}
+            handles => {has_tags => 'count',
+                         _set_tag => 'set',
+                         unset_tag => 'delete',
+                        },
            );
 has usertags => (is => 'ro',
                 isa => 'HashRef[Str]',
                 lazy => 1,
+                 traits => ['Hash'],
+                 handles => {unset_usertag => 'delete',
+                             has_usertags => 'count',
+                            },
                 reader => '_usertags',
                 builder => '_build_usertags',
                );
 
+sub has_any_tags {
+    my $self = shift;
+    return ($self->has_tags || $self->has_usertags);
+}
+
+has bug => (is => 'ro',
+            isa => 'Debbugs::Bug',
+            required => 1,
+           );
+
+has users => (is => 'ro',
+              isa => 'ArrayRef[Debbugs::User]',
+              default => sub {[]},
+             );
+
 sub _build_tags {
     return {};
 }
 
 sub _build_usertags {
-    return {};
+    my $self = shift;
+    local $_;
+    my $t = {};
+    for my $user (@{$self->users}) {
+        for my $tag ($user->tags_on_bug($self->bug->id)) {
+            $t->{$tag} = $user->email;
+        }
+    }
+    return $t;
 }
 
 sub is_set {
@@ -86,16 +124,6 @@ sub usertag_is_set {
     return exists $_[0]->_usertags->{$_[1]} ? 1 : 0;
 }
 
-sub unset_tag {
-    my $self = shift;
-    delete $self->_tags->{$_} foreach @_;
-}
-
-sub unset_usertag {
-    my $self = shift;
-    delete $self->_usertags->{$_} foreach @_;
-}
-
 sub set_tag {
     my $self = shift;
     for my $tag (@_) {
@@ -123,6 +151,20 @@ sub join_all {
     return join($joiner,$self->all_tags);
 }
 
+sub join_usertags {
+    my $self = shift;
+    my $joiner = shift;
+    $joiner //= ', ';
+    return join($joiner,$self->usertags);
+}
+
+sub join_tags {
+    my $self = shift;
+    my $joiner = shift;
+    $joiner //= ', ';
+    return join($joiner,$self->tags);
+}
+
 sub all_tags {
     return uniq sort $_[0]->tags,$_[0]->usertags;
 }
index 2457e54c4e5d51633794b909c2f18f0e2f9da004..3c4cf6a02da445d3a33d4c764e0847409b981cac 100644 (file)
@@ -154,6 +154,7 @@ sub new {
                "visible_cats" => [],
                "unknown_stanzas" => [],
                values => {},
+               bug_tags => {},
                email => $email,
               };
     bless $self, $class;
@@ -176,7 +177,12 @@ sub new {
             my %tag = @stanza;
             my $t = $tag{"Tag"};
             $ut->{$t} = [] unless defined $ut->{$t};
-            push @{$ut->{$t}}, split /\s*,\s*/, $tag{Bugs};
+           my @bugs = split /\s*,\s*/, $tag{Bugs};
+            push @{$ut->{$t}}, @bugs;
+           for my $bug (@bugs) {
+               push @{$self->{bug_tags}{$bug}},
+                   $t;
+           }
         } elsif ($stanza[0] eq "Category") {
             my @cat = ();
             my %stanza = @stanza;
@@ -235,6 +241,22 @@ sub new {
     return $self;
 }
 
+sub email {
+    my $self = shift;
+    return $self->{email};
+}
+
+sub tags {
+    my $self = shift;
+
+    return $self->{"tags"};
+}
+
+sub tags_on_bug {
+    my $self = shift;
+    return map {@{$self->{"bug_tags"}{$_}//[]}} @_;
+}
+
 sub write {
     my $self = shift;