]> git.corax.cc Git - foundry/commitdiff
mergebot: Fix message handling and publish a merge notifications
authorMatthias Kruk <m@m10k.eu>
Sun, 8 Aug 2021 06:53:40 +0000 (15:53 +0900)
committerMatthias Kruk <m@m10k.eu>
Sun, 8 Aug 2021 06:53:40 +0000 (15:53 +0900)
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 [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 002fa9b..befb43b
@@ -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