Add scripts/backport-support.sh

Message ID 20170209153540.BEC974025DBF6@oldenburg.str.redhat.com
State Committed
Headers

Commit Message

Florian Weimer Feb. 9, 2017, 3:35 p.m. UTC
  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.
  

Comments

Adhemerval Zanella Netto Feb. 9, 2017, 10:35 p.m. UTC | #1
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
>
  
Florian Weimer Feb. 10, 2017, 10:03 a.m. UTC | #2
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 Feb. 20, 2017, 1:13 p.m. UTC | #3
* 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.
  
Carlos O'Donell Feb. 20, 2017, 1:41 p.m. UTC | #4
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.
  
Adhemerval Zanella Netto Feb. 20, 2017, 1:51 p.m. UTC | #5
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.
  
Mike Frysinger March 17, 2017, 4:50 a.m. UTC | #6
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
  

Patch

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