Skip to content

Commit 071dc9c

Browse files
authored
Merge pull request #92 from dart-lang/shorter-label-lists
Shorter label lists, triage shortcuts for language
2 parents afae8c5 + d1391b5 commit 071dc9c

File tree

4 files changed

+130
-78
lines changed

4 files changed

+130
-78
lines changed

lib/redirect.dart

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,33 @@ final _matchers = <RegExp, Uri Function(Match)>{
4040
_resolveLastChoose(_assignedIssues, _languageAssignedIssues),
4141
RegExp(r'^/(l(?:anguage)?/)?opened/([A-Za-z0-9\-]+)$'):
4242
_resolveLastChoose(_openedIssues, _languageOpenedIssues),
43+
RegExp(r'^/triage/l(?:anguage)?/?$'): (_) =>
44+
Uri.parse('$_dartBug/triage/language/issues'),
45+
RegExp(r'^/triage/l(?:anguage)?/issues?$'): (_) =>
46+
Uri.parse('$gitHub/issues').replace(
47+
queryParameters: {
48+
'q': [
49+
'is:issue',
50+
'is:open',
51+
'-label:bug,request,feature,question',
52+
'created:>$_dateOneMonth',
53+
'repo:$organization/$_languageRepository',
54+
].join(' '),
55+
},
56+
),
57+
RegExp(r'^/triage/l(?:anguage)?/prs?$'): (_) =>
58+
Uri.parse('$gitHub/issues').replace(
59+
queryParameters: {
60+
'q': [
61+
'is:pr',
62+
'is:open',
63+
'review:none',
64+
'draft:false',
65+
'created:>$_dateOneMonth',
66+
'repo:$organization/$_languageRepository',
67+
].join(' '),
68+
},
69+
),
4370

4471
// SDK repo only.
4572
RegExp(r'^/area/([A-Za-z0-9\-]+)$'): (match) => _listIssues.replace(
@@ -57,26 +84,21 @@ final _matchers = <RegExp, Uri Function(Match)>{
5784
'q': [
5885
'is:issue',
5986
'is:open',
60-
..._areaLabels.map((label) {
61-
final filter = label.contains(' ') ? '"$label"' : label;
62-
return '-label:$filter';
63-
}),
87+
'-label:${_areaLabels.map(_quoteSpaces).join(',')}',
6488
].join(' '),
6589
},
6690
),
6791

6892
// core packages triage
93+
RegExp(r'^/c(?:ore)?/?$'): (_) => Uri.parse('$gitHub/$organization/core'),
6994
RegExp(r'^/triage/core$'): (_) => Uri.parse('$_dartBug/triage/core/issues'),
7095
// Issues opened in the last 30 days not marked as bugs or enhancements.
7196
RegExp(r'^/triage/core/issues$'): (_) => Uri.parse('$gitHub/issues').replace(
7297
queryParameters: {
7398
'q': [
7499
'is:issue',
75100
'is:open',
76-
'-label:bug',
77-
'-label:enhancement',
78-
'-label:type-enhancement',
79-
'-label:documentation',
101+
'-label:bug,enhancement,type-enhancement,documentation',
80102
'created:>$_dateOneMonth',
81103
..._corePackages.map((repo) => 'repo:$repo'),
82104
].join(' '),
@@ -97,6 +119,7 @@ final _matchers = <RegExp, Uri Function(Match)>{
97119
},
98120
),
99121

122+
RegExp(r'^/t(?:ools)?/?$'): (_) => Uri.parse('$gitHub$organization/tools'),
100123
// tools packages triage
101124
RegExp(r'^/triage/tools$'): (_) => Uri.parse('$_dartBug/triage/tools/issues'),
102125
// Issues opened in the last 30 days not marked as bugs or enhancements.
@@ -105,10 +128,7 @@ final _matchers = <RegExp, Uri Function(Match)>{
105128
'q': [
106129
'is:issue',
107130
'is:open',
108-
'-label:bug',
109-
'-label:enhancement',
110-
'-label:type-enhancement',
111-
'-label:documentation',
131+
'-label:bug,enhancement,type-enhancement,documentation',
112132
'created:>$_dateOneMonth',
113133
..._toolsPackages.map((repo) => 'repo:$repo'),
114134
].join(' '),
@@ -138,11 +158,12 @@ final _matchers = <RegExp, Uri Function(Match)>{
138158
Uri Function(Match) _resolveLastChoose(Uri base1, Uri base2) => (Match match) =>
139159
((match[1] == null) ? base1 : base2).resolve(match[match.groupCount]!);
140160

141-
final List<String> _areaLabels = List<String>.from(
142-
jsonDecode(
161+
final List<String> _areaLabels = [
162+
for (var (label as String) in jsonDecode(
143163
File('static/sdk_labels.json').readAsStringSync(),
144-
) as List,
145-
)..removeWhere((label) => !label.startsWith('area-'));
164+
) as List)
165+
if (label.startsWith('area-') || label.startsWith('legacy-area-')) label
166+
];
146167

147168
final List<String> _corePackages =
148169
_parsePackageInfo(File('static/core_packages.csv'));
@@ -172,15 +193,13 @@ Uri? findRedirect(Uri requestUri) {
172193
/// that we're interested in triaging.
173194
List<String> _parsePackageInfo(File file) => file
174195
.readAsLinesSync()
175-
.where((line) => line.isNotEmpty)
176-
.where((line) => !line.startsWith('#'))
196+
.where((line) => line.isNotEmpty && !line.startsWith('#'))
177197
.map((String line) {
178198
// "args,dart-lang/args,dart.dev"
179199
final info = line.split(',');
180-
return (name: info[0], repo: info[1]);
200+
return info[1];
181201
})
182-
.where((package) => package.repo != 'dart-lang/sdk')
183-
.map((package) => package.repo)
202+
.where((repo) => repo != 'dart-lang/sdk')
184203
.toSet()
185204
.toList()
186205
..sort();
@@ -192,3 +211,5 @@ String get _dateOneMonth {
192211
'${date.month.toString().padLeft(2, '0')}-'
193212
'${date.day.toString().padLeft(2, '0')}';
194213
}
214+
215+
String _quoteSpaces(String label) => label.contains(' ') ? '"$label"' : label;

static/core_packages.csv

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,33 @@
11
# The core / tier 1 package triage
22

3-
args,dart-lang/args,dart.dev
4-
async,dart-lang/async,dart.dev
5-
characters,dart-lang/characters,dart.dev
6-
collection,dart-lang/collection,dart.dev
7-
convert,dart-lang/convert,dart.dev
8-
crypto,dart-lang/crypto,dart.dev
9-
fake_async,dart-lang/fake_async,dart.dev
10-
fixnum,dart-lang/fixnum,dart.dev
3+
## All of these are now in the `core` mono-repo.
4+
args,dart-lang/core,dart.dev
5+
async,dart-lang/core,dart.dev
6+
characters,dart-lang/core,dart.dev
7+
collection,dart-lang/core,dart.dev
8+
convert,dart-lang/core,dart.dev
9+
crypto,dart-lang/core,dart.dev
10+
fixnum,dart-lang/core,dart.dev
11+
lints,dart-lang/core,dart.dev
12+
logging,dart-lang/core,dart.dev
13+
os_detect,dart-lang/core,dart.dev
14+
path,dart-lang/core,dart.dev
15+
platform,dart-lang/core,dart.dev
16+
typed_data,dart-lang/core,dart.dev
17+
18+
## These are now inside the `test` monorepo.
19+
fake_async,dart-lang/test,dart.dev
20+
matcher,dart-lang/test,dart.dev
21+
test,dart-lang/test,dart.dev
22+
1123
grpc,grpc/grpc-dart,dart.dev
1224
http_parser,dart-lang/http_parser,dart.dev
1325
http,dart-lang/http,dart.dev
1426
http2,dart-lang/http2,dart.dev
1527
intl_translation,dart-lang/intl_translation,dart.dev
1628
intl,dart-lang/intl,dart.dev
1729
js,dart-lang/sdk,dart.dev
18-
logging,dart-lang/logging,dart.dev
19-
matcher,dart-lang/matcher,dart.dev
2030
meta,dart-lang/sdk,dart.dev
21-
os_detect,dart-lang/os_detect,dart.dev
22-
path,dart-lang/path,dart.dev
23-
test,dart-lang/test,dart.dev
24-
typed_data,dart-lang/typed_data,dart.dev
2531

2632
# Added to the core triage
2733
protobuf,google/protobuf.dart,google.dev
@@ -31,6 +37,7 @@ protoc_plugin,google/protobuf.dart,google.dev
3137
# build,dart-lang/build,dart.dev
3238

3339
# package:ffi is triaged by dcharkes@
40+
# Now in dart-lang/native monorepo.
3441
# ffi,dart-lang/ffi,dart.dev
3542

3643
# package:mockito is triaged by srawlins@

static/tools_packages.csv

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,64 @@
11
# The tools / tier 2 package triage
22

3+
## These are now all in the `tools` monorepo with the trailing label.
4+
benchmark_harness,dart-lang/tools,tools.dart.dev
5+
boolean_selector,dart-lang/tools,tools.dart.dev
6+
browser_launcher,dart-lang/tools,tools.dart.dev
7+
cli_util,dart-lang/tools,tools.dart.dev
8+
clock,dart-lang/tools,tools.dart.dev
9+
code_builder,dart-lang/tools,tools.dart.dev
10+
coverage,dart-lang/tools,tools.dart.dev
11+
csslib,dart-lang/tools,tools.dart.dev
12+
glob,dart-lang/tools,tools.dart.dev
13+
graphs,dart-lang/tools,tools.dart.dev
14+
html,dart-lang/tools,tools.dart.dev
15+
io,dart-lang/tools,tools.dart.dev
16+
json_rpc_2,dart-lang/tools,tools.dart.dev
17+
markdown,dart-lang/tools,tools.dart.dev
18+
mime,dart-lang/tools,tools.dart.dev
19+
oauth2,dart-lang/tools,tools.dart.dev
20+
package_config,dart-lang/tools,tools.dart.dev
21+
pool,dart-lang/tools,tools.dart.dev
22+
pub_semver,dart-lang/tools,tools.dart.dev
23+
pubspec_parse,dart-lang/tools,tools.dart.dev
24+
source_maps,dart-lang/tools,tools.dart.dev
25+
source_map_stack_trace,dart-lang/tools,tools.dart.dev
26+
source_span,dart-lang/tools,tools.dart.dev
27+
sse,dart-lang/tools,tools.dart.dev
28+
stack_trace,dart-lang/tools,tools.dart.dev
29+
stream_channel,dart-lang/tools,tools.dart.dev
30+
stream_transform,dart-lang/tools,tools.dart.dev
31+
string_scanner,dart-lang/tools,tools.dart.dev
32+
term_glyph,dart-lang/tools,tools.dart.dev
33+
timing,dart-lang/tools,tools.dart.dev
34+
watcher,dart-lang/tools,tools.dart.dev
35+
yaml_edit,dart-lang/tools,tools.dart.dev
36+
yaml,dart-lang/tools,tools.dart.dev
37+
338
_fe_analyzer_shared,dart-lang/sdk,tools.dart.dev
439
analysis_server_client,dart-lang/sdk,tools.dart.dev
540
analyzer_plugin,dart-lang/sdk,tools.dart.dev
641
analyzer,dart-lang/sdk,tools.dart.dev
7-
benchmark_harness,dart-lang/benchmark_harness,tools.dart.dev
8-
boolean_selector,dart-lang/boolean_selector,tools.dart.dev
9-
browser_launcher,dart-lang/browser_launcher,tools.dart.dev
10-
cli_util,dart-lang/cli_util,tools.dart.dev
11-
clock,dart-lang/clock,tools.dart.dev
12-
code_builder,dart-lang/code_builder,tools.dart.dev
13-
coverage,dart-lang/coverage,tools.dart.dev
14-
csslib,dart-lang/csslib,tools.dart.dev
1542
dds,dart-lang/sdk,tools.dart.dev
1643
frontend_server_client,dart-lang/webdev,tools.dart.dev
17-
glob,dart-lang/glob,tools.dart.dev
18-
graphs,dart-lang/graphs,tools.dart.dev
19-
html,dart-lang/html,tools.dart.dev
2044
http_multi_server,dart-lang/http_multi_server,tools.dart.dev
2145
http_retry,dart-lang/http_retry,tools.dart.dev
22-
io,dart-lang/io,tools.dart.dev
23-
json_rpc_2,dart-lang/json_rpc_2,tools.dart.dev
24-
lints,dart-lang/lints,tools.dart.dev
25-
markdown,dart-lang/markdown,tools.dart.dev
26-
mime,dart-lang/mime,tools.dart.dev
2746
native_stack_traces,dart-lang/sdk,tools.dart.dev
28-
oauth2,dart-lang/oauth2,tools.dart.dev
29-
package_config,dart-lang/package_config,tools.dart.dev
30-
pool,dart-lang/pool,tools.dart.dev
31-
pub_semver,dart-lang/pub_semver,tools.dart.dev
32-
pubspec_parse,dart-lang/pubspec_parse,tools.dart.dev
3347
shelf_packages_handler,dart-lang/shelf_packages_handler,tools.dart.dev
3448
shelf_proxy,dart-lang/shelf_proxy,tools.dart.dev
3549
shelf_static,dart-lang/shelf_static,tools.dart.dev
3650
shelf_test_handler,dart-lang/shelf_test_handler,tools.dart.dev
3751
shelf_web_socket,dart-lang/shelf_web_socket,tools.dart.dev
3852
shelf,dart-lang/shelf,tools.dart.dev
3953
source_gen,dart-lang/source_gen,tools.dart.dev
40-
source_map_stack_trace,dart-lang/source_map_stack_trace,tools.dart.dev
41-
source_maps,dart-lang/source_maps,tools.dart.dev
42-
source_span,dart-lang/source_span,tools.dart.dev
43-
sse,dart-lang/sse,tools.dart.dev
44-
stack_trace,dart-lang/stack_trace,tools.dart.dev
45-
stream_channel,dart-lang/stream_channel,tools.dart.dev
46-
stream_transform,dart-lang/stream_transform,tools.dart.dev
47-
string_scanner,dart-lang/string_scanner,tools.dart.dev
48-
term_glyph,dart-lang/term_glyph,tools.dart.dev
4954
test_api,dart-lang/test,tools.dart.dev
5055
test_core,dart-lang/test,tools.dart.dev
5156
test_descriptor,dart-lang/test_descriptor,tools.dart.dev
5257
test_process,dart-lang/test_process,tools.dart.dev
53-
timing,dart-lang/timing,tools.dart.dev
5458
usage,dart-lang/usage,tools.dart.dev
5559
vm_service,dart-lang/sdk,tools.dart.dev
5660
vm_snapshot_analysis,dart-lang/sdk,tools.dart.dev
57-
watcher,dart-lang/watcher,tools.dart.dev
5861
web_socket_channel,dart-lang/web_socket_channel,tools.dart.dev
59-
yaml_edit,dart-lang/yaml_edit,tools.dart.dev
60-
yaml,dart-lang/yaml,tools.dart.dev
6162

6263
# The build packages are triaged by jakemac53@
6364
# bazel_worker,dart-lang/bazel_worker,tools.dart.dev

test/redirect_test.dart

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,17 +84,20 @@ void main() {
8484
});
8585

8686
test('triage/sdk spaces escaped', () {
87-
final actual =
88-
findRedirect(Uri.parse('https://dartbug.com/triage/sdk')).toString();
87+
final actual = findRedirect(Uri.parse('https://dartbug.com/triage/sdk'))!;
88+
89+
final parameters = actual.queryParameters['q']!;
90+
final parts = splitParameters(parameters);
91+
final labels = parts.firstWhere((s) => s.startsWith('-label:'));
8992

9093
expect(
91-
actual,
92-
contains(Uri.encodeQueryComponent('-label:area-analyzer')),
94+
labels,
95+
contains('area-analyzer'),
9396
);
97+
9498
expect(
95-
actual,
96-
contains(
97-
Uri.encodeQueryComponent('-label:"area-migration (deprecated)"')),
99+
labels,
100+
contains('"area-migration (deprecated)"'),
98101
);
99102
});
100103
});
@@ -112,8 +115,8 @@ void main() {
112115
findRedirect(Uri.parse('https://dartbug.com/triage/core/issues'))
113116
.toString(),
114117
startsWith(
115-
'https://github.com/issues?q=is%3Aissue+is%3Aopen+-label%3Abug'
116-
'+-label%3Aenhancement+',
118+
'https://github.com/issues?q=is%3Aissue+is%3Aopen+-label%3Abug%2C'
119+
'enhancement',
117120
),
118121
);
119122
});
@@ -188,3 +191,23 @@ void main() {
188191
}
189192
});
190193
}
194+
195+
// Splits on spaces, if not inside quotes.
196+
List<String> splitParameters(String parameters) {
197+
const space = 0x20;
198+
const quote = 0x22;
199+
final result = <String>[];
200+
var start = 0;
201+
var insideQuote = false;
202+
for (var i = 0; i < parameters.length; i++) {
203+
final char = parameters.codeUnitAt(i);
204+
if (char == quote) {
205+
insideQuote = !insideQuote;
206+
} else if (char == space && !insideQuote) {
207+
if (i > start) result.add(parameters.substring(start, i));
208+
start = i + 1;
209+
}
210+
}
211+
if (start < parameters.length) result.add(parameters.substring(start));
212+
return result;
213+
}

0 commit comments

Comments
 (0)