@@ -21,6 +21,7 @@ pub async fn pulls(
21
21
ctx : Arc < Context > ,
22
22
owner : & str ,
23
23
repo : & str ,
24
+ filter : Option < String > ,
24
25
) -> Result < Response < Body > , hyper:: Error > {
25
26
let octocrab = & ctx. octocrab ;
26
27
let res = octocrab
@@ -51,6 +52,24 @@ pub async fn pulls(
51
52
next_page = page. next ;
52
53
}
53
54
55
+ let mut label_filter = Vec :: new ( ) ;
56
+ let mut author_filter = Vec :: new ( ) ;
57
+ let mut assignee_filter = Vec :: new ( ) ;
58
+ if let Some ( filter) = filter. clone ( ) {
59
+ let kvs: Vec < & str > = filter. split_whitespace ( ) . collect ( ) ;
60
+ for kv in kvs {
61
+ match kv. split_once ( ':' ) {
62
+ Some ( ( k, v) ) if !v. is_empty ( ) => match k {
63
+ "label" => label_filter. push ( v. to_string ( ) ) ,
64
+ "author" => author_filter. push ( v. to_string ( ) ) ,
65
+ "assignee" => assignee_filter. push ( v. to_string ( ) ) ,
66
+ _ => { }
67
+ } ,
68
+ _ => { }
69
+ }
70
+ }
71
+ }
72
+
54
73
let mut pulls: Vec < Value > = Vec :: new ( ) ;
55
74
for base_pull in base_pulls. into_iter ( ) {
56
75
let assignee = base_pull. assignee . map_or ( "" . to_string ( ) , |v| v. login ) ;
@@ -71,20 +90,39 @@ pub async fn pulls(
71
90
( Utc :: now ( ) - base_pull. created_at ) . num_days ( )
72
91
} ;
73
92
74
- let labels = base_pull. labels . map_or ( "" . to_string ( ) , |labels| {
93
+ let labels = base_pull. labels . map_or ( Vec :: new ( ) , |labels| {
75
94
labels
76
95
. iter ( )
77
96
. map ( |label| label. name . clone ( ) )
78
97
. collect :: < Vec < _ > > ( )
79
- . join ( ", " )
80
98
} ) ;
99
+ if !label_filter. is_empty ( ) {
100
+ let mut flg = false ;
101
+ for filter in label_filter. iter ( ) {
102
+ if !labels. iter ( ) . any ( |label| * label == * filter) {
103
+ flg = true ;
104
+ }
105
+ }
106
+ if flg {
107
+ continue ;
108
+ }
109
+ }
110
+
111
+ let labels = labels. join ( ", " ) ;
81
112
let wait_for_author = labels. contains ( "S-waiting-on-author" ) ;
82
113
let wait_for_review = labels. contains ( "S-waiting-on-review" ) ;
83
114
let html_url = base_pull. html_url ;
84
115
let number = base_pull. number ;
85
116
let title = base_pull. title ;
86
117
let author = base_pull. user . login ;
87
118
119
+ if !author_filter. is_empty ( ) && !author_filter. iter ( ) . all ( |s| * s == author) {
120
+ continue ;
121
+ }
122
+ if !assignee_filter. is_empty ( ) && !assignee_filter. iter ( ) . all ( |s| * s == assignee) {
123
+ continue ;
124
+ }
125
+
88
126
let pull = PullRequest {
89
127
html_url,
90
128
number,
@@ -105,6 +143,11 @@ pub async fn pulls(
105
143
context. insert ( "pulls" , & pulls) ;
106
144
context. insert ( "owner" , & owner) ;
107
145
context. insert ( "repo" , & repo) ;
146
+ if let Some ( filter) = filter {
147
+ context. insert ( "filter" , & filter) ;
148
+ } else {
149
+ context. insert ( "filter" , "" ) ;
150
+ }
108
151
109
152
let tera = tera:: Tera :: new ( "templates/triage/**/*" ) . unwrap ( ) ;
110
153
let body = Body :: from ( tera. render ( "pulls.html" , & context) . unwrap ( ) ) ;
0 commit comments