xfs
[Top] [All Lists]

Script to cross-apply libxfs changes

To: xfs-oss <xfs@xxxxxxxxxxx>
Subject: Script to cross-apply libxfs changes
From: Eric Sandeen <sandeen@xxxxxxxxxx>
Date: Fri, 15 May 2015 13:01:07 -0500
Delivered-to: xfs@xxxxxxxxxxx
I'm terrible at bash, so don't laugh.  But this more or less works for me ...

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.

[root@bp-05 xfsprogs]# git log
commit 9681b791929795cd7dc6c7a79c3a69354f34e0b0
...
[root@bp-05 xfsprogs]# 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
[root@bp-05 xfsprogs]#

==========

#!/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

<Prev in Thread] Current Thread [Next in Thread>
  • Script to cross-apply libxfs changes, Eric Sandeen <=