1#!/bin/bash 2# Create a patch which backports the support/ subdirectory. 3# Copyright (C) 2017-2022 Free Software Foundation, Inc. 4# This file is part of the GNU C Library. 5 6# The GNU C Library is free software; you can redistribute it and/or 7# modify it under the terms of the GNU Lesser General Public 8# License as published by the Free Software Foundation; either 9# version 2.1 of the License, or (at your option) any later version. 10 11# The GNU C Library is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14# Lesser General Public License for more details. 15 16# You should have received a copy of the GNU Lesser General Public 17# License along with the GNU C Library; if not, see 18# <https://www.gnu.org/licenses/>. 19 20# This script does not backport the Makefile tweaks outside the 21# support/ directory (which need to be backported separately), or the 22# changes to test-skeleton.c (which should not be backported). 23 24set -e 25 26export LC_ALL=C 27export GIT_CONFIG=/dev/null 28export GTT_CONFIG_NOSYSTEM=0 29export GIT_PAGER= 30 31usage () { 32 cat >&2 <<EOF 33usage: $0 {patch|commit} 34EOF 35 exit 1 36} 37 38if test $# -ne 1 ; then 39 usage 40fi 41 42command="$1" 43 44case "$command" in 45 patch|commit) 46 ;; 47 *) 48 usage 49 ;; 50esac 51 52# The upstream branch to work on. 53branch=origin/master 54 55# The commit which added the support/ directory. 56initial_commit=c23de0aacbeaa7a091609b35764bed931475a16d 57 58# We backport the support directory and this script. Directories need 59# to end in a /. 60patch_targets="support/ scripts/backport-support.sh" 61 62latest_commit="$(git log --max-count=1 --pretty=format:%H "$branch" -- \ 63 $patch_targets)" 64 65# Simplify the branch name somewhat for reporting. 66branch_name="$(echo "$branch" | sed s,^origin/,,)" 67 68command_patch () { 69 cat <<EOF 70This patch creates the contents of the support/ directory up to this 71upstream commit on the $branch_name branch: 72 73EOF 74 git log --max-count=1 "$latest_commit" 75 echo 76 git diff "$initial_commit"^.."$latest_commit" $patch_targets 77 echo "# Before applying the patch, run this command:" >&2 78 echo "# rm -rf $patch_targets" >&2 79} 80 81command_commit () { 82 git status --porcelain | while read line ; do 83 echo "error: working copy is not clean, cannot commit" >&2 84 exit 1 85 done 86 for path in $patch_targets; do 87 echo "# Processing $path" >&2 88 case "$path" in 89 [a-zA-Z0-9]*/) 90 # Directory. 91 git rm --cached --ignore-unmatch -r "$path" 92 rm -rf "$path" 93 git read-tree --prefix="$path" "$latest_commit":"$path" 94 git checkout "$path" 95 ;; 96 *) 97 # File. 98 git show "$latest_commit":"$path" > "$path" 99 git add "$path" 100 esac 101 done 102 git commit -m "Synchronize support/ infrastructure with $branch_name 103 104This commit updates the support/ subdirectory to 105commit $latest_commit 106on the $branch_name branch. 107" 108} 109 110command_$command 111