From 8b0d07460947ea67c9073b3769bbc982ba43d719 Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Sun, 8 Aug 2021 15:53:40 +0900 Subject: [PATCH] mergebot: Fix message handling and publish a merge notifications Mergebot does not correctly handle incoming messages, causing it to discard perfectly fine merge requests. Further, it does not publish notifications when a merge has been completed. This commit fixes mergebot so that it handles incoming messages correctly and publishes a merge message for each merge it has attempted. --- mergebot.sh | 96 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 78 insertions(+), 18 deletions(-) mode change 100644 => 100755 mergebot.sh diff --git a/mergebot.sh b/mergebot.sh old mode 100644 new mode 100755 index 002fa9b..befb43b --- a/mergebot.sh +++ b/mergebot.sh @@ -6,50 +6,88 @@ merge() { local dbranch="$3" local clone + local msg local err if ! clone=$(mktemp -d); then - log_error "Could not make temporary directory" + msg="Could not make temporary directory" + log_error "$msg" + echo "$msg" return 1 fi err=1 if ! git_clone "$repository" "$clone"; then - log_error "Could not clone $repository to $clone" + msg="Could not clone $repository into $clone" + log_error "$msg" + echo "$msg" - elif ! git_merge "$repository" "$sbranch" "$dbranch"; then - log_error "Could not merge $sbranch into $dbranch in $repository" + elif ! git_merge "$clone" "$sbranch" "$dbranch"; then + msg="Could not merge $sbranch into $dbranch in $repository" + log_error "$msg" + echo "$msg" - elif ! git_push "$repository" "$dbranch"; then - log_error "Could not push $dbranch of $repository to origin" + elif ! git_push "$clone" "$dbranch"; then + msg="Could not push branch \"$dbranch\" of $repository to origin" + log_error "$msg" + echo "$msg" else err=0 fi if ! rm -rf "$clone"; then - log_warn "Could not clean up temporary directory $clone" + msg="Could not clean up temporary directory $clone" + log_warn "$msg" + echo "$msg" fi return "$err" } handle_merge_request() { - local mmsg="$1" + local endpoint="$1" + local topic="$2" + local mmsg="$3" + local context local repository local sbranch local dbranch - - if ! repository=$(foundry_msg_mergerequest_get_repository "$mmsg") || - ! sbranch=$(foundry_msg_mergerequest_get_source "$mmsg") || - ! dbranch=$(foundry_msg_mergerequest_get_destination "$mmsg"); then + local mergelog + local result + local merge_msg + + if ! context=$(foundry_msg_mergerequest_get_context "$mmsg") || + ! repository=$(foundry_msg_mergerequest_get_repository "$mmsg") || + ! sbranch=$(foundry_msg_mergerequest_get_source_branch "$mmsg") || + ! dbranch=$(foundry_msg_mergerequest_get_destination_branch "$mmsg"); then log_warn "Dropping malformed message" + log_highlight "message" <<< "$mmsg" | log_debug + return 1 + fi + + result=0 + + if ! mergelog=$(merge "$repository" "$sbranch" "$dbranch"); then + result=1 + fi + + if ! foundry_context_log "$context" "merge" <<< "$mergelog"; then + log_error "Could not log to context $context" + fi + + if ! merge_msg=$(foundry_msg_merge_new "$context" \ + "$repository" \ + "$sbranch" \ + "$dbranch" \ + "$result"); then + log_error "Could not create merge message" return 1 fi - if ! merge "$repository" "$sbranch" "$dbranch"; then + if ! ipc_endpoint_publish "$endpoint" "$topic" "$merge_msg"; then return 1 fi @@ -57,16 +95,30 @@ handle_merge_request() { } handle_message() { - local message="$1" + local endpoint="$1" + local topic="$2" + local message="$3" local mmsg + local msgtype if ! mmsg=$(ipc_msg_get_data "$message"); then log_warn "Dropping malformed message" + ipc_msg_dump "$message" | log_warn return 1 fi - if ! handle_merge_request "$mmsg"; then + if ! msgtype=$(foundry_msg_get_type "$mmsg"); then + log_warn "Dropping message without type" + return 1 + fi + + if [[ "$msgtype" != "mergerequest" ]]; then + log_warn "Dropping message with unexpected type $msgtype" + return 1 + fi + + if ! handle_merge_request "$endpoint" "$topic" "$mmsg"; then return 1 fi @@ -75,6 +127,7 @@ handle_message() { _mergebot_run() { local endpoint_name="$1" + local topic="$2" local endpoint @@ -90,20 +143,27 @@ _mergebot_run() { continue fi - handle_message "$msg" + handle_message "$endpoint" "$topic" "$msg" done return 0 } main() { + local endpoint + local topic + opt_add_arg "e" "endpoint" "v" "pub/mergebot" "The endpoint to receive messages on" + opt_add_arg "t" "topic" "v" "merges" "The topic to publish merge messages on" if ! opt_parse "$@"; then return 1 fi - if ! inst_start _mergebot_run "$endpoint"; then + endpoint=$(opt_get "endpoint") + topic=$(opt_get "topic") + + if ! inst_start _mergebot_run "$endpoint" "$topic"; then return 1 fi @@ -115,7 +175,7 @@ main() { exit 1 fi - if ! include "log" "opt" "inst" "ipc" "foundry/msg/mergerequest"; then + if ! include "log" "opt" "git" "inst" "ipc" "foundry/msg"; then exit 1 fi -- 2.47.3