]> git.ozlabs.org Git - next-scripts/blob - update_trees
check_fixes: make sure the double quotes appear in the helpful message
[next-scripts] / update_trees
1 #!/bin/bash
2
3 . "$(dirname $0)/common.sh"
4
5 log_file=../quilt-import.log
6 #cp /dev/null $log_file
7
8 log()
9 {
10         echo "$@" | tee -a $log_file
11 }
12
13 execute()
14 {
15         log "$" $@
16         "$@" 2>&1 | tee -a $log_file
17         [ ${PIPESTATUS[0]} -eq 0 ] || $SHELL -i || exit 1
18 }
19
20 cpwd=$(pwd)
21
22 quilters=$(awk -F '\t' '/^[^#]/ && $2=="quilt" { print $3; }' "$CTRL_FILE")
23
24 for name in $quilters; do
25
26         sfile="../quilt/$name/series"
27         base=$(sed -n 's/^#[ \t]*NEXT[-_]BASE[ \t]*\([^ \t]*\)[ \t]*$/\1/p' "$sfile")
28         if [ -n "$base" ]; then
29                 nbase=$(awk -F '\t' '/^[^#]/ && $3=="'"$base"'" { printf("%s/%s", "'"$base"'", $5); }' "$CTRL_FILE")
30                 [ -n "$nbase" ] && base="$nbase"
31         else
32                 base=$(sed -n 's/^#[ \t]*BASE[ \t]*\(.*\)[ \t]*$/\1/p' "$sfile")
33                 [ -n "$base" ] || {
34                         # for stgit
35                         base=$(sed '1{s/^#.*GIT commit \(.*\)$/\1/;q}' "$sfile")
36                         [ -n "$base" ] ||
37                                 base="origin/master"
38                 }
39         fi
40         rbase="$base"
41         case "$base" in
42         *-git[0-9]*)    rbase=$("$bin_dir/get_gitid" "${base}")
43                         ;;
44         commit*)        rbase=${base##commit*[[:space:]]}
45                         ;;
46         [0-9]*.*)       rbase="v$base"
47                         ;;
48         esac
49         log "Importing $name based on $base"
50         rbase_sha1=$(git rev-parse --verify "$rbase^{commit}") || {
51                 log "Unknown BASE"
52                 continue
53         }
54
55         # don't bother importing things that haven't changed
56         mb=$(git merge-base "$rbase_sha1" "$name/master")
57         change_size=$(cd ../quilt;git diff last_merge.. -- "$name/" | wc -c)
58         [ "$mb" = "$rbase_sha1" ] && [ $change_size -eq 0 ] && {
59                 log "Unchanged quilt series $name"
60                 continue
61         }
62
63         sed_exp='s/[ \t]*#.*$//;/^[ \t]*$/!p'
64         grep -q NEXT_PATCHES "$sfile" &&
65                 sed_exp='/NEXT_PATCHES_START/,/NEXT_PATCHES_END/{'"$sed_exp"';}'
66         patches=$(sed -n "$sed_exp" "$sfile")
67
68         git show-ref --quiet --verify "refs/heads/$name/master" ||
69                 execute git branch "$name/master" "$rbase_sha1"
70
71         [ -n "$patches" ] || {
72                 log "   quilt series is empty"
73                 execute git branch -f "$name/master" "$rbase_sha1"
74                 continue
75         }
76
77         [ -d "../quilt-tmp" ] ||
78                 execute git clone -s -l -n -q . ../quilt-tmp
79
80         log '$' cd ../quilt-tmp
81         cd ../quilt-tmp
82         execute git reset --hard "$rbase_sha1"
83
84         for f in $patches; do
85                 old_head=$(git rev-parse --verify HEAD)
86                 execute git am -s --patch-format=mbox "../quilt/$name/$f"
87                 new_head=$(git rev-parse --verify HEAD)
88                 [ "$new_head" = "$old_head" ] && {
89                         echo "Tree unchanged, please check ..."
90                         bash -i || exit
91                 }
92         done
93
94         log '$' cd $cpwd
95         cd $cpwd
96
97         execute git fetch -f ../quilt-tmp master:"$name/master"
98 done
99
100 [ -d "../quilt-tmp" ] &&
101         rm -rf ../quilt-tmp
102
103 ( cd ../quilt; git branch -f last_merge HEAD )
104
105 exit 0