| #!/bin/sh |
| # SPDX-License-Identifier: GPL-2.0+ |
| # |
| # Copyright (c) 2024 Linaro Limited |
| # |
| # Usage: from the top level U-Boot source tree, run: |
| # $ ./tools/update-subtree.sh pull <subtree-name> <release-tag> |
| # Or: |
| # $ ./tools/update-subtree.sh pick <subtree-name> <commit-id> |
| # |
| # The script will pull changes from subtree repo into U-Boot. |
| # It will automatically create a squash/merge commit listing the commits |
| # imported. |
| |
| set -e |
| |
| print_usage() { |
| echo "usage: $0 <op> <subtree-name> <ref>" |
| echo " <op> pull or pick" |
| echo " <subtree-name> mbedtls or dts or lwip" |
| echo " <ref> release tag [pull] or commit id [pick]" |
| } |
| |
| if [ $# -ne 3 ]; then |
| print_usage |
| exit 1 |
| fi |
| |
| op=$1 |
| subtree_name=$2 |
| ref=$3 |
| |
| set_params() { |
| case "$subtree_name" in |
| mbedtls) |
| path=lib/mbedtls/external/mbedtls |
| repo_url=https://github.com/Mbed-TLS/mbedtls.git |
| remote_name="mbedtls_upstream" |
| ;; |
| dts) |
| path=dts/upstream |
| repo_url=https://git.kernel.org/pub/scm/linux/kernel/git/devicetree/devicetree-rebasing.git |
| remote_name="devicetree-rebasing" |
| ;; |
| lwip) |
| path=lib/lwip/lwip |
| repo_url=https://git.savannah.gnu.org/git/lwip.git |
| remote_name="lwip_upstream" |
| ;; |
| *) |
| echo "Invalid subtree name: $subtree_name" |
| print_usage |
| exit 1 |
| esac |
| } |
| |
| set_params |
| |
| merge_commit_msg=$(cat << EOF |
| Subtree merge tag '$ref' of $subtree_name repo [1] into $path |
| |
| [1] $repo_url |
| EOF |
| ) |
| |
| remote_add_and_fetch() { |
| if [ -z "$(git remote get-url $remote_name 2>/dev/null)" ]; then |
| echo "Warning: Script automatically adds new git remote via:" |
| echo " git remote add $remote_name \\" |
| echo " $repo_url" |
| git remote add $remote_name $repo_url |
| fi |
| git fetch $remote_name master |
| } |
| |
| if [ "$op" = "pull" ]; then |
| remote_add_and_fetch |
| git subtree pull --prefix $path $remote_name "$ref" --squash -m "$merge_commit_msg" |
| elif [ "$op" = "pick" ]; then |
| remote_add_and_fetch |
| git cherry-pick -x --strategy=subtree -Xsubtree=$path/ "$ref" |
| else |
| print_usage |
| exit 1 |
| fi |