Skip to content

Commit ddef5b4

Browse files
committed
Add support for the Source parameter in the Pipeline search query
1 parent 427c4ef commit ddef5b4

File tree

8 files changed

+172
-60
lines changed

8 files changed

+172
-60
lines changed

NGitLab.Mock/Clients/PipelineClient.cs

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Linq;
55
using System.Threading;
66
using System.Threading.Tasks;
7+
using NGitLab.Impl;
78
using NGitLab.Mock.Internals;
89
using NGitLab.Models;
910

@@ -186,7 +187,7 @@ public IEnumerable<PipelineBasic> Search(PipelineQuery query)
186187

187188
if (query.Name != null)
188189
{
189-
pipelines = pipelines.Where(pipeline => string.Equals(pipeline.User.Name, query.Name, StringComparison.Ordinal));
190+
pipelines = pipelines.Where(pipeline => string.Equals(pipeline.Name, query.Name, StringComparison.Ordinal));
190191
}
191192

192193
if (query.Ref != null)
@@ -196,30 +197,15 @@ public IEnumerable<PipelineBasic> Search(PipelineQuery query)
196197

197198
if (query.Scope.HasValue)
198199
{
199-
if (query.Scope.Value == PipelineScope.tags)
200+
pipelines = query.Scope.Value switch
200201
{
201-
pipelines = pipelines.Where(p => p.Tag);
202-
}
203-
else if (query.Scope.Value == PipelineScope.branches)
204-
{
205-
pipelines = pipelines.Where(p => !p.Tag);
206-
}
207-
else if (query.Scope.Value == PipelineScope.running)
208-
{
209-
pipelines = pipelines.Where(p => p.Status == JobStatus.Running);
210-
}
211-
else if (query.Scope.Value == PipelineScope.pending)
212-
{
213-
pipelines = pipelines.Where(p => p.Status == JobStatus.Pending);
214-
}
215-
else if (query.Scope.Value == PipelineScope.finished)
216-
{
217-
pipelines = pipelines.Where(p => p.FinishedAt.HasValue);
218-
}
219-
else
220-
{
221-
throw new NotImplementedException();
222-
}
202+
PipelineScope.tags => pipelines.Where(p => p.Tag),
203+
PipelineScope.branches => pipelines.Where(p => !p.Tag),
204+
PipelineScope.running => pipelines.Where(p => p.Status == JobStatus.Running),
205+
PipelineScope.pending => pipelines.Where(p => p.Status == JobStatus.Pending),
206+
PipelineScope.finished => pipelines.Where(p => p.FinishedAt.HasValue),
207+
_ => throw new NotImplementedException(),
208+
};
223209
}
224210

225211
if (query.Status.HasValue)
@@ -237,6 +223,22 @@ public IEnumerable<PipelineBasic> Search(PipelineQuery query)
237223
pipelines = pipelines.Where(pipeline => !string.IsNullOrEmpty(pipeline.YamlError));
238224
}
239225

