source: trunk/packages/xen-3.1/xen-3.1/xen/arch/ia64/tools/sparse-merge @ 34

Last change on this file since 34 was 34, checked in by hartmans, 17 years ago

Add xen and xen-common

  • Property svn:executable set to *
File size: 4.3 KB
Line 
1#!/bin/bash
2# Generate a patch for each of the ia64 files in the linux-2.6-xen-sparse tree
3
4# Path to mercurial tree of upstream Linux
5# WARNING: This will do an 'hg up -C' on the upstream Linux tree, you
6#          will lose data if there's anything there you care about.
7: ${LINUXPATH:=/tmp/linux-2.6}
8# Tag of current base upstream image for Xen files
9: ${OLDTAG:=v$(awk '/^LINUX_VER/{print $NF}' buildconfigs/mk.linux-2.6-xen)}
10# Tag of new upstream base to go to
11: ${NEWTAG:=v$(wget -O- -o/dev/null http://kernel.org/kdist/finger_banner \
12    | awk '/latest stable/{print $NF}')}
13# Restrict merge to specific arch (set to . for all)
14: ${ARCH:=ia64}
15
16SPARSEDIR=linux-2.6-xen-sparse
17WD=$PWD
18
19if [ ! -d $SPARSEDIR ]; then
20        echo "Can't find $SPARSEDIR directory."
21        exit
22fi
23
24# Check for modified files in the sparse tree before starting
25if hg st $SPARSEDIR | head | grep .; then
26    echo
27    echo "$SPARSEDIR contains modifications, please clean it up first"
28    exit
29fi
30
31# We want the linux upstream tree to be at the OLDTAG to get the OLDTAG-Xen diff.
32# Save current revision to restore when done
33cd $LINUXPATH || exit 1
34OLDCSET=$(hg parents | awk '/^changeset:/{print($2)}' | cut -f 1 -d :)
35for t in $OLDTAG $NEWTAG; do
36    [[ $t == *.* ]] || continue
37    if ! hg tags | cut -f1 -d' ' | grep -Fx $t; then
38        echo "Tag $t not found, ketching up"
39        if [[ $t == *-* ]]; then
40            # rc/pre/git versions start at the previous stable release
41            micro=${t%%-*}; micro=${micro##*.}
42            stable=${t%%-*}; stable=${stable%.*}.$((micro-1))
43            hg up -C $stable
44        else
45            hg up -C ${t%.*} || exit 1
46        fi
47        ketchup ${t#v} || exit 1
48        hg addremove
49        hg ci -m $t
50        hg tag -l $t
51    fi
52done
53hg up -C $OLDTAG || exit 1
54
55cd $WD
56for i in $(hg manifest | awk '{print($3)}' | grep $SPARSEDIR | grep "$ARCH"); do
57        cd $WD
58
59        FILENAME=$(basename $i)
60        DIRNAME=$(dirname $i)
61        DIFFPATH=$(echo $i | sed -e "s,^$SPARSEDIR,$LINUXPATH,")
62
63        if [ ! -d $DIRNAME ]; then
64                echo "Hmm, something bad happened parsing directory name: $i"
65                continue
66        fi
67
68        if [ ! -e $DIFFPATH ]; then
69                continue
70        fi
71
72        echo -n "$i ... "
73
74        cd $DIRNAME
75        XENDIR=$(pwd)
76
77        ORIGPATH=$(echo $i | sed -e "s/^$SPARSEDIR/./")
78        APATH=$(echo $i | sed -e "s/^$SPARSEDIR/a/")
79        BPATH=$(echo $i | sed -e "s/^$SPARSEDIR/b/")
80        cd $LINUXPATH
81        hg diff -r $OLDTAG -r $NEWTAG $ORIGPATH | \
82            sed -e "s,^--- $APATH,--- $FILENAME," \
83                -e "s,^+++ $BPATH,+++ $FILENAME," \
84            > $XENDIR/$FILENAME-$OLDTAG-$NEWTAG.diff
85        cd $XENDIR
86
87        # Do we have a diff file?  Did anything change?
88        if [ ! -s $FILENAME-$OLDTAG-$NEWTAG.diff ]; then
89                echo "SUCCESS (Upstream unchanged)"
90                continue
91        fi
92
93        if ! patch -f -i $FILENAME-$OLDTAG-$NEWTAG.diff > /dev/null 2>&1; then
94                # It failed, how badly?
95                if [ ! -e ${FILENAME}.rej ]; then
96                        echo "ERROR, Hmm, no .rej file, but diff failed, fix manually"
97                        continue
98                fi
99                TONEWREJ=$(wc -l ${FILENAME}.rej | \
100                           awk '{print($1)}')
101                hg st $FILENAME | grep -q . && hg revert $FILENAME
102                rm -f ${FILENAME}.rej ${FILENAME}.orig
103                diff -uN $DIFFPATH $FILENAME | \
104                    sed -e "s,^--- $DIFFPATH,--- $FILENAME," \
105                    > $FILENAME-$OLDTAG-Xen.diff
106
107                if [ ! -e $FILENAME-$OLDTAG-Xen.diff ]; then
108                        echo "ERROR, failed to create patch file"
109                        continue
110                fi
111
112                if ! patch -R -i $FILENAME-$OLDTAG-Xen.diff > /dev/null 2>&1; then
113                        echo "ERROR, reverting Xen changes failed"
114                        hg revert $FILENAME
115                        continue
116                fi
117
118                if ! patch -f -i $FILENAME-$OLDTAG-$NEWTAG.diff > /dev/null 2>&1; then
119                        echo "ERROR, new upstream patch failed on reverted file"
120                        hg revert $FILENAME
121                        continue
122                fi
123
124                if ! patch -f -i $FILENAME-$OLDTAG-Xen.diff > /dev/null 2>&1; then
125                        if [ ! -e ${FILENAME}.rej ]; then
126                                echo "ERROR, Hmm, no .rej file, but diff failed, fix manually"
127                                continue
128                        fi
129                        TOXENREJ=$(wc -l ${FILENAME}.rej | \
130                                   awk '{print($1)}')
131
132                        if  [ $TOXENREJ -gt $TONEWREJ ]; then
133                                hg revert $FILENAME
134                                rm -f ${FILENAME}.rej ${FILENAME}.orig
135                                patch -f -i $FILENAME-$OLDTAG-$NEWTAG.diff > /dev/null 2>&1
136                                echo "MANUAL MERGE REQUIRED (Upstream reject)"
137                        else
138                                echo "MANUAL MERGE REQUIRED (Xen reject)"
139                        fi
140
141                else
142                        rm -f ${FILENAME}.rej ${FILENAME}.orig
143                        echo "SUCCESS (Re-applied Xen patch)"
144                fi
145        else
146                        rm -f ${FILENAME}.rej ${FILENAME}.orig
147                        echo "SUCCESS (Upstream applied)"
148        fi
149done
150find $SPARSEDIR -name \*.diff -empty | xargs -r rm -f
151cd $LINUXPATH
152hg up -C $OLDCSET
Note: See TracBrowser for help on using the repository browser.