From 1f92ce13d50c8c825e94d96aaf5397582a8da335 Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Wed, 14 Jul 2021 08:01:35 +0900 Subject: [PATCH] mergebot: Add bot for merging branches of a repository 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 | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 mergebot.sh diff --git a/mergebot.sh b/mergebot.sh new file mode 100644 index 0000000..002fa9b --- /dev/null +++ b/mergebot.sh @@ -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 "$?" +} -- 2.47.3