166 references to Text
AnalyzeCiFailure (140)
AnalysisPublicationQueries.cs (4)
43
if (!(response is JsonObject && CiFailureJson.
Text
(response["state"]) is not null &&
49
return CiFailureJson.
Text
(response!["state"]) == "open" && CiFailureJson.IsFalse(response["locked"]);
63
var match = comments.Where(comment => CiFailureJson.
Text
(CiFailureJson.Field(CiFailureJson.Field(comment, "user"), "login")) == "github-actions[bot]" &&
64
(CiFailureJson.
Text
(CiFailureJson.Field(comment, "body")) ?? "").StartsWith("<!-- analyze-ci-failure -->\n", StringComparison.Ordinal))
AnalysisPublisher.cs (16)
138
if (!TryReadEnum<CauseType>(
Text
(existing["type"]), out var storedType))
176
var linked =
Text
(history["issue_url"]);
190
.OrderBy(i =>
Text
(i["state"]) == "closed").FirstOrDefault();
203
if (!(issue is null || GitHubJson.TryReadId(issue["number"], out _) &&
Text
(issue["state"]) is "open" or "closed"))
211
if (!(issue is null ||
Text
(issue["state"]) != "closed" ||
Text
(issue["state_reason"]) != "duplicate"))
311
if (
Text
(issue["state"]) == "closed")
355
var date =
Text
(occurrence["observed_at"])!.Split('T')[0];
363
var storedJob = DiagnosticTextSanitizer.Sanitize(
Text
(occurrence["job"]) ?? "");
369
var row = $"| {date} | [{GetValueText(runId)}]({
Text
(occurrence["run_url"])}) | {tableJobs} | {scope} |";
382
body =
Text
(issue["body"]) ?? "";
423
.DistinctBy(o => (ReadNormalizedNumber(Field(o, "run_id")),
Text
(Field(o, "run_id"))))
424
.OrderBy(o =>
Text
(Field(o, "observed_at")), StringComparer.Ordinal);
476
var lines = (
Text
(issue["body"]) ?? "").ReplaceLineEndings("\n").Split('\n');
478
labels.Any(l =>
Text
(Field(l, "name")) == "ci-failure-cause") &&
607
result =
Text
(Field(response, "html_url")) ?? "";
AnalysisPublisher.Overflow.cs (16)
24
OverflowIssueRenderer.HasMarker(
Text
(issue["body"]), marker))
31
var linked =
Text
(storedRun?["overflow_issue_url"]);
45
Text
(existing["html_url"]) != $"https://github.com/{_repository}/issues/{number}" ||
46
Text
(Field(existing["user"], "login")) != "github-actions[bot]" ||
47
!IsFalse(existing["locked"]) ||
Text
(existing["state"]) is not ("open" or "closed") ||
48
Text
(existing["state_reason"]) == "duplicate" || existing["pull_request"] is not null ||
49
!OverflowIssueRenderer.HasMarker(
Text
(existing["body"]), marker))
56
var body = OverflowIssueRenderer.Merge(
Text
(existing?["body"]), marker, pages[0]);
63
Text
(Field(comment["user"], "login")) == "github-actions[bot]"))
65
var text =
Text
(comment["body"]) ?? "";
88
OverflowIssueRenderer.Merge(
Text
(previous?["body"]), pageMarker, content)));
98
var title = MarkdownFormatting.CodeSpan(DiagnosticTextSanitizer.Sanitize(
Text
(item.History["title"]) ?? item.Cause.Id, limit: 238));
100
var diagnostic = DiagnosticTextSanitizer.Sanitize(
Text
(item.History["error_pattern"]) ?? "", limit: 500);
102
var issueUrl =
Text
(item.History["issue_url"]);
114
var storedJobs = DiagnosticTextSanitizer.Sanitize(
Text
(occurrence?["job"]) ?? "");
162
url =
Text
(publication.Existing["html_url"])!;
BranchHistoryReader.cs (18)
55
Text
(Field(run, "created_at")) is not null &&
Text
(Field(run, "head_sha")) is { Length: > 0 });
98
var newest = rows.Where(run => string.CompareOrdinal(
Text
(run!["created_at"]), Time(start)) >= 0 &&
99
(string.CompareOrdinal(
Text
(run!["created_at"]), Time(end)) < 0 ||
100
Time(end) == failedTime &&
Text
(run!["created_at"]) == failedTime &&
102
.OrderBy(run =>
Text
(run!["created_at"]), StringComparer.Ordinal)
126
if (pages is not JsonArray { Count: > 0 } array ||
Text
(Field(array[0], "status")) != "ahead" ||
130
c is not JsonObject ||
Text
(c["sha"]) is not { Length: > 0 } ||
131
c["commit"] is not JsonObject ||
Text
(Field(c["commit"], "message")) is null ||
Text
(c["html_url"]) is null))
136
var commits = array.SelectMany(p => (JsonArray)p!["commits"]!).DistinctBy(c =>
Text
(c!["sha"])).ToArray();
145
var sha =
Text
(commit!["sha"])!;
167
Message =
Text
(Field(commit["commit"], "message")),
168
HtmlUrl =
Text
(commit["html_url"]),
172
Title =
Text
(pr["title"]),
173
Url =
Text
(pr["html_url"]),
183
=> candidates.OfType<JsonObject>().Where(pr =>
Text
(Field(Field(pr["base"], "repo"), "full_name")) == repository &&
184
Text
(Field(pr["base"], "ref")) == _branchName && pr["merged_at"] is not null)
CauseIssueRenderer.cs (14)
41
var id =
Text
(cause["id"])!;
42
var type =
Text
(cause["type"])!;
44
var title = DiagnosticTextSanitizer.Sanitize(
Text
(cause["title"]) ?? "", limit: 238);
45
var test = DiagnosticTextSanitizer.Sanitize(
Text
(cause["test_name"]) ?? "", limit: 500);
80
var error =
Text
(cause["error_pattern"]) ?? "";
163
var row = $"- {MarkdownFormatting.CodeSpan(DiagnosticTextSanitizer.Sanitize(
Text
(t["name"])!, limit: 500))} — job {GetValueText(t["job_id"])} ({MarkdownFormatting.CodeSpan(DiagnosticTextSanitizer.Sanitize(
Text
(t["job"])!, limit: 500))})";
164
if (
Text
(t["observation_id"]) is { } observation)
166
row += $" — {MarkdownFormatting.CodeSpan(DiagnosticTextSanitizer.Sanitize(observation, limit: 100))}, result {MarkdownFormatting.CodeSpan(DiagnosticTextSanitizer.Sanitize(
Text
(t["result_file"]) ?? "", limit: 500))}";
167
if (
Text
(t["execution_id"]) is { } execution)
173
if (
Text
(t[field]) is { Length: > 0 } diagnostic)
319
.DistinctBy(item => (
Text
(item.Test["name"]), ReadNormalizedNumber(item.Test["job_id"]),
320
Text
(item.Test["observation_id"]),
Text
(item.Test["observation_id"]) is null ? null : item.Run))
CiFailureJson.cs (2)
169
JsonValue value when
Text
(value) is { } text => text,
200
if (
Text
(node) is not { } text)
CollectionProjection.cs (25)
16
Name =
Text
(job["name"]) ?? throw new ValidationException("A collected job needs a name"),
17
Url =
Text
(job["html_url"]),
18
Conclusion =
Text
(job["conclusion"]) ?? "",
22
Name =
Text
(step?["name"]) ?? "",
23
Conclusion =
Text
(step?["conclusion"]),
29
Title =
Text
(metadata["title"]) ?? "", Author =
Text
(Field(metadata["user"], "login")) ?? "",
30
State =
Text
(metadata["state"]) ?? "", HeadBranch =
Text
(Field(metadata["head"], "ref")) ?? "",
31
BaseBranch =
Text
(Field(metadata["base"], "ref")) ?? "", Url =
Text
(metadata["html_url"]) ?? "",
44
Id = GitHubJson.ReadRequiredId(last["id"]), HeadSha =
Text
(last["head_sha"]) ?? "",
45
CreatedAt =
Text
(last["created_at"]) ?? "", Url =
Text
(last["html_url"]),
49
Number = GitHubJson.ReadRequiredId(merge["number"]), Title =
Text
(merge["title"]) ?? "",
50
Author =
Text
(Field(merge["user"], "login")) ?? "", State =
Text
(merge["state"]) ?? "",
51
HeadBranch =
Text
(Field(merge["head"], "ref")) ?? "", BaseBranch =
Text
(Field(merge["base"], "ref")) ?? "",
52
Url =
Text
(merge["html_url"]) ?? "", MergedAt =
Text
(merge["merged_at"]),
88
HeadSha =
Text
(run["head_sha"]) ?? "", Scope = progress.RunScope!.Value,
89
Event =
Text
(run["event"]) ?? "", HeadBranch =
Text
(run["head_branch"]) ?? "",
90
Url =
Text
(run["html_url"]) ?? "",
DiagnosticTextSanitizer.cs (2)
77
_ when
Text
(node) is { } text => JsonValue.Create(Sanitize(text, limit, multiline)),
107
if (
Text
(node[field]) is { } text)
TestResultArtifacts.cs (2)
66
Text
(artifact["name"]),
69
Text
(artifact["created_at"]))).ToArray();
WorkflowRunEvidenceCollector.cs (32)
76
private static bool IsFailedOrInterrupted(JsonNode? conclusion) =>
Text
(conclusion) is "failure" or "cancelled" or "timed_out";
128
if (!(
Text
(run["path"]) == _workflow.WorkflowPath))
130
throw new ValidationException($"Run {runId} belongs to workflow '{Display(
Text
(run["path"]) ?? "")}', not '{Display(_workflow.WorkflowPath)}'");
132
RunScope? runScope =
Text
(run["event"]) switch
134
"push" when
Text
(run["head_branch"]) == "main" => RunScope.Main,
138
if (runScope is null ||
Text
(run["conclusion"]) == "success")
150
progress.HeadSha =
Text
(run["head_sha"]);
151
progress.RunUrl =
Text
(run["html_url"]);
346
Text
(Field(Field(Field(pullRequest, "base"), "repo"), "url")) == $"https://api.github.com/repos/{_repository}")
350
var headSha =
Text
(run["head_sha"]) ?? "";
355
(subjectPrNumber, ambiguous) = SelectSinglePullRequestNumber(associatedPullRequests.Where(pullRequest =>
Text
(Field(Field(Field(pullRequest, "base"), "repo"), "full_name")) == _repository)
358
var headOwner =
Text
(Field(Field(run["head_repository"], "owner"), "login")) ?? "";
359
var headBranch =
Text
(run["head_branch"]) ?? "";
365
mismatchedHead = associatedPullRequests.Count > 0 && !associatedPullRequests.Any(pullRequest =>
Text
(Field(Field(pullRequest, "head"), "sha")) == headSha);
366
(subjectPrNumber, ambiguous) = SelectSinglePullRequestNumber(associatedPullRequests.Where(pullRequest =>
Text
(Field(Field(pullRequest, "head"), "sha")) == headSha).Select(pullRequest => Field(pullRequest, "number")));
385
var headSha =
Text
(run["head_sha"]) ?? "";
406
Text
(run["created_at"]) ?? "",
415
var (candidateMerges, historyState) = await mainHistory.FindCandidateMergesAsync(
Text
(lastSuccessfulRun["head_sha"]) ?? "", headSha);
468
var checkRunUrl =
Text
(job["check_run_url"]) ?? "";
488
if ((job["steps"] as JsonArray ?? []).Any(step =>
Text
(Field(step, "status")) == "in_progress") &&
490
Text
(annotation["message"])?.StartsWith(RunnerLostAnnotation, StringComparison.Ordinal) == true))
642
if (plan.JobName !=
Text
(job["name"]))
645
$"job='{Display(DiagnosticTextSanitizer.Sanitize(
Text
(job["name"]) ?? "", limit: 80))}'; " +
652
!artifacts.OfType<JsonObject>().Any(artifact =>
Text
(artifact["name"]) == plan.ArtifactName &&
653
(
Text
(artifact["created_at"]) is not { } created ||
654
string.CompareOrdinal(created,
Text
(run["run_started_at"]) ?? "") > 0 &&
655
string.CompareOrdinal(created,
Text
(run["updated_at"]) ?? "") <= 0))).ToHashSet();
660
Text
(run["run_started_at"]) ?? "",
661
Text
(run["updated_at"]) ?? "",
728
if (!(ReadNormalizedNumber(associatedRun["id"]) == ReadNormalizedNumber(run["id"]) &&
Text
(associatedRun["head_sha"]) ==
Text
(run["head_sha"])))
791
var matches = failedJobs.OfType<JsonObject>().Where(job =>
Text
(job["name"]) == jobName).ToArray();
Workflows\AspireCiWorkflowConventions.cs (9)
21
if (
Text
(job["name"]) == FinalResultsJob)
26
.FirstOrDefault(step =>
Text
(Field(step, "conclusion")) is "failure" or "cancelled" or "timed_out");
28
return firstFailure is not null && AggregationStepNameRegex().IsMatch(
Text
(Field(firstFailure, "name")) ?? "");
33
var name =
Text
(job["name"]);
39
var required = steps.Any(step =>
Text
(Field(step, "name")) == ResultsUploadStep) ||
65
var interrupted = !steps.Any(step =>
Text
(Field(step, "conclusion")) == "failure") ||
66
steps.Any(step =>
Text
(Field(step, "status")) == "in_progress") ||
67
steps.Any(step =>
Text
(Field(step, "name")) == ExtensionTestStep &&
68
Text
(Field(step, "conclusion")) is "cancelled" or "timed_out");
AnalyzeCiFailure.Tests (26)
AnalyzeCiFailureFixtures.cs (24)
95
var scope = CiFailureJson.ReadEnum<RunScope>(CiFailureJson.
Text
(context["run_scope"]), "Run scope is invalid");
96
var state = CiFailureJson.ReadEnum<EvidenceState>(CiFailureJson.
Text
(Read("test-evidence.json")?["state"]), "Test evidence state is invalid");
131
SubjectPrNumber = long.TryParse(CiFailureJson.
Text
(context["pr_numbers"]), NumberStyles.None, CultureInfo.InvariantCulture, out var pr) && pr > 0 ? pr : null,
153
Title = CiFailureJson.
Text
(prMetadata["title"]) ?? "", Author = CiFailureJson.
Text
(prMetadata["user"]) ?? "",
154
State = CiFailureJson.
Text
(prMetadata["state"]) ?? "", HeadBranch = CiFailureJson.
Text
(prMetadata["head_branch"]) ?? "",
155
BaseBranch = CiFailureJson.
Text
(prMetadata["base_branch"]) ?? "", Url = CiFailureJson.
Text
(prMetadata["html_url"]) ?? "",
163
CiFailureJson.
Text
(metadata["head_sha"]) ?? "",
171
var matching = bundle.TestEvidence.Failures.Where(collected => collected.Name == CiFailureJson.
Text
(test?["name"]) &&
172
(test?["job_id"] is { } id ? collected.JobId == GitHubJson.ReadRequiredId(id) : jobs.Any(job => job.Id == collected.JobId && job.Name == CiFailureJson.
Text
(test?["job"])))).ToArray();
173
var observation = CiFailureJson.
Text
(test?["observation_id"]);
179
Classification = CiFailureJson.ReadEnum<TestClassification>(CiFailureJson.
Text
(test?["classification"]), "Test classification is invalid"),
180
Reason = CiFailureJson.
Text
(test?["reason"]) ?? "",
187
var id = CiFailureJson.
Text
(cause["id"])!;
189
var type = CiFailureJson.ReadEnum<CauseType>(CiFailureJson.
Text
(cause["type"]), "Cause type is invalid");
192
? explicitTests.Any(reference => CiFailureJson.
Text
(reference?["name"]) == test.Name &&
194
(reference?["observation_id"] is null || CiFailureJson.
Text
(reference["observation_id"]) == $"observation-{bundle.TestEvidence.Failures.IndexOf(test) + 1}"))
195
: test.Name == CiFailureJson.
Text
(cause["test_name"]) && jobIds.Contains(test.JobId))
215
Title = CiFailureJson.
Text
(cause["title"])!,
216
ErrorPattern = CiFailureJson.
Text
(cause["error_pattern"])!,
233
Classification = CiFailureJson.ReadEnum<JobClassification>(CiFailureJson.
Text
(job?["classification"]), "Job classification is invalid"),
234
Reason = CiFailureJson.
Text
(job?["reason"]) ?? "",
TestServices\AlternateWorkflowConventions.cs (2)
19
=> CiFailureJson.
Text
(job["name"]) == "Alternate gate";
23
var name = CiFailureJson.
Text
(job["name"])!;