modules/web_hook: Add post-push handler for reacting to push events.

This commit is contained in:
Jason Volk 2023-04-27 22:33:46 -07:00
parent e5ae70c521
commit 0624b69246
1 changed files with 119 additions and 27 deletions

View File

@ -174,6 +174,10 @@ static bool
github_handle__push(std::ostream &, github_handle__push(std::ostream &,
const json::object &content); const json::object &content);
static bool
github_post_handle__push(const m::event::id &,
const json::object &content);
static bool static bool
github_handle__pull_request(std::ostream &, github_handle__pull_request(std::ostream &,
const json::object &content); const json::object &content);
@ -355,6 +359,9 @@ github_handle(client &client,
m::msghtml(room_id, user_id, view(out, buf[0]), view(alt, buf[1]), "m.notice") m::msghtml(room_id, user_id, view(out, buf[0]), view(alt, buf[1]), "m.notice")
}; };
if(type == "push")
github_post_handle__push(evid, request.content);
log::info log::info
{ {
"Webhook [%s] '%s' delivered to %s %s", "Webhook [%s] '%s' delivered to %s %s",
@ -1591,40 +1598,77 @@ try
json::object{relates_content}.get("body") json::object{relates_content}.get("body")
}; };
if(!startswith(relates_body, "job status table ")) if(startswith(relates_body, "job status table "))
return;
const auto suffix
{ {
lstrip(relates_body, "job status table ") const auto suffix
}; {
lstrip(relates_body, "job status table ")
};
string_view token[3]; string_view token[3];
ircd::tokens(suffix, ' ', token); ircd::tokens(suffix, ' ', token);
const auto &[repopath, run_id, attempt] {token}; const auto &[repopath, run_id, attempt] {token};
assert(repopath); assert(repopath);
assert(run_id); assert(run_id);
if(!repopath || !run_id) if(!repopath || !run_id)
return; return;
switch(hash(key)) switch(hash(key))
{
case hash("🚮"_sv):
github_run_delete(repopath, run_id);
m::redact(room, user_id, relates_event_id, "deleted");
break;
case hash(""_sv):
github_run_cancel(repopath, run_id);
break;
case hash("🔄"_sv):
github_run_rerun_failed(repopath, run_id);
break;
case hash("↪️"_sv):
github_run_rerun(repopath, run_id);
break;
}
}
else if(startswith(relates_body, "push by "))
{ {
case hash("🚮"_sv): const auto suffix
github_run_delete(repopath, run_id); {
m::redact(room, user_id, relates_event_id, "deleted"); lstrip(relates_body, "push by ")
break; };
case hash(""_sv): string_view token[5];
github_run_cancel(repopath, run_id); ircd::tokens(suffix, ' ', token);
break; const auto &[pusher, _by_, repo, _at_, commit] {token};
assert(pusher);
assert(repo);
assert(commit);
if(!repo)
return;
case hash("🔄"_sv): if(startswith(key, "▶️"))
github_run_rerun_failed(repopath, run_id); {
break; const auto id
{
between(key, '(', ')')
};
case hash("↪️"_sv): const auto ref
github_run_rerun(repopath, run_id); {
break; // commit // hash not supported by github
"master"
};
github_run_dispatch(repo, id, ref, json::members
{
});
return;
}
} }
} }
catch(const ctx::interrupted &) catch(const ctx::interrupted &)
@ -1944,6 +1988,54 @@ github_handle__push(std::ostream &out,
return true; return true;
} }
static bool
github_post_handle__push(const m::event::id &push_event_id,
const json::object &content)
{
const m::user::id::buf _webhook_user
{
string_view{webhook_user}, my_host()
};
const auto _webhook_room
{
m::room_id(string_view(webhook_room))
};
const auto repo
{
github_repopath(content)
};
github_flow_for_each(repo, [&]
(const json::object &flow)
{
const json::string name
{
flow["name"]
};
const json::string id
{
flow["id"]
};
const fmt::bsprintf<128> key
{
"▶️ %s (%s)", name, id
};
const auto annote_id
{
m::annotate(_webhook_room, _webhook_user, push_event_id, string_view(key))
};
return true;
});
return true;
}
bool bool
github_handle__pull_request(std::ostream &out, github_handle__pull_request(std::ostream &out,
const json::object &content) const json::object &content)