The patch series I have for the Linux kernel includes incremental patches
from upstream like

patch-2.6.33.1.bz2
patch-2.6.33.1-2.bz2

followed by a patch series for my board.
But ptxdist messes this up when applying the patch series with git.

This patch allows one to mark the base tag in the series with:
#tag:base --start-number 1

Other arbitrary tags can also be put in the series:
#tag:for-upstream --start-number 5

When using 'git ptx-patches' to regenerate the series, only the patches
between "#tag:base" and the next "#tag:*" or EOF in the series are
regenerated. All others in the series are left untouched. To use a
different tag than the default tag base, use -t tagname.

e.g.:
# generated by git-ptx-patches
patch-2.6.33.1.bz2
patch-2.6.33.1-2.bz2
patch-2.6.33.2-3.bz2
#tag:for-upstream --start-number 1
0001-for-upstream-1.patch
0002-for-upstream-2.patch
0003-for-upstream-3.patch
#tag:base --start-number 4
0004-foo.patch
0005-bar.batch
# 25a3096f40bc8d841c8bf3ec24dd101f  - git-ptx-patches magic

Any options included on a #tag:* line are passed to git format-patch when
generating the patches for that section.

Signed-off-by: Jon Ringle <[email protected]>
---
 scripts/git-ptx-patches                |   73 +++++++++++++++++++++++++++++---
 scripts/lib/ptxd_make_world_patchin.sh |   26 +++++++++++
 2 files changed, 93 insertions(+), 6 deletions(-)

diff --git a/scripts/git-ptx-patches b/scripts/git-ptx-patches
index c5eb405..396797c 100755
--- a/scripts/git-ptx-patches
+++ b/scripts/git-ptx-patches
@@ -18,6 +18,7 @@ if [ ! -L .ptxdist/series ]; then
 fi
 
 remove_old=no
+tag=base
 
 if grep -q "$PTX_PATCHES_HEADER" .ptxdist/series; then
        echo "Found series file generated by git-ptx-patches."
@@ -31,8 +32,57 @@ if grep -q "$PTX_PATCHES_HEADER" .ptxdist/series; then
        fi
 fi
 
+while getopts "ft:n:" opt; do
+       case "${opt}" in
+               f)
+                       remove_old="force"
+                       ;;
+               t)
+                       tag="${OPTARG}"
+                       range="${tag}"
+                       ;;
+       esac
+done
+shift $((${OPTIND} - 1))
+
 if [ "x$1" = "x--force-remove" ]; then
        remove_old="force"
+       shift
+fi
+
+tag2=$(grep "#tag:" .ptxdist/series | awk "/#tag:${tag}/{getline;print \$0}" | 
sed 's,#tag:,,' | cut -d' ' -f1)
+if [ "${tag}" != "${tag2}" ]; then
+    range="${tag}..${tag2}"
+else
+    range="${tag}"
+    tag2=""
+fi
+
+echo "$PTX_PATCHES_HEADER" > .ptxdist/series.0
+:> .ptxdist/series.1
+if grep -q "#tag:" .ptxdist/series; then
+       tagline=$(grep "#tag:${tag}" .ptxdist/series)
+       t=$(echo "${tagline}"|cut -d' ' -f1)
+       if [ "#tag:${tag}" == "${t}" ]; then
+               tagopt=$(echo "${tagline}"|cut -d' ' -f2-)
+               sed -e "/$PTX_PATCHES_HEADER/d" -n -e "0,/#tag:${tag}/p" 
.ptxdist/series >> .ptxdist/series.0
+               # Remove patches before #tag:${tag} so they don't get rm'd with 
remove_old=yes
+               sed -i --follow-symlinks "0,/#tag:${tag}/d" .ptxdist/series
+               if [ -n "${tag2}" ]; then
+                       sed -n -e "/#tag:${tag2}/,/git-ptx-patches magic/p" 
.ptxdist/series > .ptxdist/series.1
+                       sed -i "/git-ptx-patches magic/d" .ptxdist/series.1
+                       sed -i --follow-symlinks 
"/#tag:${tag2}/,/git-ptx-patches magic/d" .ptxdist/series
+               fi
+       else
+               echo "series contains #tag:* lines, but could not find 
#tag:${tag} line in series. Aborting."
+               exit 1
+       fi
+else
+       if [ "${tag}" != "base" ]; then
+               echo "When using series with no #tag:* lines, you must use base 
tag."
+               exit 1
+       fi
+       echo "#tag:${tag} --start-number 1" >> .ptxdist/series.0
 fi
 
 case "$remove_old" in
