Browse Source

scripts: Review patch_git.sh and update-patches-git

Fix git-backed package patching and patch updating scripts:

* patch_git.sh was entirely broken (since forever?!) due to a missing
  'cd' call
* update-patches-git formatted the marker commit as patch instead of
  ignoring it

The major improvement of this review is the elimination of the mandatory
final marker commit. Putting it before the series being applied works
well and allows to add a patch to the series without demanding a
git-rebase call to get the marker back on top.

While being at it:

* Call 'git am --abort' only if there was a git repo already
* Call git-commit and git-format-patch with extra options to avoid
  side-effects from a user's .gitconfig
* Explicitly specify output format in git-log to avoid surprises, also
  split output properly with 'read'
* Eliminate fake_hdr variable

Signed-off-by: Phil Sutter <phil@nwl.cc>
Phil Sutter 3 years ago
parent
commit
20c8ea7097
2 changed files with 26 additions and 33 deletions
  1. 17 15
      scripts/patch_git.sh
  2. 9 18
      scripts/update-patches-git

+ 17 - 15
scripts/patch_git.sh

@@ -3,7 +3,7 @@
 # Patch sources using git-am, aligning things to use git-format-patch for
 # update-patches.
 #
-# (c) 2016 Phil Sutter <phil@nwl.cc>
+# (c) 2021 Phil Sutter <phil@nwl.cc>
 #
 # Based on the classic patch.sh, written by:
 #
@@ -36,14 +36,11 @@ if [ ! -d .git ]; then
     find . -name .gitignore -delete
     git init
     git add .
-    git commit -a --allow-empty \
-	    --author="OpenADK <wbx@openadk.org>" \
-	    -m "OpenADK patch marker: 0000"
+elif [ -e .git/rebase-apply ]; then
+    git am --abort
 fi
-[ -e .git/rebase-apply ] && \
-	git am --abort
 
-i=1
+i=0
 patch_tmp=$(printf ".git/patch_tmp/%04d" $i)
 while [ -d $patch_tmp ]; do
 	let "i++"
@@ -52,6 +49,10 @@ done
 mkdir -p $patch_tmp
 patch_series=$(printf "%04d" $i)
 
+git commit --allow-empty --no-signoff --no-gpg-sign \
+    --author="OpenADK <wbx@openadk.org>" \
+    -m "OpenADK patch marker: $patch_series"
+
 cd $wd
 cd $patchdir
 for i in $(eval echo ${patchpattern}); do
@@ -74,12 +75,15 @@ for i in $(eval echo ${patchpattern}); do
     esac
     [ -d "${i}" ] && echo "Ignoring subdirectory ${i}" && continue
     echo "$(basename $i)" >>${targetdir}/${patch_tmp}/__patchfiles__
-    fake_hdr=""
     patchname="$(basename -s .gz -s .bz -s .bz2 -s .zip -s .Z -s .patch $i)"
-    if ! grep -q '^Subject: ' ${i}; then
-	fake_hdr="From: OpenADK <wbx@openadk.org>\nSubject: [PATCH] ${patchname#[0-9]*-}\n\n"
-    fi
-    { echo -en $fake_hdr; ${uncomp} ${i}; } >${targetdir}/${patch_tmp}/${patchname}.patch
+    {
+        if ! grep -q '^Subject: ' ${i}; then
+            echo "From: OpenADK <wbx@openadk.org>"
+            echo "Subject: [PATCH] ${patchname#[0-9]*-}"
+            echo ""
+        fi
+        ${uncomp} ${i}
+    } >${targetdir}/${patch_tmp}/${patchname}.patch
     cd $patchdir
 done
 
@@ -93,6 +97,7 @@ done
 # XXX: this is unsafe and should be dropped at some point
 am_opts="-C1"
 
+cd ${wd}
 realpath $patchdir >${targetdir}/${patch_tmp}/__patchdir__
 cd ${targetdir}
 git am $am_opts ${patch_tmp}/*.patch
@@ -100,6 +105,3 @@ if [ $? != 0 ] ; then
     echo "git-am failed! Please fix patches!"
     exit 1
 fi
-git commit -a --allow-empty \
-	--author="OpenADK <wbx@openadk.org>" \
-	-m "OpenADK patch marker: $patch_series"

+ 9 - 18
scripts/update-patches-git

@@ -3,29 +3,20 @@
 # Update patches using git-format-patch from a source tree prepared by
 # patch_git.sh.
 #
-# (c) 2016 Phil Sutter <phil@nwl.cc>
+# (c) 2021 Phil Sutter <phil@nwl.cc>
 
 wrkdist=$1
 wd=$(pwd)
 
 cd "$wrkdist"
-top=""
-top_series=""
-git log --grep="^OpenADK patch marker:" --oneline | while read hash subject; do
-	[ -n "$top" ] || {
-		top=$hash
-		top_series="${subject#OpenADK patch marker: }"
-		continue
-	}
-	bottom=$hash
-	bottom_series="${subject#OpenADK patch marker: }"
-
-	patchdir=$(<.git/patch_tmp/${top_series}/__patchdir__)
+top="HEAD"
+git log --grep='^OpenADK patch marker:' --format='%H %s'$logopt | \
+		while read hash o p m series; do
+	patchdir=$(<.git/patch_tmp/${series}/__patchdir__)
 	while read patchfile; do
 		rm ${patchdir}/$patchfile
-	done < .git/patch_tmp/${top_series}/__patchfiles__
-	git format-patch -N -o "$patchdir" ${bottom}..${top}
-
-	top=$bottom
-	top_series=$bottom_series
+	done < .git/patch_tmp/${series}/__patchfiles__
+	git format-patch --no-numbered --no-signoff --no-cover-letter \
+		--no-signature -o "$patchdir" ${hash}..${top}
+	top=${hash}^
 done