]> git.corax.cc Git - foundry/commitdiff
mergebot: Add bot for merging branches of a repository
authorMatthias Kruk <m@m10k.eu>
Tue, 13 Jul 2021 23:01:35 +0000 (08:01 +0900)
committerMatthias Kruk <m@m10k.eu>
Tue, 13 Jul 2021 23:01:35 +0000 (08:01 +0900)
This commit adds mergebot. Mergebot accepts merge request messages
and will attempt to merge the one branch into another. Currently,
this only works for merges that can be realised by fast-forwarding
the target branch.

mergebot.sh [new file with mode: 0644]

diff --git a/mergebot.sh b/mergebot.sh
new file mode 100644 (file)
index 0000000..002fa9b
--- /dev/null
@@ -0,0 +1,124 @@
+#!/bin/bash
+
+merge() {
+       local repository="$1"
+       local sbranch="$2"
+       local dbranch="$3"
+
+       local clone
+       local err
+
+       if ! clone=$(mktemp -d); then
+               log_error "Could not make temporary directory"
+               return 1
+       fi
+
+       err=1
+
+       if ! git_clone "$repository" "$clone"; then
+               log_error "Could not clone $repository to $clone"
+
+       elif ! git_merge "$repository" "$sbranch" "$dbranch"; then
+               log_error "Could not merge $sbranch into $dbranch in $repository"
+
+       elif ! git_push "$repository" "$dbranch"; then
+               log_error "Could not push $dbranch of $repository to origin"
+
+       else
+               err=0
+       fi
+
+       if ! rm -rf "$clone"; then
+               log_warn "Could not clean up temporary directory $clone"
+       fi
+
+       return "$err"
+}
+
+handle_merge_request() {
+       local mmsg="$1"
+
+       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
+               log_warn "Dropping malformed message"
+               return 1
+       fi
+
+       if ! merge "$repository" "$sbranch" "$dbranch"; then
+               return 1
+       fi
+
+       return 0
+}
+
+handle_message() {
+       local message="$1"
+
+       local mmsg
+
+       if ! mmsg=$(ipc_msg_get_data "$message"); then
+               log_warn "Dropping malformed message"
+               return 1
+       fi
+
+       if ! handle_merge_request "$mmsg"; then
+               return 1
+       fi
+
+       return 0
+}
+
+_mergebot_run() {
+       local endpoint_name="$1"
+
+       local endpoint
+
+       if ! endpoint=$(ipc_endpoint_open "$endpoint_name"); then
+               log_error "Could not open endpoint $endpoint_name"
+               return 1
+       fi
+
+       while inst_running; do
+               local msg
+
+               if ! msg=$(ipc_endpoint_recv "$endpoint" 5); then
+                       continue
+               fi
+
+               handle_message "$msg"
+       done
+
+       return 0
+}
+
+main() {
+       opt_add_arg "e" "endpoint" "v" "pub/mergebot" "The endpoint to receive messages on"
+
+       if ! opt_parse "$@"; then
+               return 1
+       fi
+
+       if ! inst_start _mergebot_run "$endpoint"; then
+               return 1
+       fi
+
+       return 0
+}
+
+{
+       if ! . toolbox.sh; then
+               exit 1
+       fi
+
+       if ! include "log" "opt" "inst" "ipc" "foundry/msg/mergerequest"; then
+               exit 1
+       fi
+
+       main "$@"
+       exit "$?"
+}