#!/bin/bash
-echo "Updating Linus' tree"
-ssh ozlabs.org "cd kernels/linus.git; git remote update"
-
-echo "Pushing next"
-cd ~/kernels/next/next
-git push bilbo
-ssh ozlabs.org "cd kernels/next/next; git reset --hard"
-
-echo "Pushing next-history"
-cd ~/kernels/next/next-history.git
-git push bilbo
-
-echo "Pushing quilt"
-cd ~/kernels/next/quilt
-git push bilbo
-ssh ozlabs.org "cd kernels/next/quilt; git reset --hard"
-
-echo "Pushing next-fixes"
-cd ~/kernels/next/next-fixes
-git push bilbo
-ssh ozlabs.org "cd kernels/next/next-fixes; git reset --hard"
-
-cd ~/kernels/next
-rsync -avHP --exclude gitk.cache --exclude 'patch-*-next-2*' --exclude next-2'*'/ --include 'next/.git/' --include 'next/.git/rr-cache/' --include 'next/.git/rr-cache/**' --exclude next/'**' --exclude quilt/'**' --exclude next-fixes/'**' --exclude next-history.git/'**' --delete . ozlabs.org:kernels/next/.
-
-ssh ozlabs.org "touch kernels/NEXT-DONE"
+GIT_REPOS='next next-history.git quilt next-fixes tools etc mmotm'
+
+NEXT_DIR="$HOME/kernels/next"
+
+if ! cd "$NEXT_DIR"; then
+ printf '%s: cannot cd to %s\n' "$0" "$NEXT_DIR" 1>&2
+ exit 1
+fi
+
+printf 'Updating Linus'\'' tree\n'
+ssh ozlabs.org 'cd kernels/linus.git; git remote update'
+
+for i in $GIT_REPOS; do
+ printf 'Pushing %s\n' "$i"
+ ( cd "$i" && git push --prune bilbo )
+ if [ "${i%.git}" = "$i" ]; then
+ ssh ozlabs.org 'cd kernels/next/'"$i"'; git reset --hard'
+ fi
+done
+
+{
+ cat <<EOF
+- gitk.cache
+- /merge.debug
+- /merge.log
+- /akpm-import.log
+- /summ
+- /patch-*-next-2*
+- /next-2*/
++ .git/
++ .git/config
++ .git/hooks
++ .git/hooks/**
++ /next/.git/rr-cache/
++ /next/.git/rr-cache/**
+EOF
+ for i in $GIT_REPOS; do
+ echo "- $i/**"
+ done
+} | rsync -avHP --open-noatime --include-from - --delete . ozlabs.org:kernels/next/.
+
+ssh ozlabs.org 'touch kernels/NEXT-DONE'
+
+# Fix up the git configs so that the next pushes will work
+ssh ozlabs.org '
+cd kernels/next
+for i in '"$GIT_REPOS"'; do
+(
+ cd $i
+ git config receive.denyCurrentBranch ignore
+)
+done'
exit 0