226+
if (query.UpdatedAfter.HasValue)
227+
{
228+
pipelines = pipelines.Where(pipeline => pipeline.UpdatedAt > query.UpdatedAfter);
229+
}
230+
231+
if (query.UpdatedBefore.HasValue)
232+
{
233+
pipelines = pipelines.Where(pipeline => pipeline.UpdatedAt < query.UpdatedBefore);
234+
}
235+
236+
if (query.Source.HasValue)
237+
{
238+
var source = Utils.ToValueString(query.Source.Value);
239+
pipelines = pipelines.Where(pipeline => string.Equals(pipeline.Source, source, StringComparison.Ordinal));
240+
}
241+
240242
if (query.OrderBy.HasValue)
241243
{
242244
pipelines = query.OrderBy.Value switch

NGitLab/Impl/PipelineClient.cs

Lines changed: 22 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public PipelineClient(API api, ProjectId projectId)
1919
{
2020
_api = api;
2121
_projectPath = $"{Project.Url}/{projectId.ValueAsUriParameter()}";
22-
_pipelinesPath = $"{_projectPath}/pipelines";
22+
_pipelinesPath = _projectPath + PipelineBasic.Url;
2323
}
2424

2525
public IEnumerable<PipelineBasic> All => _api.Get().GetAll<PipelineBasic>(_pipelinesPath);
@@ -134,34 +134,24 @@ private string CreateSearchUrl(PipelineQuery query)
134134
if (query == null)
135135
throw new ArgumentNullException(nameof(query));
136136

137-
var queryEntries = new Dictionary<string, string>(StringComparer.Ordinal);
138-
if (query.Scope.HasValue)
139-
queryEntries.Add("scope", query.Scope.Value.ToString());
137+
var url = _pipelinesPath;
138+
url = Utils.AddParameter(url, "scope", query.Scope);
140139
if (query.Status.HasValue)
141-
queryEntries.Add("status", query.Status.Value.ToString().ToLowerInvariant());
142-
if (!string.IsNullOrWhiteSpace(query.Ref))
143-
queryEntries.Add("ref", query.Ref);
144-
if (!string.IsNullOrWhiteSpace(query.Sha))
145-
queryEntries.Add("sha", query.Sha);
146-
if (query.YamlErrors.HasValue)
147-
queryEntries.Add("yaml_errors", query.YamlErrors.Value.ToString());
148-
if (!string.IsNullOrWhiteSpace(query.Name))
149-
queryEntries.Add("name", query.Name);
150-
if (!string.IsNullOrWhiteSpace(query.Username))
151-
queryEntries.Add("username", query.Username);
152-
if (query.UpdatedAfter.HasValue)
153-
queryEntries.Add("updated_after", query.UpdatedAfter.Value.ToString("O"));
154-
if (query.UpdatedBefore.HasValue)
155-
queryEntries.Add("updated_before", query.UpdatedBefore.Value.ToString("O"));
156-
if (query.OrderBy.HasValue)
157-
queryEntries.Add("order_by", query.OrderBy.Value.ToString());
158-
if (query.Sort.HasValue)
159-
queryEntries.Add("sort", query.Sort.Value.ToString());
160-
if (query.PerPage.HasValue)
161-
queryEntries.Add("per_page", query.PerPage.Value.ToString());
162-
163-
var stringQuery = string.Join("&", queryEntries.Select(kp => $"{kp.Key}={kp.Value}"));
164-
var url = $"{_projectPath}/pipelines{(queryEntries.Count != 0 ? $"?{stringQuery}" : string.Empty)}";
140+
{
141+
url = Utils.AddParameter(url, "status", query.Status.Value.ToString().ToLowerInvariant());
142+
}
143+
144+
url = Utils.AddParameter(url, "ref", query.Ref);
145+
url = Utils.AddParameter(url, "sha", query.Sha);
146+
url = Utils.AddParameter(url, "yaml_errors", query.YamlErrors);
147+
url = Utils.AddParameter(url, "name", query.Name);
148+
url = Utils.AddParameter(url, "username", query.Username);
149+
url = Utils.AddParameter(url, "updated_after", query.UpdatedAfter);
150+
url = Utils.AddParameter(url, "updated_before", query.UpdatedBefore);
151+
url = Utils.AddParameter(url, "order_by", query.OrderBy);
152+
url = Utils.AddParameter(url, "sort", query.Sort);
153+
url = Utils.AddParameter(url, "per_page", query.PerPage);
154+
url = Utils.AddParameter(url, "source", query.Source);
165155
return url;
166156
}
167157

@@ -172,22 +162,22 @@ public void Delete(long pipelineId)
172162

173163
public IEnumerable<PipelineVariable> GetVariables(long pipelineId)
174164
{
175-
return _api.Get().GetAll<PipelineVariable>($"{_projectPath}/pipelines/{pipelineId.ToStringInvariant()}/variables");
165+
return _api.Get().GetAll<PipelineVariable>($"{_pipelinesPath}/{pipelineId.ToStringInvariant()}/variables");
176166
}
177167

178168
public GitLabCollectionResponse<PipelineVariable> GetVariablesAsync(long pipelineId)
179169
{
180-
return _api.Get().GetAllAsync<PipelineVariable>($"{_projectPath}/pipelines/{pipelineId.ToStringInvariant()}/variables");
170+
return _api.Get().GetAllAsync<PipelineVariable>($"{_pipelinesPath}/{pipelineId.ToStringInvariant()}/variables");
181171
}
182172

