Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kernel Bump v2 #14913

Merged
merged 11 commits into from Apr 12, 2024
112 changes: 75 additions & 37 deletions scripts/kernel_bump.sh
Expand Up @@ -18,8 +18,10 @@ REQUIRED_COMMANDS='
exit
git
printf
sed
set
shift
sort
'

_msg()
Expand Down Expand Up @@ -54,11 +56,14 @@ usage()
{
echo "Usage: ${0}"
echo 'Helper script to bump the target kernel version, whilst keeping history.'
echo ' -c Migrate config files (e.g. subtargets) only.'
echo " -p Optional Platform name (e.g. 'ath79' [PLATFORM_NAME]"
echo " -r Optional comma separated list of sub-targets (e.g. 'rtl930x' [SUBTARGET_NAMES]"
echo " -s Source version of kernel (e.g. 'v6.1' [SOURCE_VERSION])"
echo " -t Target version of kernel (e.g. 'v6.6' [TARGET_VERSION]')"
echo
echo 'All options can also be passed in environment variables (listed between [BRACKETS]).'
echo 'Note that this script must be run from within the OpenWrt git repository.'
echo 'Example: scripts/kernel_bump.sh -p realtek -s v6.1 -t v6.6'
}

Expand All @@ -74,67 +79,89 @@ cleanup()

init()
{
src_file="$(readlink -f "${0}")"
src_dir="${src_file%%"${src_file##*'/'}"}"
initial_branch="$(git rev-parse --abbrev-ref HEAD)"
initial_commitish="$(git rev-parse HEAD)"

trap cleanup EXIT HUP INT QUIT ABRT ALRM TERM
}
if [ -n "$(git status --porcelain | grep -v '^?? .*')" ]; then
echo 'Git respository not in a clean state, will not continue.'
exit 1
fi

do_source_target()
{
_target_dir="${1:?Missing argument to function}"
_op="${2:?Missing argument to function}"
if [ -n "${src_dir##*'/scripts/'}" ]; then
echo "This script '${src_file}' is not in the scripts subdirectory, this is unexpected, cannot continue."
exit 1
fi

source_version="${source_version#v}"
target_version="${target_version#v}"

trap cleanup EXIT HUP INT QUIT ABRT ALRM TERM
}

bump_kernel()
{
platform_name="${platform_name##*'/'}"

if [ -z "${platform_name:-}" ]; then
platform_name="${PWD##*'/'}"
if [ -z "${platform_name}" ] || \
[ -d "${PWD}/image" ]; then
platform_name="${PWD}"
fi
platform_name="${platform_name##*'/'}"

if [ "${PWD##*'/'}" = "${platform_name}" ]; then
_target_dir='./'
else
_target_dir="target/linux/${platform_name}"
fi
_target_dir="${src_dir}/../target/linux/${platform_name}"

if [ ! -d "${_target_dir}/image" ]; then
e_err 'Cannot find target linux directory.'
e_err "Cannot find target linux directory '${_target_dir:-not defined}'. Not in a platform directory, or -p not set."
exit 1
fi

git switch --force-create '__openwrt_kernel_files_mover'

for _path in "${_target_dir}/"*; do
if [ ! -s "${_path}" ] || \
[ "${_path}" = "${_path%%"-${source_version}"}" ]; then
if [ "${config_only:-false}" != 'true' ]; then
for _path in $(git ls-tree -d -r --name-only '__openwrt_kernel_files_mover' "${_target_dir}" |
sed -n "s|^\(.*-${source_version}\).*|\1|p" |
sort -u); do
if [ ! -e "${_path}" ] || \
[ "${_path}" = "${_path%%"-${source_version}"}" ]; then
continue
Copy link
Contributor

@namiltd namiltd Mar 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This testing doesn't work for Windows systems (TartoiseGIT - GIT Bash here).
For Windows, folders always have size 0.
Is it possible to check if the system is Windows by checking if the MINGW_CHOST constant is set.
You can also check: uname -s
MINGW64_NT-10.0-19045

fi

_target_path="${_path%%"-${source_version}"}-${target_version}"
if [ -e "${_target_path}" ]; then
e_err "Target '${_target_path}' already exists!"
exit 1
fi

git mv \
"${_path}" \
"${_target_path}"
done
fi

for _config in $(git ls-files "${_target_dir}" |
sed -n "s|^\(.*config-${source_version}\).*|\1|p" |
sort -u); do
if [ ! -e "${_config}" ]; then
continue
fi

_target_path="${_path%%"-${source_version}"}-${target_version}"
if [ -s "${_target_path}" ]; then
e_err "Target '${_target_path}' already exists!"
exit 1
_subtarget="${_config%%"/config-${source_version}"}"
if [ -n "${subtarget_names:-}" ]; then
echo "${subtarget_names:-}" | while IFS=',' read -r _subtarget_name; do
if [ "${_subtarget_name}" = "${_subtarget##*'/'}" ]; then
git mv "${_config}" "${_subtarget}/config-${target_version}"
fi
done
else
git mv "${_config}" "${_subtarget}/config-${target_version}"
fi

git mv \
"${_path}" \
"${_target_path}"
done

find "${_target_dir}" -iname "config-${source_version}" | while read -r _config; do
_path="${_config%%"/config-${source_version}"}"
git mv "${_config}" "${_path}/config-${target_version}"
done

git commit \
--signoff \
--message "kernel/${platform_name}: Create kernel files for v${target_version} (from v${source_version})" \
--message 'This is an automatically generated commit.' \
--message 'During a `git bisect` session, `git bisect --skip` is recommended.'
--message 'When doing `git bisect`, consider `git bisect --skip`.'

git checkout 'HEAD~' "${_target_dir}"
git commit \
Expand All @@ -144,6 +171,8 @@ bump_kernel()
git switch "${initial_branch:?Unable to switch back to original branch. Quitting.}"
GIT_EDITOR=true git merge --no-ff '__openwrt_kernel_files_mover'
git branch --delete '__openwrt_kernel_files_mover'
echo "Deleting merge commit ($(git rev-parse HEAD))."
git rebase HEAD~1

echo "Original commitish was '${initial_commitish}'."
echo 'Kernel bump complete. Remember to use `git log --follow`.'
Expand Down Expand Up @@ -177,20 +206,26 @@ check_requirements()

main()
{
while getopts 'hp:s:t:' _options; do
while getopts 'chp:r:s:t:' _options; do
case "${_options}" in
'c')
config_only='true'
;;
'h')
usage
exit 0
;;
'p')
platform_name="${OPTARG}"
;;
'r')
subtarget_names="${OPTARG}"
;;
's')
source_version="${OPTARG#v}"
source_version="${OPTARG}"
;;
't')
target_version="${OPTARG#v}"
target_version="${OPTARG}"
;;
':')
e_err "Option -${OPTARG} requires an argument."
Expand All @@ -205,11 +240,14 @@ main()
shift "$((OPTIND - 1))"

platform_name="${platform_name:-${PLATFORM_NAME:-}}"
subtarget_names="${subtarget_names:-${SUBTARGET_NAMES:-}}"
source_version="${source_version:-${SOURCE_VERSION:-}}"
target_version="${target_version:-${TARGET_VERSION:-}}"

if [ -z "${source_version:-}" ] || [ -z "${target_version:-}" ]; then
e_err "Source (${source_version}) and target (${target_version}) versions need to be defined."
e_err "Source (${source_version:-missing source version}) and target (${target_version:-missing target version}) versions need to be defined."
echo
usage
exit 1
fi

Expand Down