-#!/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