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