183173
public TestReport GetTestReports(long pipelineId)
184174
{
185-
return _api.Get().To<TestReport>($"{_projectPath}/pipelines/{pipelineId.ToStringInvariant()}/test_report");
175+
return _api.Get().To<TestReport>($"{_pipelinesPath}/{pipelineId.ToStringInvariant()}/test_report");
186176
}
187177

188178
public TestReportSummary GetTestReportsSummary(long pipelineId)
189179
{
190-
return _api.Get().To<TestReportSummary>($"{_projectPath}/pipelines/{pipelineId.ToStringInvariant()}/test_report_summary");
180+
return _api.Get().To<TestReportSummary>($"{_pipelinesPath}/{pipelineId.ToStringInvariant()}/test_report_summary");
191181
}
192182

193183
public GitLabCollectionResponse<Bridge> GetBridgesAsync(PipelineBridgeQuery query)

NGitLab/Impl/Utils.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Globalization;
33
using System.Linq;
44
using System.Net;
5+
using System.Reflection;
56
using System.Runtime.Serialization;
67

78
namespace NGitLab.Impl;
@@ -27,10 +28,7 @@ public static string ToValueString<T>(T value)
2728
if (enumField is null)
2829
return valueString;
2930

30-
var enumMemberValue = enumField.GetCustomAttributes(typeof(EnumMemberAttribute), inherit: true)
31-
.Cast<EnumMemberAttribute>()
32-
.FirstOrDefault()?
33-
.Value;
31+
var enumMemberValue = enumField.GetCustomAttribute<EnumMemberAttribute>()?.Value;
3432
return enumMemberValue ?? valueString;
3533
}
3634

@@ -49,6 +47,11 @@ public static string AddParameter(string url, string parameterName, DateTime? da
4947
return !date.HasValue ? url : AddParameterInternal(url, parameterName, date.Value.ToString("O"));
5048
}
5149

50+
public static string AddParameter(string url, string parameterName, DateTimeOffset? date)
51+
{
52+
return !date.HasValue ? url : AddParameterInternal(url, parameterName, date.Value.ToString("O"));
53+
}
54+
5255
public static string AddParameter(string url, string parameterName, long[] values)
5356
{
5457
return values is null ? url : AddParameterInternal(url, parameterName, string.Join(",", values.Select(v => v.ToString(CultureInfo.InvariantCulture))));

NGitLab/Models/PipelineQuery.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,6 @@ public class PipelineQuery
2727
public PipelineSort? Sort { get; set; }
2828

2929
public int? PerPage { get; set; }
30+
31+
public PipelineSource? Source { get; set; }
3032
}

NGitLab/Models/PipelineSource.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using System.Runtime.Serialization;
2+
3+
namespace NGitLab.Models;
4+
5+
/// <summary>
6+
/// Possible <see href="https://docs.gitlab.com/ci/jobs/job_rules/#ci_pipeline_source-predefined-variable">pipeline source</see> values.
7+
/// Refer to <seealso href="https://gitlab.com/gitlab-org/gitlab/-/blob/master/doc/api/openapi/openapi_v2.yaml">/api/v4/projects/{id}/pipelines</seealso>
8+
/// </summary>
9+
public enum PipelineSource
10+
{
11+
[EnumMember(Value = "unknown")]
12+
Unknown,
13+
[EnumMember(Value = "push")]
14+
Push,
15+
[EnumMember(Value = "web")]
16+
Web,
17+
[EnumMember(Value = "trigger")]
18+
Trigger,
19+
[EnumMember(Value = "schedule")]
20+
Schedule,
21+
[EnumMember(Value = "api")]
22+
Api,
23+
[EnumMember(Value = "external")]
24+
External,
25+
[EnumMember(Value = "pipeline")]
26+
Pipeline,
27+
[EnumMember(Value = "chat")]
28+
Chat,
29+
[EnumMember(Value = "webide")]
30+
WebIde,
31+
[EnumMember(Value = "merge_request_event")]
32+
MergeRequestEvent,
33+
[EnumMember(Value = "external_pull_request_event")]
34+
ExternalPullRequestEvent,
35+
[EnumMember(Value = "parent_pipeline")]
36+
ParentPipeline,
37+
[EnumMember(Value = "ondemand_dast_scan")]
38+
OndemandDastScan,
39+
[EnumMember(Value = "ondemand_dast_validation")]
40+
OndemandDastValidation,
41+
[EnumMember(Value = "security_orchestration_policy")]
42+
SecurityOrchestrationPolicy,
43+
[EnumMember(Value = "container_registry_push")]
44+
ContainerRegistryPush,
45+
[EnumMember(Value = "duo_workflow")]
46+
DuoWorkflow,
47+
[EnumMember(Value = "pipeline_execution_policy_schedule")]
48+
PipelineExecutionPolicySchedule,
49+
}

