21 {
22 std::vector<std::string> result;
23 re2::StringPiece mutable_input(
input);
24
25
26 if (!re2::RE2::FindAndConsume(&mutable_input, R"((?:^|\n)deps\s*=\s*\{)")) {
27 return result;
28 }
29
30
31 size_t brace_close_pos = std::string_view::npos;
32 int brace_count = 1;
33 for (
size_t i = 0;
i < mutable_input.length(); ++
i) {
34 if (mutable_input[
i] ==
'{') {
35 brace_count++;
36 }
else if (mutable_input[
i] ==
'}') {
37 brace_count--;
38 if (brace_count == 0) {
40 break;
41 }
42 }
43 }
44
45 if (brace_close_pos == std::string_view::npos) {
46 return result;
47 }
48
49
50 std::string_view deps_content = mutable_input.substr(0, brace_close_pos);
51
52
53 std::string cleaned_content;
54 size_t current_pos_clean = 0;
55 while (current_pos_clean < deps_content.length()) {
56 size_t next_newline = deps_content.find('\n', current_pos_clean);
57 if (next_newline == std::string_view::npos) {
58 next_newline = deps_content.length();
59 }
60
61 std::string_view line = deps_content.substr(
62 current_pos_clean, next_newline - current_pos_clean);
63
64 size_t first_char = line.find_first_not_of(" \t");
65 if (first_char != std::string_view::npos) {
66 line = line.substr(first_char);
67 } else {
68 line = "";
69 }
70
71 if (line.empty() || line[0] != '#') {
72 cleaned_content.append(line);
73 cleaned_content.append("\n");
74 }
75
76 current_pos_clean = next_newline + 1;
77 }
78
79
80 size_t current_pos = 0;
81 while (current_pos < cleaned_content.length()) {
82
83 size_t key_start = cleaned_content.find('\'', current_pos);
84 if (key_start == std::string_view::npos) {
85 break;
86 }
87 key_start++;
88
89
90 size_t key_end = cleaned_content.find('\'', key_start);
91 if (key_end == std::string_view::npos) {
92 break;
93 }
94
95 std::string_view
key =
96 std::string_view(&cleaned_content[key_start], key_end - key_start);
97
98
99 size_t colon_pos = cleaned_content.find(':', key_end);
100 if (colon_pos == std::string_view::npos) {
101 break;
102 }
103
104
105 size_t value_start =
106 cleaned_content.find_first_not_of(" \t\n", colon_pos + 1);
107 if (value_start == std::string_view::npos) {
108 break;
109 }
110
111
112 size_t value_end = std::string_view::npos;
113 int brace_level = 0;
114 int bracket_level = 0;
115 for (
size_t i = value_start;
i < cleaned_content.length(); ++
i) {
116 char c = cleaned_content[
i];
117 if (c == '{') {
118 brace_level++;
119 } else if (c == '}') {
120 brace_level--;
121 } else if (c == '[') {
122 bracket_level++;
123 } else if (c == ']') {
124 bracket_level--;
125 } else if (c == ',' && brace_level == 0 && bracket_level == 0) {
127 break;
128 }
129 }
130
131 if (value_end == std::string_view::npos) {
132 value_end = cleaned_content.length();
133 }
134
135 std::string_view
value = std::string_view(&cleaned_content[value_start],
136 value_end - value_start);
137
138
139 if (
value.find(
"'dep_type': 'cipd'") != std::string_view::npos) {
140 result.emplace_back(
key);
141 }
142
143 current_pos = value_end + 1;
144 }
145
146 return result;
147}