diff options
Diffstat (limited to 'precommit-ssh-apply.sh')
-rwxr-xr-x | precommit-ssh-apply.sh | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/precommit-ssh-apply.sh b/precommit-ssh-apply.sh new file mode 100755 index 00000000..32375ae2 --- /dev/null +++ b/precommit-ssh-apply.sh @@ -0,0 +1,129 @@ +#!/bin/bash + +set -euf -o pipefail +x + +scripts=$(dirname $0) +# shellcheck source=jenkins-helpers.sh +. $scripts/jenkins-helpers.sh +# shellcheck source=pw-helpers.sh +. $scripts/pw-helpers.sh + +convert_args_to_variables "$@" + +obligatory_variables pw_url +declare pw_url + +fetch_only="${fetch_only-false}" +series_dir="${series_dir-}" +verbose="${verbose-true}" + +if $verbose; then + set -x +fi + +case "$pw_url" in + "ssh://"*) + # ssh://ssh_host:path/to/maildir[#num_patch] + # Note that CI will ssh to $ssh_host as tcwg-buildslave user. + true + ;; + *) assert_with_msg "pw_url does not match ssh://*" false ;; +esac + +series_url=$(echo "$pw_url" | cut -d/ -f 3- | sed -e "s/#.*//") +case "$series_url" in + *".patch") ;; + *"/") ;; + *) series_url="$series_url/" ;; +esac + +num_patch=$(echo "$pw_url" | cut -s -d# -f 2) +if [ "$num_patch" = "" ]; then + num_patch="0" +fi + +if [ "$series_dir" = "" ]; then + series_dir=$(mktemp -d) + trap 'rm -rf "$series_dir"' EXIT +fi +rsync -a "$series_url" "$series_dir/new/" + +if $fetch_only; then + exit 0 +fi + +obligatory_variables project pw_dir build_url patch_submitter +declare project pw_dir build_url patch_submitter + +url=$(get_baseline_git "${project}_url") +rev=$(get_baseline_git "${project}_rev") +echo "Fetching baseline $url#$rev" +clone_or_update_repo "$project" "$rev" "$url" > /dev/null + +# Create a state file for this patch. This is sourced by pw-report.sh to avoid +# passing a bunch of parameters on the command line. +mkdir -p "$pw_dir" +cat > "$pw_dir/$project" <<EOF +pw[project]='$project' +pw[${project}]='$project' +pw[${project}_patch_id]='$num_patch' +pw[${project}_check_cmd]='echo REPORT' +pw[${project}_build_url]='$build_url' +pw[${project}_patch_url]='$pw_url' +pw[${project}_patch_message_id]='no_message_id' +pw[${project}_patch_submitter]='$patch_submitter' +EOF + +prev_head=$(git -C "$project" rev-parse HEAD) + +apply_series_with_retry "$project" "$prev_head" am "$series_dir/" \ + "$series_url" & +res=0 && wait $! || res=$? +patches_applied=$(git -C "$project" rev-list --count HEAD "^$prev_head") + +if [ "$patches_applied" -le "$num_patch" ]; then + apply_result="fail" + if [ "$res" = "0" ] && [ "$patches_applied" = "0" ]; then + # "series apply" finished successfully, but no patch was applied; + # this means that the patch is already merged. + apply_result="merged" + fi + + cat > "$pw_dir/mail-recipients.txt" <<EOF +$patch_submitter +EOF + cat > "$pw_dir/mail-subject.txt" <<EOF +[Linaro-TCWG-CI] $pw_url failed to apply +EOF + cat > "$pw_dir/mail-body.txt" <<EOF +${build_url}artifact/artifacts/jenkins/precommit-ssh-apply.log/*view*/ + +Patch series $pw_url applied fewer patches than expected: $patches_applied vs expected $(($num_patch + 1))" +EOF + if [ "$apply_result" = "merged" ]; then + cat >> "$pw_dir/mail-body.txt" <<EOF + +Most likely the patch series is now merged into mainline" +EOF + fi + + if [ $res != 0 ]; then + exit $res + fi + + + exit 5 +fi + +git -C "$project" checkout --detach HEAD~$num_patch + +# Some debug traces, to check which files were modified and their time stamps +( + set +e + cd "$project" + git status + git status -s | awk '{print $NF;}' | while IFS='' read -r line + do + ls -l "$line" + done +) |