grub2/do-sync
Leo Sandoval 439310c622 do-sync: helper script to sync dist-git and git branches
The bootloader team manually synchronizes several git branches on the
rhboot/grub (git) repository based on dist-git (dist-git) repository. Although
this task is simple, it is a maintenance burden, usually done much after the
dist-git repository is updated, having out-of-sync git branches most of the
time.

The goal of the included script is to create a temporal branch based on
latest git branch then include those possible missing dist-git patches and
finally push it.

Signed-off-by: Leo Sandoval <lsandova@redhat.com>
2025-04-08 16:00:08 +00:00

89 lines
3 KiB
Bash
Executable file

#!/bin/bash
set -o nounset
set -o errexit
usage() {
echo "Usage $0 <pkgtool>:<dist_git_branch>:<git_branch>:<git_base_commit>"
echo "Generates a (rhboot) grub2 branch which contains latest patches from dist-git based on specific Fedora/RHEL version"
echo "Command expects a single parameter delimited with colons, with the following meanings:"
echo " pkgtool: Package tool, e.g. fedpkg, rhpkg, etc."
echo " dist_git_branch: The dist-git branch/release to sync"
echo " git_branch: The git branch/release to sync"
echo " git_base_commit: base commit where git_branch is based on"
echo
echo "Examples:"
echo
echo " $0 fedpkg:rawhide:fedora-43:grub-2.12"
echo " $0 fedpkg:f42:fedora-42:grub-2.12"
echo " $0 fedpkg:f41:fedora-41:grub-2.12"
echo " $0 fedpkg:f40:fedora-40:grub-2.12"
echo
echo "Also handles RHEL branches:"
echo
echo " $0 rhpkg:rhel-10-main:rhel-10-main:grub-2.12"
echo " $0 rhpkg:rhel-9-main:rhel-9-main:grub-2.06"
echo " $0 rhpkg:rhel-8-main:rhel-8-main:f28-branchpoint"
exit 1
}
# check params
[ $# -eq 1 ] || usage
args=$1
pkgtool=$(echo "$args" | awk -F ':' '{print $1}')
dist_git_branch=$(echo "$args" | awk -F ':' '{print $2}')
git_branch=$(echo "$args" | awk -F ':' '{print $3}')
git_base_commit=$(echo "$args" | awk -F ':' '{print $4}')
# working dirs
dist_git_dir=/tmp/grub/dist-git
git_dir=/tmp/grub/git
rm -rf $dist_git_dir $git_dir
mkdir -p $dist_git_dir $git_dir
pushd $dist_git_dir > /dev/null
{
# clone grub2 package anonymously
$pkgtool clone -a grub2 . 2>/dev/null
# create a local branch, all fine if already exists
git checkout -q -b "$dist_git_branch" origin/"$dist_git_branch" 2> /dev/null || true
}
popd > /dev/null
pushd $git_dir > /dev/null
{
git clone -q git@github.com:rhboot/grub2.git . 2>/dev/null
dist_git_sync_branch=${git_branch}-dist-git-$(date +"%Y-%m-%d-%H_%M_%S")
git checkout -q -b "$dist_git_sync_branch" "$git_base_commit"
while read -r line; do
p=$(echo "$line" | awk '{print $2}')
git am -q "$dist_git_dir/$p" 2>/dev/null
done < $dist_git_dir/grub.patches
# brach current git_branch based on upstream git_branch
git branch -D "$git_branch" 2>/dev/null || true
git checkout -q -b "$git_branch" origin/"$git_branch"
missing_commits=$(git cherry "${git_branch}" "${dist_git_sync_branch}" | grep ^+ | wc -l)
if [[ $missing_commits -eq 0 ]]; then
echo "Branch $git_branch is up-to-date, no need to sync"
else
echo "Missing commits ($missing_commits) which would be integrated in final branch"
git cherry "$git_branch" "$dist_git_sync_branch" -v | grep ^+
# finally cherry pick those missing patches
git cherry "$git_branch" "$dist_git_sync_branch" 2>/dev/null | grep ^+ | sed 's/\+ //' | xargs git cherry-pick 2>/dev/null
echo "Pushing latest commits"
cd "$git_dir"
git push -v origin "$git_branch"
fi
}
popd > /dev/null