script to create broken out patch series from stable RT trees

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Steve,

I finally got around to automating my manual process of creating
a broken out set of patch files for the stable RT releases.

I'm attaching the scripts in case others might find them helpful.

-Frank
#! /bin/bash

# creating a broken out RT patch set


#-----  process script arguments

def_root_patch_path="../patches"
root_patch_path="${def_root_patch_path}"

def_tar_path="../tar"
tar_path="${def_tar_path}"

verbose=0

old_argc=0
while [[ ($# != ${old_argc}) && ($# > 0) ]] ; do
	old_argc=$#
	case $1 in
		-h | -help | --help )
			shift $# ;;
		--pp )
			root_patch_path=$2
			shift 2;;
		--tp )
			tar_path=$2
			shift 2;;
		-v | --verbose )
			verbose=1
			shift ;;
	esac
done

if (( ($# < 1) || ($# > 1) )) ; then
	echo ""                                                                   >&2
	echo "usage: `basename $0` RT_KERNEL_VERSION"                             >&2
	echo "            -h                    print this usage text"            >&2
	echo "            -help                 synonym for -h"                   >&2
	echo "           --help                 synonym for -h"                   >&2
	echo "           --pp ROOT_PATCH_PATH   path to create patch dir at"      >&2
	echo "           --tp TAR_PATH          path to create tar at"            >&2
	echo "            -v                    verbose output"                   >&2
	echo "            -verbose              synonym for -v"                   >&2
	echo "           --verbose              synonym for -v"                   >&2
	echo ""                                                                   >&2
	echo "           default ROOT_PATCH_PATH is ${def_root_patch_path}"       >&2
	echo "           default TAR_PATH is ${def_tar_path}"                     >&2
	echo ""                                                                   >&2
	echo "   examples:"                                                       >&2
	echo "       3.0.12-rt29:    `basename $0` 3.0.12-rt29"                   >&2
	echo "       3.0.32-rt52:    `basename $0` 3.0.32-rt52"                   >&2
	echo ""                                                                   >&2
	echo ""                                                                   >&2

	echo "If you do not have a local copy of the stable RT git tree, clone it"           >&2
	echo ""                                                                              >&2
	echo "  If firewall prevents using the git protocol:"                                >&2
	echo "    git clone \\"                                                              >&2
	echo "      https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git";  >&2
	echo ""                                                                              >&2
	echo "  If no firewall in the way:"                                                  >&2
	echo "    git clone \\"                                                              >&2
	echo "      git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git"    >&2

	echo ""                                                                   >&2
	exit 1
fi


# regex can handle x.x-rtx or x.x.x-rtx
# \1 is x.x
# \2 is    .x
# \3 is      -rtx

base_version=`echo $1 | sed -r -e 's|([0-9]+\.[0-9]+)(\.[0-9]+)*(-rt.*)|\1\2|'`
rt_version=`  echo $1 | sed -r -e 's|([0-9]+\.[0-9]+)(\.[0-9]+)*(-rt.*)|\3|'`

full_version=${base_version}${rt_version}

patch_dir="patches_${full_version}"
patch_path=${root_patch_path}/${patch_dir}


#-----  error checks

expected_cur_dir="linux-stable-rt"
cur_dir=`basename $PWD`
if [[ "${cur_dir}" != "${expected_cur_dir}" || ! -d .git ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  Current directory does not appear to be the stable RT git tree"   >&2
	echo "  Expect current directory to be: ${expected_cur_dir}"              >&2
	echo "  Expect current directory to contain directory: .git"              >&2
	echo ""                                                                   >&2
	exit 1
fi


if [[ ! -d ${root_patch_path} ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  Root patch directory ${root_patch_path} does not exist"           >&2
	echo ""                                                                   >&2
	exit 1
fi


if [[ ! -d ${tar_path} ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  Tar directory ${tar_path} does not exist"                         >&2
	echo ""                                                                   >&2
	exit 1
fi


if [[ -d ${patch_path} ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  patch directory ${patch_path} already exists"                     >&2
	echo ""                                                                   >&2
	exit 1
fi


cur_branch=`git branch | grep master`
if [[ "${cur_branch}" != '* master' ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  current branch is not master"                                     >&2
	echo "  Consider fixing by: 'git checkout master'"                        >&2
	echo ""                                                                   >&2
	exit 1
fi


tag_full='git tag -l v${full_version}-rebase'
tag_base='git tag -l v${base_version}'

if [[ "${tag_full}" == "" || "${tag_base}" == "" ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  Required git tags are missing"                                    >&2
	echo "  The required tags are:"                                           >&2
	echo "    ${tag_full}"                                                    >&2
	echo "    ${tag_base}"                                                    >&2
	echo ""                                                                   >&2
	echo "  'git pull' _might_ fix the problem"                               >&2
	echo ""                                                                   >&2
	echo "  This may also be an error in the master git repository"           >&2
	echo ""                                                                   >&2
	echo "  If 'git pull' does not fix the problem, deleting the repository'" >&2
	echo "  and re-cloning it _might_ fix the problem"                        >&2
	echo ""                                                                   >&2
	exit 1
fi


if [[ "${verbose}" == "1" ]] ; then
	echo ""                                                                   >&2
	echo "-----  versions:"                                                   >&2
	echo ""                                                                   >&2
	echo "  base_version  : ${base_version}"                                  >&2
	echo "  full_version  : ${full_version}"                                  >&2
	echo ""                                                                   >&2
	echo ""                                                                   >&2
	echo "-----  should see two tags: v${full_version}-rebase, v${base_version}" >&2
	echo ""                                                                   >&2
	echo -n "  "                                                              >&2
	  git tag -l v${full_version}-rebase                                      >&2
	echo -n "  "                                                              >&2
	  git tag -l v${base_version}                                             >&2
	echo ""                                                                   >&2
	echo ""                                                                   >&2
	echo "-----  other:"                                                      >&2
	echo ""                                                                   >&2
	echo "  patch_path    : ${patch_path}"                                    >&2
	echo ""                                                                   >&2
fi


#-----  checkout the rebase branch

# after checkout, will be on '* (no branch)'

if [[ "${verbose}" == "1" ]] ; then
	echo ""                                                                   >&2
	git branch                                                                >&2
	echo ""                                                                   >&2
fi

git checkout v${full_version}-rebase  > /dev/null 2> /dev/null

if [[ "$?" == "1" ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  Unable to checkout rebase branch"                                 >&2
	echo ""                                                                   >&2
	exit 1
fi

if [[ "${verbose}" == "1" ]] ; then
	echo ""                                                                   >&2
	git branch                                                                >&2
	echo ""                                                                   >&2
fi

cur_branch=`git branch | head -n1`
if [[ "${cur_branch}" != '* (no branch)' ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  checkout of branch v${full_version}-rebase failed"                >&2
	echo ""                                                                   >&2
fi



#-----  create the patch files in the patch directory

if [[ "${verbose}" == "1" ]] ; then
	echo ""                                                                   >&2
	echo "creating patch files in ${patch_path}"                              >&2
	echo ""                                                                   >&2
fi

git format-patch -o ${patch_path} v${base_version}  >/dev/null

if [[ "$?" == "1" ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  Failed command:"                                                  >&2
	echo "    git format-patch -o ${patch_path} v${base_version}"             >&2
	echo ""                                                                   >&2
	exit 1
fi


#====================
cd ${patch_path}
#====================

#-----  create the series file, rename patch file names

# being careful, check for unexpected series file, before creating it

if [[ -a series ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  Unexpected file or directory 'series' in ${patch_path}"           >&2
	echo ""                                                                   >&2
	exit 1
fi

# Create the series file.  Rename the patches to remove the numeric prefix
# in the file name so that the names of patch files will be consistent in
# different patch versions.

files_new=`mktemp`
files_old=`mktemp`
mv_files=`mktemp`

ls -1                 > ${files_old}
sed -e 's|^[0-9]*-||'   ${files_old} >${files_new}

paste -d" " ${files_old} ${files_new} | sed -e 's|^|mv |' > ${mv_files}

mv ${files_new} series

. ${mv_files}

# renamed to be series, do not need to remove
# rm ${files_new}

rm ${files_old}
rm ${mv_files}


#====================
cd -    >/dev/null
#====================


#-----  create the patch tar

tar_file_name="${tar_path}/patches-${full_version}.tar.bz2"

if [[ "${verbose}" == "1" ]] ; then
	echo ""                                                                   >&2
	echo "creating ${tar_file_name}"                                          >&2
	echo ""                                                                   >&2
fi

tar \
	-cjf ${tar_file_name} \
	--transform s/patches_${full_version}/patches/ \
	-C ${root_patch_path} \
	${patch_dir}


#-----  move back to the master branch in the git tree

if [[ "${verbose}" == "1" ]] ; then
	echo ""                                                                   >&2
	git branch                                                                >&2
	echo ""                                                                   >&2
fi

git checkout master  > /dev/null 2> /dev/null

if [[ "$?" == "1" ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  Unable to checkout master branch"                                 >&2
	echo ""                                                                   >&2
	exit 1
fi

if [[ "${verbose}" == "1" ]] ; then
	echo ""                                                                   >&2
	git branch                                                                >&2
	echo ""                                                                   >&2
fi


#===============================================================================
#_______________________________________________________________________________
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#* _________________________________________________________________________ */
#* vi config follows: */

#* ~/.exrc must contain "set modelines" for tabs to be set automatically */
#* ex:set tabstop=3 shiftwidth=3 sts=3: */ 
#! /bin/bash

# creating a broken out RT patch set


#-----  process script arguments

diff_patches=0
diff_series=0
save_diff=0
verbose=0

old_argc=0
while [[ ($# != ${old_argc}) && ($# > 0) ]] ; do
	old_argc=$#
	case $1 in
		-h | -help | --help )
			shift $# ;;
		--patches )
			diff_patches=1
			shift 1;;
		--sd )
			save_diff=1
			diff_file=$2
			shift 2;;
		--series )
			diff_series=1
			shift 1;;
		-v | --verbose )
			verbose=1
			shift ;;
	esac
done

if (( ($# < 1) || ($# > 2) )) ; then
	echo ""                                                                   >&2
	echo "usage: `basename $0` OLD_RT_KERNEL_VERSION NEW_RT_KERNEL_VERSION"   >&2
	echo "            -h         print this usage text"                       >&2
	echo "            -help      synonym for -h"                              >&2
	echo "           --help      synonym for -h"                              >&2
	echo "           --sd FILE   save diff file as FILE"                      >&2
	echo "            -v         verbose output"                              >&2
	echo "            -verbose   synonym for -v"                              >&2
	echo "           --verbose   synonym for -v"                              >&2
	echo ""                                                                   >&2
	echo "   examples:"                                                       >&2
	echo "       compare 3.0.12-rt29 to 3.0.32-rt52"                          >&2
	echo "          `basename $0` 3.0.12-rt29 3.0.32-rt52"                    >&2
	echo ""                                                                   >&2
	echo "   notes:"                                                          >&2
	echo ""                                                                   >&2
	echo "     --patches does not show changes to the series file,"           >&2
	echo "               contents of deleted patches, and contents"           >&2
	echo "               of added patches"                                    >&2
	echo ""                                                                   >&2
	exit 1
fi



# Choose the versions to be compared

#old_rt_version=3.0.12-rt29
#new_rt_version=3.0.23-rt38


old_rt_version=$1
old_patch_dir=patches_${old_rt_version}

new_rt_version=$2
new_patch_dir=patches_${new_rt_version}


#-----  error checks

if [[ ! -d ${old_patch_dir} ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  Root patch directory ${old_patch_dir} does not exist"             >&2
	echo ""                                                                   >&2
	exit 1
fi


if [[ ! -d ${new_patch_dir} ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  Root patch directory ${new_patch_dir} does not exist"             >&2
	echo ""                                                                   >&2
	exit 1
fi

if [[ "${diff_patches}" == "0" && "${diff_series}" == "0" ]] ; then
	echo ""                                                                   >&2
	echo "ERROR:"                                                             >&2
	echo "  no type of diff specified"                                        >&2
	echo ""                                                                   >&2
	exit 1
fi


#-----  patches added or deleted

# two different ways to see the same info, comment out the second way

if [[ "${diff_series}" == "1" ]] ; then

	echo

	diff -u {${old_patch_dir},${new_patch_dir}}/series \
		| grep -v "^--- " \
		| grep -v "^\+\+\+ " \
		| grep "^[-]" \
		| sort

	echo

	diff -u {${old_patch_dir},${new_patch_dir}}/series \
		| grep -v "^--- " \
		| grep -v "^\+\+\+ " \
		| grep "^[+]" \
		| sort

#	echo
#	echo
#
#	cat ${diff_file} | grep "^Only in ${old_patch_dir}" | sort
#
#	echo
#
#	cat ${diff_file} | grep "^Only in ${new_patch_dir}" | sort

	echo

fi


#-----  Changes to patch files

if [[ "${diff_patches}" == "1" ]] ; then

	if [[ "${save_diff}" == "1" ]] ; then

		if [[ "${diff_file}" == "" ]] ; then
			echo ""                                                             >&2
			echo "ERROR:"                                                       >&2
			echo "  -sd FILE name is blank"                                     >&2
			echo ""                                                             >&2
			exit 1
		fi

		if [[ -a ${diff_file} ]] ; then
			echo ""                                                             >&2
			echo "ERROR:"                                                       >&2
			echo "  ${diff_file} already exists"                                >&2
			echo ""                                                             >&2
			exit 1
		fi

	else
		diff_file=`mktemp`
	fi

	diff -x series -ru ${old_patch_dir}/ ${new_patch_dir}/ > ${diff_file}


	# (the files which are listed, but contain no # + or - lines are due to
	# changed commit IDs and Subject lines from rebasing)
	#
	# Changes that are "^[+-][+-]" are changes to the patch.
	#
	# Changes that are "^[+-] "    are changes of context.

	cat ${diff_file} \
		| grep -v "^[+-]From " \
		| grep -v "^[+-]Subject: "  \
		| grep -v "^--- ${old_patch_dir}" \
		| grep -v "^+++ ${new_patch_dir}" \
		| grep -E "(^diff |^[+-])" \
		| grep -v  "^[+-]index " \
		| grep -v  "^[+-]@@ "


	#-----  clean up

	if [[ "${save_diff}" == "0" ]] ; then
		rm ${diff_file}
	fi

fi

#===============================================================================
#_______________________________________________________________________________
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#* _________________________________________________________________________ */
#* vi config follows: */

#* ~/.exrc must contain "set modelines" for tabs to be set automatically */
#* ex:set tabstop=3 shiftwidth=3 sts=3: */ 

[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux