forked from microsoft/azure-pipelines-tasks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakeOptionsReader.cs
115 lines (95 loc) · 3.84 KB
/
MakeOptionsReader.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace BuildConfigGen
{
internal static class MakeOptionsReader
{
internal static Dictionary<string, AgentTask> ReadMakeOptions(string gitRootPath)
{
Dictionary<string, AgentTask> agentTasks = new Dictionary<string, AgentTask>();
var r = new Utf8JsonReader(File.ReadAllBytes(Path.Combine(gitRootPath, @"make-options.json")));
bool inConfig = false;
bool underTasksNode = false;
string configName = "";
while (r.Read())
{
switch (r.TokenType)
{
case JsonTokenType.PropertyName:
{
string? text = r.GetString();
//Console.WriteLine(r.TokenType + " " + text);
if (text == "taskResources")
{
// skip
inConfig = false;
underTasksNode = false;
}
else if (text == "tasks")
{
inConfig = false;
underTasksNode = true;
}
else
{
inConfig = true;
configName = text!;
underTasksNode = false;
}
break;
}
case JsonTokenType.String:
{
if(underTasksNode && inConfig)
{
throw new Exception("don't expect underTasksNode && inConfig");
}
// only add tasks under task node! (if there is a task that only exists under a config, ignore it!)
if (underTasksNode)
{
string? text = r.GetString();
if(agentTasks.ContainsKey(text!))
{
throw new Exception($"duplicate task in make-options {text}");
}
AgentTask task = new AgentTask(text!);
agentTasks.Add(text!, task);
}
if (inConfig)
{
string? text = r.GetString();
AgentTask? task;
if (agentTasks.TryGetValue(text!, out task))
{
if (configName == "")
{
throw new Exception("expected configName to have value");
}
task.Configs.Add(configName);
}
}
break;
}
default:
//Console.WriteLine(r.TokenType);
break;
}
}
// startarray, endarray
return agentTasks;
}
internal class AgentTask
{
public AgentTask(string name)
{
Name = name;
}
public readonly string Name;
public readonly HashSet<string> Configs = new HashSet<string>();
}
}
}