NGitLab/PublicAPI/net472/PublicAPI.Unshipped.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3462,6 +3462,8 @@ NGitLab.Models.PipelineQuery.Sha.get -> string
34623462
NGitLab.Models.PipelineQuery.Sha.set -> void
34633463
NGitLab.Models.PipelineQuery.Sort.get -> NGitLab.Models.PipelineSort?
34643464
NGitLab.Models.PipelineQuery.Sort.set -> void
3465+
NGitLab.Models.PipelineQuery.Source.get -> NGitLab.Models.PipelineSource?
3466+
NGitLab.Models.PipelineQuery.Source.set -> void
34653467
NGitLab.Models.PipelineQuery.Status.get -> NGitLab.JobStatus?
34663468
NGitLab.Models.PipelineQuery.Status.set -> void
34673469
NGitLab.Models.PipelineQuery.UpdatedAfter.get -> System.DateTimeOffset?
@@ -3507,6 +3509,26 @@ NGitLab.Models.PipelineScope.tags = 4 -> NGitLab.Models.PipelineScope
35073509
NGitLab.Models.PipelineSort
35083510
NGitLab.Models.PipelineSort.asc = 0 -> NGitLab.Models.PipelineSort
35093511
NGitLab.Models.PipelineSort.desc = 1 -> NGitLab.Models.PipelineSort
3512+
NGitLab.Models.PipelineSource
3513+
NGitLab.Models.PipelineSource.Api = 5 -> NGitLab.Models.PipelineSource
3514+
NGitLab.Models.PipelineSource.Chat = 8 -> NGitLab.Models.PipelineSource
3515+
NGitLab.Models.PipelineSource.ContainerRegistryPush = 16 -> NGitLab.Models.PipelineSource
3516+
NGitLab.Models.PipelineSource.DuoWorkflow = 17 -> NGitLab.Models.PipelineSource
3517+
NGitLab.Models.PipelineSource.External = 6 -> NGitLab.Models.PipelineSource
3518+
NGitLab.Models.PipelineSource.ExternalPullRequestEvent = 11 -> NGitLab.Models.PipelineSource
3519+
NGitLab.Models.PipelineSource.PipelineExecutionPolicySchedule = 18 -> NGitLab.Models.PipelineSource
3520+
NGitLab.Models.PipelineSource.MergeRequestEvent = 10 -> NGitLab.Models.PipelineSource
3521+
NGitLab.Models.PipelineSource.OndemandDastScan = 13 -> NGitLab.Models.PipelineSource
3522+
NGitLab.Models.PipelineSource.OndemandDastValidation = 14 -> NGitLab.Models.PipelineSource
3523+
NGitLab.Models.PipelineSource.ParentPipeline = 12 -> NGitLab.Models.PipelineSource
3524+
NGitLab.Models.PipelineSource.Pipeline = 7 -> NGitLab.Models.PipelineSource
3525+
NGitLab.Models.PipelineSource.Push = 1 -> NGitLab.Models.PipelineSource
3526+
NGitLab.Models.PipelineSource.Schedule = 4 -> NGitLab.Models.PipelineSource
3527+
NGitLab.Models.PipelineSource.SecurityOrchestrationPolicy = 15 -> NGitLab.Models.PipelineSource
3528+
NGitLab.Models.PipelineSource.Trigger = 3 -> NGitLab.Models.PipelineSource
3529+
NGitLab.Models.PipelineSource.Unknown = 0 -> NGitLab.Models.PipelineSource
3530+
NGitLab.Models.PipelineSource.Web = 2 -> NGitLab.Models.PipelineSource
3531+
NGitLab.Models.PipelineSource.WebIde = 9 -> NGitLab.Models.PipelineSource
35103532
NGitLab.Models.PipelineVariable
35113533
NGitLab.Models.PipelineVariable.Key.get -> string
35123534
NGitLab.Models.PipelineVariable.Key.set -> void

