]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
tools: libxfs kernel sync script
authorEric Sandeen <sandeen@redhat.com>
Thu, 30 Jul 2015 23:05:58 +0000 (09:05 +1000)
committerDave Chinner <david@fromorbit.com>
Thu, 30 Jul 2015 23:05:58 +0000 (09:05 +1000)
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 <sandeen@redhat.com>
Signed-off-by: Dave Chinner <dchinner@redhat.com>
tools/libxfs-apply [new file with mode: 0755]

diff --git a/tools/libxfs-apply b/tools/libxfs-apply
new file mode 100755 (executable)
index 0000000..9f79f8a
--- /dev/null
@@ -0,0 +1,114 @@
+#!/bin/bash
+
+# 2 args:
+#      libxfs-apply <repo> <commit ID or patchfile>
+
+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