[34] | 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 | |
---|
| 16 | SPARSEDIR=linux-2.6-xen-sparse |
---|
| 17 | WD=$PWD |
---|
| 18 | |
---|
| 19 | if [ ! -d $SPARSEDIR ]; then |
---|
| 20 | echo "Can't find $SPARSEDIR directory." |
---|
| 21 | exit |
---|
| 22 | fi |
---|
| 23 | |
---|
| 24 | # Check for modified files in the sparse tree before starting |
---|
| 25 | if hg st $SPARSEDIR | head | grep .; then |
---|
| 26 | echo |
---|
| 27 | echo "$SPARSEDIR contains modifications, please clean it up first" |
---|
| 28 | exit |
---|
| 29 | fi |
---|
| 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 |
---|
| 33 | cd $LINUXPATH || exit 1 |
---|
| 34 | OLDCSET=$(hg parents | awk '/^changeset:/{print($2)}' | cut -f 1 -d :) |
---|
| 35 | for 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 |
---|
| 52 | done |
---|
| 53 | hg up -C $OLDTAG || exit 1 |
---|
| 54 | |
---|
| 55 | cd $WD |
---|
| 56 | for 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 |
---|
| 149 | done |
---|
| 150 | find $SPARSEDIR -name \*.diff -empty | xargs -r rm -f |
---|
| 151 | cd $LINUXPATH |
---|
| 152 | hg up -C $OLDCSET |
---|