NGitLab/PublicAPI/net8.0/PublicAPI.Unshipped.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3461,6 +3461,8 @@ NGitLab.Models.PipelineQuery.Sha.get -> string
34613461
NGitLab.Models.PipelineQuery.Sha.set -> void
34623462
NGitLab.Models.PipelineQuery.Sort.get -> NGitLab.Models.PipelineSort?
34633463
NGitLab.Models.PipelineQuery.Sort.set -> void
3464+
NGitLab.Models.PipelineQuery.Source.get -> NGitLab.Models.PipelineSource?
3465+
NGitLab.Models.PipelineQuery.Source.set -> void
34643466
NGitLab.Models.PipelineQuery.Status.get -> NGitLab.JobStatus?
34653467
NGitLab.Models.PipelineQuery.Status.set -> void
34663468
NGitLab.Models.PipelineQuery.UpdatedAfter.get -> System.DateTimeOffset?
@@ -3506,6 +3508,26 @@ NGitLab.Models.PipelineScope.tags = 4 -> NGitLab.Models.PipelineScope
35063508
NGitLab.Models.PipelineSort
35073509
NGitLab.Models.PipelineSort.asc = 0 -> NGitLab.Models.PipelineSort
35083510
NGitLab.Models.PipelineSort.desc = 1 -> NGitLab.Models.PipelineSort
3511+
NGitLab.Models.PipelineSource
3512+
NGitLab.Models.PipelineSource.Api = 5 -> NGitLab.Models.PipelineSource
3513+
NGitLab.Models.PipelineSource.Chat = 8 -> NGitLab.Models.PipelineSource
3514+
NGitLab.Models.PipelineSource.ContainerRegistryPush = 16 -> NGitLab.Models.PipelineSource
3515+
NGitLab.Models.PipelineSource.DuoWorkflow = 17 -> NGitLab.Models.PipelineSource
3516+
NGitLab.Models.PipelineSource.External = 6 -> NGitLab.Models.PipelineSource
3517+
NGitLab.Models.PipelineSource.ExternalPullRequestEvent = 11 -> NGitLab.Models.PipelineSource
3518+
NGitLab.Models.PipelineSource.PipelineExecutionPolicySchedule = 18 -> NGitLab.Models.PipelineSource
3519+
NGitLab.Models.PipelineSource.MergeRequestEvent = 10 -> NGitLab.Models.PipelineSource
3520+
NGitLab.Models.PipelineSource.OndemandDastScan = 13 -> NGitLab.Models.PipelineSource
3521+
NGitLab.Models.PipelineSource.OndemandDastValidation = 14 -> NGitLab.Models.PipelineSource
3522+
NGitLab.Models.PipelineSource.ParentPipeline = 12 -> NGitLab.Models.PipelineSource
3523+
NGitLab.Models.PipelineSource.Pipeline = 7 -> NGitLab.Models.PipelineSource
3524+
NGitLab.Models.PipelineSource.Push = 1 -> NGitLab.Models.PipelineSource
3525+
NGitLab.Models.PipelineSource.Schedule = 4 -> NGitLab.Models.PipelineSource
3526+
NGitLab.Models.PipelineSource.SecurityOrchestrationPolicy = 15 -> NGitLab.Models.PipelineSource
3527+
NGitLab.Models.PipelineSource.Trigger = 3 -> NGitLab.Models.PipelineSource
3528+
NGitLab.Models.PipelineSource.Unknown = 0 -> NGitLab.Models.PipelineSource
3529+
NGitLab.Models.PipelineSource.Web = 2 -> NGitLab.Models.PipelineSource
3530+
NGitLab.Models.PipelineSource.WebIde = 9 -> NGitLab.Models.PipelineSource
35093531
NGitLab.Models.PipelineVariable
35103532
NGitLab.Models.PipelineVariable.Key.get -> string
35113533
NGitLab.Models.PipelineVariable.Key.set -> void

