Message ID | 20170209153540.BEC974025DBF6@oldenburg.str.redhat.com |
---|---|
State | New |
Headers | show |
I do not have a strong opinion here, but this workflow in the patch is basically a simple git workflow. Do we really need backup this? Shouldn't we just add this kind of documentation on wiki? On 09/02/2017 13:35, Florian Weimer wrote: > This script is intended for maintaining the stable branches and > distribution backports. > > 2017-02-09 Florian Weimer <fweimer@redhat.com> > > * scripts/backport-support.sh (latest_commit): New file. > > diff --git a/scripts/backport-support.sh b/scripts/backport-support.sh > new file mode 100644 > index 0000000..2ece7ce > --- /dev/null > +++ b/scripts/backport-support.sh > @@ -0,0 +1,110 @@ > +#!/bin/bash > +# Create a patch which backports the support/ subdirectory. > +# Copyright (C) 2017 Free Software Foundation, Inc. > +# This file is part of the GNU C Library. > + > +# The GNU C Library is free software; you can redistribute it and/or > +# modify it under the terms of the GNU Lesser General Public > +# License as published by the Free Software Foundation; either > +# version 2.1 of the License, or (at your option) any later version. > + > +# The GNU C Library is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > +# Lesser General Public License for more details. > + > +# You should have received a copy of the GNU Lesser General Public > +# License along with the GNU C Library; if not, see > +# <http://www.gnu.org/licenses/>. > + > +# This script does not backport the Makefile tweaks outside the > +# support/ directory (which need to be backported separately), or the > +# changes to test-skeleton.c (which should not be backported). > + > +set -e > + > +export LC_ALL=C > +export GIT_CONFIG=/dev/null > +export GTT_CONFIG_NOSYSTEM=0 > +export GIT_PAGER= > + > +usage () { > + cat >&2 <<EOF > +usage: $0 {patch|commit} > +EOF > + exit 1 > +} > + > +if test $# -ne 1 ; then > + usage > +fi > + > +command="$1" > + > +case "$command" in > + patch|commit) > + ;; > + *) > + usage > + ;; > +esac > + > +# The upstream branch to work on. > +branch=origin/master > + > +# The commit which added the support/ directory. > +initial_commit=c23de0aacbeaa7a091609b35764bed931475a16d > + > +# We backport the support directory and this script. Directories need > +# to end in a /. > +patch_targets="support/ scripts/backport-support.sh" > + > +latest_commit="$(git log --max-count=1 --pretty=format:%H "$branch" -- \ > + $patch_targets)" > + > +# Simplify the branch name somewhat for reporting. > +branch_name="$(echo "$branch" | sed s,^origin/,,)" > + > +command_patch () { > + cat <<EOF > +This patch creates the contents of the support/ directory up to this > +upstream commit on the $branch_name branch: > + > +EOF > + git log --max-count=1 "$latest_commit" > + echo > + git diff "$initial_commit"^.."$latest_commit" $patch_targets > + echo "# Before applying the patch, run this command:" >&2 > + echo "# rm -rf $patch_targets" >&2 > +} > + > +command_commit () { > + git status --porcelain | while read line ; do > + echo "error: working copy is not clean, cannot commit" >&2 > + exit 1 > + done > + for path in $patch_targets; do > + echo "# Processing $path" >&2 > + case "$path" in > + [a-zA-Z0-9]*/) > + # Directory. > + git rm --cached --ignore-unmatch -r "$path" > + rm -rf "$path" > + git read-tree --prefix="$path" "$latest_commit":"$path" > + git checkout "$path" > + ;; > + *) > + # File. > + git show "$latest_commit":"$path" > "$path" > + git add "$path" > + esac > + done > + git commit -m "Synchronize support/ infrastructure with $branch_name > + > +This commit updates the support/ subdirectory to > +commit $latest_commit > +on the $branch_name branch. > +" > +} > + > +command_$command >
On 02/09/2017 11:35 PM, Adhemerval Zanella wrote: > I do not have a strong opinion here, but this workflow in the patch is > basically a simple git workflow. Do we really need backup this? Shouldn't > we just add this kind of documentation on wiki? I think having this in a script ensures that the backports are consistent. We also may have to blacklist backporting certain wrappers which use functionality which is not available on older branches. Thanks, Florian
* Florian Weimer: > On 02/09/2017 11:35 PM, Adhemerval Zanella wrote: >> I do not have a strong opinion here, but this workflow in the patch is >> basically a simple git workflow. Do we really need backup this? Shouldn't >> we just add this kind of documentation on wiki? > > I think having this in a script ensures that the backports are consistent. > > We also may have to blacklist backporting certain wrappers which use > functionality which is not available on older branches. Any further comments? Thanks.
On 02/10/2017 05:03 AM, Florian Weimer wrote: > On 02/09/2017 11:35 PM, Adhemerval Zanella wrote: >> I do not have a strong opinion here, but this workflow in the patch >> is basically a simple git workflow. Do we really need backup this? >> Shouldn't we just add this kind of documentation on wiki? > > I think having this in a script ensures that the backports are > consistent. I agree. I wish we had more scripts in the tree that helped all of the developers, providing example workflows and tooling to facilitate that. I don't think that saying "it's just basic git" is any reason not to have the scripts checked in. Just like Joseph's script 'build-many-glibcs.py' is just basic toolchain building workflow, it is still immensely valuable for building things. > We also may have to blacklist backporting certain wrappers which use > functionality which is not available on older branches. Agreed. I think it's a logical and positive step for maintainers to share scripts.
On 20/02/2017 10:13, Florian Weimer wrote: > * Florian Weimer: > >> On 02/09/2017 11:35 PM, Adhemerval Zanella wrote: >>> I do not have a strong opinion here, but this workflow in the patch is >>> basically a simple git workflow. Do we really need backup this? Shouldn't >>> we just add this kind of documentation on wiki? >> >> I think having this in a script ensures that the backports are consistent. >> >> We also may have to blacklist backporting certain wrappers which use >> functionality which is not available on older branches. > > Any further comments? Thanks. > It is not a blocker, but I still think this kind of script should be on an external wiki.
On 09 Feb 2017 16:35, Florian Weimer wrote: > +export LC_ALL=C why ? seems like it'll mishandle UTF8 ? > +usage () { we seem to be inconsistent, but i prefer no spaces before () ... > + cat >&2 <<EOF style is weird. what's with the 4 space indent ? we use two spaces normally. > +if test $# -ne 1 ; then `test` instead of `[` ? i think we normally omit the space before the ; > +case "$command" in > + patch|commit) > + ;; > + *) > + usage > + ;; > +esac now we mix tabs ? > +# Simplify the branch name somewhat for reporting. > +branch_name="$(echo "$branch" | sed s,^origin/,,)" branch_name=${branch#origin/} > + git status --porcelain | while read line ; do this creates a subshell. you really want: while read -d $'0' -r line; do ... done < <(git status --porcelain) should also have `local line` -mike
diff --git a/scripts/backport-support.sh b/scripts/backport-support.sh new file mode 100644 index 0000000..2ece7ce --- /dev/null +++ b/scripts/backport-support.sh @@ -0,0 +1,110 @@ +#!/bin/bash +# Create a patch which backports the support/ subdirectory. +# Copyright (C) 2017 Free Software Foundation, Inc. +# This file is part of the GNU C Library. + +# The GNU C Library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# The GNU C Library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, see +# <http://www.gnu.org/licenses/>. + +# This script does not backport the Makefile tweaks outside the +# support/ directory (which need to be backported separately), or the +# changes to test-skeleton.c (which should not be backported). + +set -e + +export LC_ALL=C +export GIT_CONFIG=/dev/null +export GTT_CONFIG_NOSYSTEM=0 +export GIT_PAGER= + +usage () { + cat >&2 <<EOF +usage: $0 {patch|commit} +EOF + exit 1 +} + +if test $# -ne 1 ; then + usage +fi + +command="$1" + +case "$command" in + patch|commit) + ;; + *) + usage + ;; +esac + +# The upstream branch to work on. +branch=origin/master + +# The commit which added the support/ directory. +initial_commit=c23de0aacbeaa7a091609b35764bed931475a16d + +# We backport the support directory and this script. Directories need +# to end in a /. +patch_targets="support/ scripts/backport-support.sh" + +latest_commit="$(git log --max-count=1 --pretty=format:%H "$branch" -- \ + $patch_targets)" + +# Simplify the branch name somewhat for reporting. +branch_name="$(echo "$branch" | sed s,^origin/,,)" + +command_patch () { + cat <<EOF +This patch creates the contents of the support/ directory up to this +upstream commit on the $branch_name branch: + +EOF + git log --max-count=1 "$latest_commit" + echo + git diff "$initial_commit"^.."$latest_commit" $patch_targets + echo "# Before applying the patch, run this command:" >&2 + echo "# rm -rf $patch_targets" >&2 +} + +command_commit () { + git status --porcelain | while read line ; do + echo "error: working copy is not clean, cannot commit" >&2 + exit 1 + done + for path in $patch_targets; do + echo "# Processing $path" >&2 + case "$path" in + [a-zA-Z0-9]*/) + # Directory. + git rm --cached --ignore-unmatch -r "$path" + rm -rf "$path" + git read-tree --prefix="$path" "$latest_commit":"$path" + git checkout "$path" + ;; + *) + # File. + git show "$latest_commit":"$path" > "$path" + git add "$path" + esac + done + git commit -m "Synchronize support/ infrastructure with $branch_name + +This commit updates the support/ subdirectory to +commit $latest_commit +on the $branch_name branch. +" +} + +command_$command