]> git.ozlabs.org Git - next-scripts/blobdiff - update_trees
merg_old_version: push even if not building
[next-scripts] / update_trees
index 75333d09c679d0215d5c027a5f1fd4540fb77ad1..b09a01aa392458fe2db37a74d58853a2ab359471 100755 (executable)
-#!/bin/sh
-
-(
-       IFS='   '
-
-       while read email type name url ref; do
-               echo $name: $type
-               if [ "$type" = "git" ]; then
-                       git fetch "$name"
-                       continue
-               fi
-               (
-                       cd ../quilt/"$name"
-                       wget -N --quiet --recursive --no-directories --no-parent "$url"
-               )
-       done <../real_control
-
-       (
-               cd ../quilt
-               git add .
-               git commit -v -a
-       )
-)
-
-quilters=$(awk -F '    ' '$2=="quilt" { print $3; }' ../real_control)
+#!/bin/bash
+
+. "$(dirname $0)/common.sh"
+
+log_file=../quilt-import.log
+#cp /dev/null $log_file
+
+log()
+{
+       echo "$@" | tee -a $log_file
+}
+
+execute()
+{
+       log "$" $@
+       "$@" 2>&1 | tee -a $log_file
+       [ ${PIPESTATUS[0]} -eq 0 ] || $SHELL -i || exit 1
+}
+
+cpwd=$(pwd)
+
+quilters=$(awk -F '\t' '/^[^#]/ && $2=="quilt" { print $3; }' "$CTRL_FILE")
 
 for name in $quilters; do
+
        sfile="../quilt/$name/series"
-       base=$(sed -n 's/^[#    ]*BASE[         ]*\(.*\)[       ]*$/\1/p' "$sfile")
+       base=$(sed -n 's/^#[ \t]*NEXT[-_]BASE[ \t]*\([^ \t]*\)[ \t]*$/\1/p' "$sfile")
+       if [ -n "$base" ]; then
+               nbase=$(awk -F '\t' '/^[^#]/ && $3=="'"$base"'" { printf("%s/%s", "'"$base"'", $5); }' "$CTRL_FILE")
+               [ -n "$nbase" ] && base="$nbase"
+       else
+               base=$(sed -n 's/^#[ \t]*BASE[ \t]*\(.*\)[ \t]*$/\1/p' "$sfile")
+               [ -n "$base" ] || {
+                       # for stgit
+                       base=$(sed '1{s/^#.*GIT commit \(.*\)$/\1/;q}' "$sfile")
+                       [ -n "$base" ] ||
+                               base="origin/master"
+               }
+       fi
+       rbase="$base"
        case "$base" in
-       *-git[0-9]*)    base=$(wget -q -O - "http://www.kernel.org/pub/linux/kernel/v2.6/snapshots/patch-${base}.id")
+       *-git[0-9]*)    rbase=$("$bin_dir/get_gitid" "${base}")
                        ;;
-       commit*)        base=$(expr "$base" : "commit[  ]*\(.*\)")
+       commit*)        rbase=${base##commit*[[:space:]]}
                        ;;
-       [0-9]*.*)       base="v$base"
+       [0-9]*.*)       rbase="v$base"
                        ;;
        esac
-       echo "$sfile": "$base"
-       grep -q NEXT_PATCHES "$sfile" && {
-               mv -f "$sfile" "$sfile.orig"
-               do_echo=:
-               while read line; do
-                       case $line in
-                       *NEXT_PATCHES_START*)   do_echo=echo
-                                               ;;
-                       *NEXT_PATCHES_END*)     do_echo=:
-                                               ;;
-                       esac
-                       $do_echo $line
-               done <"$sfile.orig" >"$sfile"
+       log "Importing $name based on $base"
+       rbase_sha1=$(git rev-parse --verify "$rbase^{commit}") || {
+               log "Unknown BASE"
+               continue
+       }
+
+       # don't bother importing things that haven't changed
+       mb=$(git merge-base "$rbase_sha1" "$name/master")
+       change_size=$(cd ../quilt;git diff last_merge.. -- "$name/" | wc -c)
+       [ "$mb" = "$rbase_sha1" ] && [ $change_size -eq 0 ] && {
+               log "Unchanged quilt series $name"
+               continue
        }
 
-       git branch -D "quilt/$name"
-       git checkout -b "quilt/$name" "$base" || sh -i
-       git quiltimport --patches "../quilt/$name" || sh -i
+       sed_exp='s/[ \t]*#.*$//;/^[ \t]*$/!p'
+       grep -q NEXT_PATCHES "$sfile" &&
+               sed_exp='/NEXT_PATCHES_START/,/NEXT_PATCHES_END/{'"$sed_exp"';}'
+       patches=$(sed -n "$sed_exp" "$sfile")
 
-       [ -f "$sfile.orig" ] &&
-               mv -f $sfile.orig $sfile
+       git show-ref --quiet --verify "refs/heads/$name/master" ||
+               execute git branch "$name/master" "$rbase_sha1"
+
+       [ -n "$patches" ] || {
+               log "   quilt series is empty"
+               execute git branch -f "$name/master" "$rbase_sha1"
+               continue
+       }
+
+       [ -d "../quilt-tmp" ] ||
+               execute git clone -s -l -n -q . ../quilt-tmp
+
+       log '$' cd ../quilt-tmp
+       cd ../quilt-tmp
+       execute git reset --hard "$rbase_sha1"
+
+       for f in $patches; do
+               old_head=$(git rev-parse --verify HEAD)
+               execute git am -s --patch-format=mbox "../quilt/$name/$f"
+               new_head=$(git rev-parse --verify HEAD)
+               [ "$new_head" = "$old_head" ] && {
+                       echo "Tree unchanged, please check ..."
+                       bash -i || exit
+               }
+       done
+
+       log '$' cd $cpwd
+       cd $cpwd
+
+       execute git fetch -f ../quilt-tmp master:"$name/master"
 done
 
+[ -d "../quilt-tmp" ] &&
+       rm -rf ../quilt-tmp
+
+( cd ../quilt; git branch -f last_merge HEAD )
+
 exit 0