NGitLab/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3462,6 +3462,8 @@ NGitLab.Models.PipelineQuery.Sha.get -> string
34623462
NGitLab.Models.PipelineQuery.Sha.set -> void
34633463
NGitLab.Models.PipelineQuery.Sort.get -> NGitLab.Models.PipelineSort?
34643464
NGitLab.Models.PipelineQuery.Sort.set -> void
3465+
NGitLab.Models.PipelineQuery.Source.get -> NGitLab.Models.PipelineSource?
3466+
NGitLab.Models.PipelineQuery.Source.set -> void
34653467
NGitLab.Models.PipelineQuery.Status.get -> NGitLab.JobStatus?
34663468
NGitLab.Models.PipelineQuery.Status.set -> void
34673469
NGitLab.Models.PipelineQuery.UpdatedAfter.get -> System.DateTimeOffset?
@@ -3507,6 +3509,26 @@ NGitLab.Models.PipelineScope.tags = 4 -> NGitLab.Models.PipelineScope
35073509
NGitLab.Models.PipelineSort
35083510
NGitLab.Models.PipelineSort.asc = 0 -> NGitLab.Models.PipelineSort
35093511
NGitLab.Models.PipelineSort.desc = 1 -> NGitLab.Models.PipelineSort
3512+
NGitLab.Models.PipelineSource
3513+
NGitLab.Models.PipelineSource.Api = 5 -> NGitLab.Models.PipelineSource
3514+
NGitLab.Models.PipelineSource.Chat = 8 -> NGitLab.Models.PipelineSource
3515+
NGitLab.Models.PipelineSource.ContainerRegistryPush = 16 -> NGitLab.Models.PipelineSource
3516+
NGitLab.Models.PipelineSource.DuoWorkflow = 17 -> NGitLab.Models.PipelineSource
3517+
NGitLab.Models.PipelineSource.External = 6 -> NGitLab.Models.PipelineSource
3518+
NGitLab.Models.PipelineSource.ExternalPullRequestEvent = 11 -> NGitLab.Models.PipelineSource
3519+
NGitLab.Models.PipelineSource.PipelineExecutionPolicySchedule = 18 -> NGitLab.Models.PipelineSource
3520+
NGitLab.Models.PipelineSource.MergeRequestEvent = 10 -> NGitLab.Models.PipelineSource
3521+
NGitLab.Models.PipelineSource.OndemandDastScan = 13 -> NGitLab.Models.PipelineSource
3522+
NGitLab.Models.PipelineSource.OndemandDastValidation = 14 -> NGitLab.Models.PipelineSource
3523+
NGitLab.Models.PipelineSource.ParentPipeline = 12 -> NGitLab.Models.PipelineSource
3524+
NGitLab.Models.PipelineSource.Pipeline = 7 -> NGitLab.Models.PipelineSource
3525+
NGitLab.Models.PipelineSource.Push = 1 -> NGitLab.Models.PipelineSource
3526+
NGitLab.Models.PipelineSource.Schedule = 4 -> NGitLab.Models.PipelineSource
3527+
NGitLab.Models.PipelineSource.SecurityOrchestrationPolicy = 15 -> NGitLab.Models.PipelineSource
3528+
NGitLab.Models.PipelineSource.Trigger = 3 -> NGitLab.Models.PipelineSource
3529+
NGitLab.Models.PipelineSource.Unknown = 0 -> NGitLab.Models.PipelineSource
3530+
NGitLab.Models.PipelineSource.Web = 2 -> NGitLab.Models.PipelineSource
3531+
NGitLab.Models.PipelineSource.WebIde = 9 -> NGitLab.Models.PipelineSource
35103532
NGitLab.Models.PipelineVariable
35113533
NGitLab.Models.PipelineVariable.Key.get -> string
35123534
NGitLab.Models.PipelineVariable.Key.set -> void

0 commit comments

Comments
 (0)