X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=update_trees;h=d5c8697e96985c706b00bd458b1d2ae0b5a01c76;hb=50d7cb28be3021b644a47b9d4304b7565857bc74;hp=7e5525ce1d684e0e2d32afc395e89c3aed1dd6b9;hpb=61ff53ec669b5b5695d21683d0a55ca728a843dd;p=next-scripts diff --git a/update_trees b/update_trees index 7e5525c..d5c8697 100755 --- a/update_trees +++ b/update_trees @@ -1,84 +1,105 @@ #!/bin/bash -cp /dev/null ../quilt-import.log +. "$(dirname $0)/common.sh" + +log_file=../quilt-import.log +#cp /dev/null $log_file log() { - echo "$@" | tee -a ../quilt-import.log + echo "$@" | tee -a $log_file } execute() { log "$" $@ - "$@" 2>&1 | tee -a ../quilt-import.log - [ ${PIPESTATUS[0]} -eq 0 ] || sh -i || { - [ -f "$sfile.orig" ] && - mv -f "$sfile.orig" "$sfile" - exit 1 - } + "$@" 2>&1 | tee -a $log_file + [ ${PIPESTATUS[0]} -eq 0 ] || $SHELL -i || exit 1 } -quilters=$(grep -v '^#' ../real_control | awk -F ' ' '$2=="quilt" { print $3; }') +cpwd=$(pwd) + +quilters=$(grep -v '^#' $CTRL_FILE | awk -F '\t' '$2=="quilt" { print $3; }') for name in $quilters; do + sfile="../quilt/$name/series" - base=$(sed -n 's/^[# ]*NEXT_BASE[ ]*\(.*\)[ ]*$/\1/p' "$sfile") + base=$(sed -n 's/^#[ \t]*NEXT[-_]BASE[ \t]*\([^ \t]*\)[ \t]*$/\1/p' "$sfile") if [ -n "$base" ]; then - base=$(grep -v '^#' ../real_control | awk -F ' ' '$3=="'"$base"'" { if ($2=="quilt") printf("quilt/%s", "'"$base"'"); else printf("%s/%s", "'"$base"'", $5); }') + nbase=$(grep -v '^#' $CTRL_FILE | awk -F '\t' '$3=="'"$base"'" { printf("%s/%s", "'"$base"'", $5); }') + [ -n "$nbase" ] && base="$nbase" else - base=$(sed -n 's/^[# ]*BASE[ ]*\(.*\)[ ]*$/\1/p' "$sfile") + 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]*) rbase=$(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*) rbase=$(expr "$base" : "commit[ ]*\(.*\)") + commit*) rbase=${base##commit*[[:space:]]} ;; [0-9]*.*) rbase="v$base" ;; esac log "Importing $name based on $base" - git rev-list -n 1 "$rbase" -- >/dev/null 2>&1 || { + rbase_sha1=$(git rev-parse --verify "$rbase^{commit}") || { log "Unknown BASE" continue } - 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" + + # 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 show-ref --quiet --verify "refs/heads/quilt/$name" || - execute git branch "quilt/$name" "$rbase" + 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") + + git show-ref --quiet --verify "refs/heads/$name/master" || + execute git branch "$name/master" "$rbase_sha1" - mv -f "$sfile" "$sfile.tmp" - sed -e '/^[ ]*$/d' -e '^[ ]*#/d' <"$sfile.tmp" >"$sfile" - rm -f "$sfile.tmp" - [ -s "$sfile" ] || { + [ -n "$patches" ] || { log " quilt series is empty" - [ -f "$sfile.orig" ] && - mv -f "$sfile.orig" "$sfile" + execute git branch -f "$name/master" "$rbase_sha1" continue } - execute git checkout "quilt/$name" - execute git reset --hard "$rbase" + [ -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" - author=$(grep -v '^#' ../real_control | awk -F ' ' '$3=="'"$name"'" { printf("%s", $1); }' | sed 's/,.*$//') - execute git quiltimport --author "$author" --patches "../quilt/$name" + for f in $patches; do + old_head=$(git rev-parse --verify HEAD) + execute git am --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 - [ -f "$sfile.orig" ] && - mv -f "$sfile.orig" "$sfile" + log '$' cd $cpwd + cd $cpwd + + execute git fetch -f ../quilt-tmp master:"$name/master" done -git checkout master +[ -d "../quilt-tmp" ] && + rm -rf ../quilt-tmp + +( cd ../quilt; git branch -f last_merge HEAD ) exit 0