@@ -53,7 +103,13 @@ case "$remove_old" in
                                ".ptxdist/patches/") continue ;;
                                ".ptxdist/patches/series") continue ;;
                                ".ptxdist/patches/autogen.sh") continue ;;
-                               *) rm -rf "$file" ;;
+                               *)
+                                       if grep -q 
"${file##\.ptxdist/patches/}" .ptxdist/series.{0,1}; then
+                                               echo "Keep base patch ${file}"
+                                       else
+                                               rm -rf "$file"
+                                       fi
+                                       ;;
                        esac
                done
                ;;
@@ -63,8 +119,10 @@ if git format-patch -h 2>&1 | grep -q signature; then
        GIT_EXTRA_ARGS="--no-signature"
 fi
 
-echo "$PTX_PATCHES_HEADER" > .ptxdist/series
-git format-patch -N $GIT_EXTRA_ARGS -o .ptxdist/patches/ base | sed -e 
's,^.ptxdist/patches/,,' >> .ptxdist/series
+cat .ptxdist/series.0 > .ptxdist/series
+git format-patch -N $GIT_EXTRA_ARGS ${tagopt} -o .ptxdist/patches/ ${range} | 
sed -e 's,^.ptxdist/patches/,,' > .ptxdist/series.auto
+cat .ptxdist/series.auto >> .ptxdist/series
+cat .ptxdist/series.1 >> .ptxdist/series
 cat .ptxdist/series | _md5sum >> .ptxdist/series
 
 # The first line of the patch is 'From <some-git-hash> ...'
@@ -75,14 +133,17 @@ while read patch para; do
                "series"|"autogen.sh") continue ;;
                *) ;;
        esac
-       if grep -q "$patch" .ptxdist/series; then
+       if grep -q "$patch" .ptxdist/series.auto; then
                p=".ptxdist/patches/$patch"
                lines=$(cat "$p" | wc -l)
                lines=$[lines-1]
                tail -n$lines "$p" > ".$patch.ptx-patches"
                mv ".$patch.ptx-patches" "$p"
        else
-               echo "Old patch \"$patch\"!"
+               if grep -q "$patch" .ptxdist/series.{0,1}; then
+                       echo "Base patch \"$patch\"!"
+               else
+                       echo "Old patch \"$patch\"!"
+               fi
        fi
 done
-
diff --git a/scripts/lib/ptxd_make_world_patchin.sh 
b/scripts/lib/ptxd_make_world_patchin.sh
index bbb7490..b812f0f 100644
--- a/scripts/lib/ptxd_make_world_patchin.sh
+++ b/scripts/lib/ptxd_make_world_patchin.sh
@@ -112,6 +112,16 @@ ptxd_make_world_patchin_apply_git_compat()
        esac
 
        case "${patch}" in
+           "#tag:"*)
+               local tag="${patch##\#tag:}"
+               if [ -f ${pkg_patchin_dir}/.ptxdist/git-patches/series ]; then
+                   mv ${pkg_patchin_dir}/.ptxdist/git-patches/series{,.${tag}} 
&&
+                   touch ${pkg_patchin_dir}/.ptxdist/git-patches/series
+               else
+                   touch ${pkg_patchin_dir}/.ptxdist/git-patches/series.${tag}
+               fi
+               continue
+               ;;
            ""|"#"*) continue ;;        # skip empty lines and comments
            *.gz)  cat="zcat" ;;
            *.bz2) cat="bzcat" ;;
@@ -141,6 +151,22 @@ ptxd_make_world_patchin_apply_git()
     #
     ptxd_make_world_patchin_apply_git_compat || return
 
+    grep "\#tag:" "${pkg_patchin_dir}/.ptxdist/series" | while read tagline; do
+       local tag="${tagline##\#tag:}"
+       if [ -f "${pkg_patchin_dir}/.ptxdist/git-patches/series.${tag}" ]; then
+           mv ${pkg_patchin_dir}/.ptxdist/git-patches/series{,.1} || return
+           mv ${pkg_patchin_dir}/.ptxdist/git-patches/series{.${tag},} || 
return
+
+           git quiltimport \
+               --patches "${pkg_patchin_dir}/.ptxdist/git-patches" \
+               --author "unknown author <[email protected]>"
+           echo "tagging -> ${tag}"
+           git tag -f ${tag}
+           mv ${pkg_patchin_dir}/.ptxdist/git-patches/series{,.${tag}} || 
return
+           mv ${pkg_patchin_dir}/.ptxdist/git-patches/series{.1,} || return
+       fi
+    done
+
     git quiltimport \
        --patches "${pkg_patchin_dir}/.ptxdist/git-patches" \
        --author "unknown author <[email protected]>"
-- 
1.7.0.4


-- 
ptxdist mailing list
[email protected]

Reply via email to