#!/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/^#[ \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]*) rbase=$("$bin_dir/get_gitid" "${base}") ;; commit*) rbase=${base##commit*[[:space:]]} ;; [0-9]*.*) rbase="v$base" ;; esac 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 } 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" [ -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