From: Eric Sandeen Date: Thu, 30 Jul 2015 23:05:58 +0000 (+1000) Subject: tools: libxfs kernel sync script X-Git-Tag: v4.2.0-rc1~3^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1f2d2b98bd116ba03493ed10c6e076c95a5401f8;p=thirdparty%2Fxfsprogs-dev.git tools: libxfs kernel sync script This script takes either a patch name or a commit ID in the current tree, and massages that change into a libxfs patch for the other tree; i.e. it applies a kernel libxfs patch to xfsprogs, or vice versa. It'll create a guilt patch if it looks like a guilt dir, or just smack it in with "patch" if not. It can surely be improved, but it's a start. Example below, and script at the end. Requires filterdiff. # git log commit 9681b791929795cd7dc6c7a79c3a69354f34e0b0 ... # libxfs-apply /mnt/test2/git/linux-xfs/ 9681b791929795cd7dc6c7a79c3a69354f34e0b0 Filtered patch for /mnt/test2/git/linux-xfs/ contains: a/fs/xfs/libxfs/xfs_alloc.c a/fs/xfs/libxfs/xfs_alloc_btree.c a/fs/xfs/libxfs/xfs_attr_leaf.c a/fs/xfs/libxfs/xfs_attr_remote.c a/fs/xfs/libxfs/xfs_bmap_btree.c a/fs/xfs/libxfs/xfs_btree.c a/fs/xfs/libxfs/xfs_da_btree.c a/fs/xfs/libxfs/xfs_dir2_block.c a/fs/xfs/libxfs/xfs_dir2_data.c a/fs/xfs/libxfs/xfs_dir2_leaf.c a/fs/xfs/libxfs/xfs_dir2_node.c a/fs/xfs/libxfs/xfs_dquot_buf.c a/fs/xfs/libxfs/xfs_format.h a/fs/xfs/libxfs/xfs_ialloc.c a/fs/xfs/libxfs/xfs_ialloc_btree.c a/fs/xfs/libxfs/xfs_inode_buf.c a/fs/xfs/libxfs/xfs_sb.c a/fs/xfs/libxfs/xfs_symlink_remote.c /mnt/test2/git/linux-xfs/ looks like a guilt directory. Top patch is: percpu-2 Create new Guilt patch? (Enter patch name or return to skip) new-uuid Applying patch..new-uuid Patch applied. Patch was applied in /mnt/test2/git/linux-xfs/; check for rejects, guilt push -f, etc # Signed-off-by: Eric Sandeen Signed-off-by: Dave Chinner --- diff --git a/tools/libxfs-apply b/tools/libxfs-apply new file mode 100755 index 000000000..9f79f8a2d --- /dev/null +++ b/tools/libxfs-apply @@ -0,0 +1,114 @@ +#!/bin/bash + +# 2 args: +# libxfs-apply + +usage() +{ + echo "libxfs-apply repodir [patchfile|commitid]" + exit +} + +cleanup() +{ + rm -f $PATCH $LIBXFS_FILES $NEWPATCH +} + +fail() +{ + cleanup + cd $ORIG_DIR + exit +} + +if [ "$#" -eq 2 -a -d "$1" -a -f "$2" ]; then + REPO=$1 + PATCH=$2 +elif [ "$#" -eq 2 -a -d "$1" ]; then + REPO=$1 + PATCH=`mktemp` + git show $2 > $PATCH || usage +else + usage +fi + + +ORIG_DIR=`pwd` +LIBXFS_FILES=`mktemp` +NEWPATCH=`mktemp` + +cd $REPO + +# Are we using guilt? This works even if no patch is applied. +guilt top &> /dev/null +if [ $? -eq 0 ]; then + GUILT=1 +else + GUILT=0 +fi + +# Filter the patch into the right format & files for the other tree + +if [ -d "fs/xfs/libxfs" ]; then # We are applying a progs patch to the kernel tree + lsdiff $PATCH | grep -q "a/libxfs/" + if [ $? -ne 0 ]; then + echo "Doesn't look like an xfsprogs patch with libxfs changes" + fail + fi + + # The files we will try to apply to + ls -1 fs/xfs/libxfs/*.[ch] | sed -e "s%.*/\(.*\)%*\1%" > $LIBXFS_FILES + + # Create the new patch + filterdiff \ + -I $LIBXFS_FILES \ + --strip=1 \ + --addoldprefix=a/fs/xfs/ \ + --addnewprefix=b/fs/xfs/ \ + $PATCH > $NEWPATCH + +elif [ -d "libxfs" -a -d "libxlog" ]; then # We are applying a kernel patch to the xfsprogs tree + lsdiff $PATCH | grep -q "a/fs/xfs/libxfs/" + if [ $? -ne 0 ]; then + echo "Doesn't look like a kernel patch with libxfs changes" + fail + fi + + # The files we will try to apply to + ls -1 libxfs/*.[ch] | sed -e "s%.*/\(.*\)%*\1%" > $LIBXFS_FILES + + # Create the new patch + filterdiff \ + -I $LIBXFS_FILES \ + --strip=3 \ + --addoldprefix=a/ \ + --addnewprefix=b/ \ + $PATCH > $NEWPATCH +else + echo "Sorry, I don't recognize repo $REPO" + fail +fi + +echo "Filtered patch for $REPO contains:" +lsdiff $NEWPATCH + + +# Ok, now apply with guilt or patch; either may fail and require a force +# and/or a manual reject fixup +if [ $GUILT -eq 1 ]; then + echo "$REPO looks like a guilt directory." + PATCHES=`guilt applied | wc -l` + if [ $PATCHES -gt 0 ]; then + echo -n "Top patch is: " + guilt top + fi + read -r -p "Create new Guilt patch? (Enter patch name or return to skip) " response + [ -z "$response" ] && guilt refresh; guilt import -P $response $NEWPATCH; guilt push +else + echo "Applying with patch utility:" + patch -p1 < $NEWPATCH +fi + +echo "Patch was applied in $REPO; check for rejects, guilt push -f, etc" + +cleanup