17
17
var skip = new Option < string [ ] > (
18
18
new [ ] { "--skip" , "-s" } ,
19
19
Array . Empty < string > ,
20
- "A list of job names to skip."
20
+ "A list of job names to skip. Takes precendence over --only. "
21
21
)
22
22
{
23
23
Arity = ArgumentArity . ZeroOrMore
24
24
} ;
25
+ var only = new Option < string [ ] > (
26
+ new [ ] { "--only" , "-o" } ,
27
+ Array . Empty < string > ,
28
+ "A list of job names to run."
29
+ ) {
30
+ Arity = ArgumentArity . ZeroOrMore
31
+ } ;
25
32
var configs = new Argument < string [ ] > ( "configs" , "Path(s) to JSON SilkTouch configuration(s)" )
26
33
{
27
34
Arity = ArgumentArity . OneOrMore
39
46
( ) => Environment . ProcessorCount ,
40
47
"Maximum number of parallel ClangSharp executions."
41
48
) ;
42
- var rootCommand = new RootCommand { logging , skip , configs , configOverrides , jobs } ;
43
- rootCommand . SetHandler ( async ctx =>
44
- {
49
+ var rootCommand = new RootCommand { logging , skip , only , configs , configOverrides , jobs } ;
50
+ rootCommand . SetHandler ( async ctx => {
45
51
// Create the ConfigurationBuilder with support for env var & command line overrides
46
52
var cb = new ConfigurationBuilder ( )
47
53
. AddEnvironmentVariables ( source => source . Prefix = "SILKDOTNET_" )
63
69
MSBuildLocator . RegisterDefaults ( ) ;
64
70
65
71
var sp = new ServiceCollection ( )
66
- . AddLogging ( builder =>
67
- {
68
- builder . AddSimpleConsole ( opts =>
69
- {
72
+ . AddLogging ( builder => {
73
+ builder . AddSimpleConsole ( opts => {
70
74
opts . SingleLine = true ;
71
75
opts . ColorBehavior = Console . IsOutputRedirected
72
76
? LoggerColorBehavior . Disabled
80
84
. BuildServiceProvider ( ) ;
81
85
82
86
var logger = sp . GetRequiredService < ILogger < Program > > ( ) ;
83
- var skipped = ctx . ParseResult . GetValueForOption ( skip ) ;
87
+ var skipped = SeparateCSV ( ctx . ParseResult . GetValueForOption ( skip ) ) ;
88
+ var jobsToRun = SeparateCSV ( ctx . ParseResult . GetValueForOption ( only ) ) ;
89
+
84
90
var generator = sp . GetRequiredService < SilkTouchGenerator > ( ) ;
91
+
85
92
await Parallel . ForEachAsync (
86
93
config
87
94
. GetSection ( "Jobs" )
88
95
. GetChildren ( )
89
96
. Where ( x =>
90
- skipped ? . All ( y => ! x . Key . Equals ( y , StringComparison . OrdinalIgnoreCase ) ) ?? true
97
+ ( skipped ? . All ( y => ! x . Key . Equals ( y , StringComparison . OrdinalIgnoreCase ) ) ?? true ) &&
98
+ ( jobsToRun is null || jobsToRun . Count == 0 || jobsToRun . Any ( y => x . Key . Equals ( y , StringComparison . OrdinalIgnoreCase ) ) )
91
99
) ,
92
- async ( job , ct ) =>
93
- {
100
+ async ( job , ct ) => {
94
101
await generator . RunAsync (
95
102
job . Key ,
96
103
job ,
@@ -105,3 +112,23 @@ await generator.RunAsync(
105
112
} ) ;
106
113
107
114
await rootCommand . InvokeAsync ( args ) ;
115
+
116
+ static List < string > SeparateCSV ( Span < string > strs )
117
+ {
118
+ if ( strs . Length == 0 )
119
+ return [ ] ;
120
+
121
+ List < string > result = [ ] ;
122
+ foreach ( string str in strs )
123
+ {
124
+ if ( str . Contains ( ',' ) )
125
+ {
126
+ result . AddRange ( str . Split ( ',' ) ) ;
127
+ }
128
+ else
129
+ {
130
+ result . Add ( str ) ;
131
+ }
132
+ }
133
+ return result ;
134
+ }
0 commit comments