aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mod/mod-ci-github-gq.cxx133
-rw-r--r--mod/mod-ci-github-gq.hxx10
-rw-r--r--mod/mod-ci-github.cxx3
3 files changed, 101 insertions, 45 deletions
diff --git a/mod/mod-ci-github-gq.cxx b/mod/mod-ci-github-gq.cxx
index b1168ba..2b9228c 100644
--- a/mod/mod-ci-github-gq.cxx
+++ b/mod/mod-ci-github-gq.cxx
@@ -229,8 +229,7 @@ namespace brep
gq_mutate_check_runs (const basic_mark& error,
vector<check_run>& crs,
const string& iat,
- string rq,
- build_state st) noexcept
+ string rq) noexcept
{
vector<gh_check_run> rcrs;
@@ -266,6 +265,7 @@ namespace brep
//
const gh_check_run& rcr (rcrs[i]); // Received check run.
+ build_state st (crs[i].state); // Requested state.
build_state rst (gh_from_status (rcr.status)); // Received state.
// Note that GitHub won't allow us to change a built check run to
@@ -352,9 +352,10 @@ namespace brep
// Serialize `createCheckRun` mutations for one or more builds to GraphQL.
//
- // The build result argument (`br`) is required if the build_state is built
- // because GitHub does not allow a check run status of completed without a
- // conclusion.
+ // The check run build states are taken from each object in `crs`.
+ //
+ // Note that build results are not supported because we never create
+ // multiple check runs in the built state.
//
// The details URL argument (`du`) can be empty for queued but not for the
// other states.
@@ -363,9 +364,7 @@ namespace brep
gq_mutation_create_check_runs (const string& ri, // Repository ID
const string& hs, // Head SHA
const optional<string>& du, // Details URL.
- const vector<check_run>& crs,
- const string& st, // Check run status.
- optional<gq_built_result> br = nullopt)
+ const vector<check_run>& crs)
{
// Ensure details URL is non-empty if present.
//
@@ -379,27 +378,20 @@ namespace brep
//
for (size_t i (0); i != crs.size (); ++i)
{
+ assert (crs[i].state != build_state::built); // Not supported.
+
string al ("cr" + to_string (i)); // Field alias.
os << gq_name (al) << ":createCheckRun(input: {" << '\n'
<< " name: " << gq_str (crs[i].name) << '\n'
<< " repositoryId: " << gq_str (ri) << '\n'
<< " headSha: " << gq_str (hs) << '\n'
- << " status: " << gq_enum (st);
+ << " status: " << gq_enum (gh_to_status (crs[i].state));
if (du)
{
os << '\n';
os << " detailsUrl: " << gq_str (*du);
}
- if (br)
- {
- os << '\n';
- os << " conclusion: " << gq_enum (br->conclusion) << '\n'
- << " output: {" << '\n'
- << " title: " << gq_str (br->title) << '\n'
- << " summary: " << gq_str (br->summary) << '\n'
- << " }";
- }
os << "})" << '\n'
// Specify the selection set (fields to be returned). Note that we
// rename `id` to `node_id` (using a field alias) for consistency with
@@ -419,6 +411,71 @@ namespace brep
return os.str ();
}
+ // Serialize a `createCheckRun` mutation for a build to GraphQL.
+ //
+ // The build result argument (`br`) is required if the build_state is built
+ // because GitHub does not allow a check run status of completed without a
+ // conclusion.
+ //
+ // The details URL argument (`du`) can be empty for queued but not for the
+ // other states.
+ //
+ static string
+ gq_mutation_create_check_run (const string& ri, // Repository ID
+ const string& hs, // Head SHA
+ const optional<string>& du, // Details URL.
+ const check_run& cr,
+ const string& st, // Check run status.
+ optional<gq_built_result> br = nullopt)
+ {
+ // Ensure details URL is non-empty if present.
+ //
+ assert (!du || !du->empty ());
+
+ ostringstream os;
+
+ os << "mutation {" << '\n';
+
+ // Serialize a `createCheckRun` for the build.
+ //
+ os << gq_name ("cr0") << ":createCheckRun(input: {" << '\n'
+ << " name: " << gq_str (cr.name) << '\n'
+ << " repositoryId: " << gq_str (ri) << '\n'
+ << " headSha: " << gq_str (hs) << '\n'
+ << " status: " << gq_enum (st);
+ if (du)
+ {
+ os << '\n';
+ os << " detailsUrl: " << gq_str (*du);
+ }
+ if (br)
+ {
+ os << '\n';
+ os << " conclusion: " << gq_enum (br->conclusion) << '\n'
+ << " output: {" << '\n'
+ << " title: " << gq_str (br->title) << '\n'
+ << " summary: " << gq_str (br->summary) << '\n'
+ << " }";
+ }
+ os << "})" << '\n'
+ // Specify the selection set (fields to be returned). Note that we
+ // rename `id` to `node_id` (using a field alias) for consistency with
+ // webhook events and REST API responses.
+ //
+ << "{" << '\n'
+ << " checkRun {" << '\n'
+ << " node_id: id" << '\n'
+ << " name" << '\n'
+ << " status" << '\n'
+ << " }" << '\n'
+ << "}" << '\n';
+
+ os << "}" << '\n';
+
+ return os.str ();
+ }
+
+
// Serialize an `updateCheckRun` mutation for one build to GraphQL.
//
// The `co` (conclusion) argument is required if the build_state is built
@@ -485,23 +542,21 @@ namespace brep
vector<check_run>& crs,
const string& iat,
const string& rid,
- const string& hs,
- build_state st)
+ const string& hs)
{
// No support for result_status so state cannot be built.
//
- assert (st != build_state::built);
+#ifndef NDEBUG
+ for (const check_run& cr: crs)
+ assert (cr.state != build_state::built);
+#endif
// Empty details URL because it's not available until building.
//
- string rq (
- gq_serialize_request (gq_mutation_create_check_runs (rid,
- hs,
- nullopt,
- crs,
- gh_to_status (st))));
+ string rq (gq_serialize_request (
+ gq_mutation_create_check_runs (rid, hs, nullopt, crs)));
- return gq_mutate_check_runs (error, crs, iat, move (rq), st);
+ return gq_mutate_check_runs (error, crs, iat, move (rq));
}
bool
@@ -518,18 +573,19 @@ namespace brep
//
assert (st != build_state::built || br);
- vector<check_run> crs {move (cr)};
-
string rq (
gq_serialize_request (
- gq_mutation_create_check_runs (rid,
- hs,
- du,
- crs,
- gh_to_status (st),
- move (br))));
+ gq_mutation_create_check_run (rid,
+ hs,
+ du,
+ cr,
+ gh_to_status (st),
+ move (br))));
+
+ vector<check_run> crs {move (cr)};
+ crs[0].state = st;
- bool r (gq_mutate_check_runs (error, crs, iat, move (rq), st));
+ bool r (gq_mutate_check_runs (error, crs, iat, move (rq)));
cr = move (crs[0]);
@@ -567,8 +623,9 @@ namespace brep
move (br))));
vector<check_run> crs {move (cr)};
+ crs[0].state = st;
- bool r (gq_mutate_check_runs (error, crs, iat, move (rq), st));
+ bool r (gq_mutate_check_runs (error, crs, iat, move (rq)));
cr = move (crs[0]);
diff --git a/mod/mod-ci-github-gq.hxx b/mod/mod-ci-github-gq.hxx
index f041ea8..9c23cd4 100644
--- a/mod/mod-ci-github-gq.hxx
+++ b/mod/mod-ci-github-gq.hxx
@@ -19,9 +19,10 @@ namespace brep
// GraphQL functions (all start with gq_).
//
- // Create a new check run on GitHub for each build. Update `check_runs` with
- // the new data (node id, state, and state_synced). Return false and issue
- // diagnostics if the request failed.
+ // Create a new check run on GitHub for each build with the build state
+ // taken from each check_run object. Update `check_runs` with the new data
+ // (node id and state_synced). Return false and issue diagnostics if the
+ // request failed.
//
// Note: no details_url yet since there will be no entry in the build result
// search page until the task starts building.
@@ -36,8 +37,7 @@ namespace brep
vector<check_run>& check_runs,
const string& installation_access_token,
const string& repository_id,
- const string& head_sha,
- build_state);
+ const string& head_sha);
// Create a new check run on GitHub for a build. Update `cr` with the new
// data (node id, state, and state_synced). Return false and issue
diff --git a/mod/mod-ci-github.cxx b/mod/mod-ci-github.cxx
index f9f33a8..57a3b08 100644
--- a/mod/mod-ci-github.cxx
+++ b/mod/mod-ci-github.cxx
@@ -1693,8 +1693,7 @@ namespace brep
if (gq_create_check_runs (error,
crs,
iat->token,
- sd.repository_node_id, sd.report_sha,
- build_state::queued))
+ sd.repository_node_id, sd.report_sha))
{
for (const check_run& cr: crs)
{