]> git.ozlabs.org Git - next-scripts/blob - do_merge
2e3cf9ce7072970e1e49323d69a00ea0ddd780b3
[next-scripts] / do_merge
1 #!/bin/bash
2
3 no_build=false
4 start_from=""
5
6 while getopts 'ns:' opt; do
7         case "$opt" in
8         n)
9                 no_build=true
10                 ;;
11         s)
12                 start_from="$OPTARG"
13                 ;;
14         *)
15                 exit 1
16                 ;;
17         esac
18 done
19 shift $((OPTIND - 1))
20
21 # shellcheck source=common.sh
22 source "$(dirname "$0")/common.sh"
23
24 log()
25 {
26         echo "$@" | tee -a "$LOG_FILE"
27 }
28
29 execute()
30 {
31         log "$" "$@"
32         "$@" 2>&1 | tee -a "$LOG_FILE"
33         return "${PIPESTATUS[0]}"
34 }
35
36 fix_up()
37 {
38         if [ -n "$1" ]; then
39                 linux-next-notify "$1"
40         fi
41         if [ -n "$2" ]; then
42                 printf '%s\n' "$2" 1>&2
43         fi
44         if ! bash -i; then
45                 exit
46         fi
47 }
48
49 if [ -z "$start_from" ]; then
50         cp /dev/null "$LOG_FILE"
51         execute date -R
52         execute git checkout master
53         execute git reset --hard stable
54         printf 'Name\t\tSHA1\n----\t\t----\n' > "$SHA1_FILE"
55 fi
56
57 heads=$(awk -F '\t' '
58         /^#/ { next; }
59         $2=="quilt" || $2=="git" { printf("%s/%s ", $3, $5); }
60         $2=="branch" { printf("branch/%s ", $1); }' "$CTRL_FILE")
61
62 need_build=false
63
64 for h in $heads; do
65         tree=${h%%/*}
66
67         if [ -n "$start_from" ]; then
68                 if [ "$tree" = "$start_from" ]; then
69                         start_from=""
70                 else
71                         continue
72                 fi
73         fi
74
75         if [ "$tree" = "branch" ]; then
76                 git branch -f "${h#branch/}"
77                 continue
78         fi
79
80         hlog=$(git log -1 --oneline "$h") 2>/dev/null
81         old_head=$(git rev-parse HEAD)
82         if [ -f "../pre-merge/$tree" ]; then
83                 while read -r p <&7; do
84                         if ! "$bin_dir/do_patch" -n "$p"; then
85                                 fix_up "premerge patch failed"
86                         fi 7<&-
87                 done 7<"../pre-merge/$tree"
88         fi
89         log Merging "$h" "($hlog)"
90         if ! execute git merge "$h"; then
91                 echo Merge failed 1>&2
92                 echo "$h" >>../merge.debug
93                 git diff >>../merge.debug 2>&1
94
95                 check_unmerged_files "$tree"
96
97                 if git diff 2>&1 | grep -E -q '<<<<<|^\*'; then
98                         if [ -f "../merge-fixes/$tree" ]; then
99                                 echo "Merge fixes exist for this tree:"
100                                 cat "../merge-fixes/$tree"
101                         fi
102                         fix_up "new conflict found merging $tree"
103                 fi
104 #               if [ "$(git status --porcelain)" ]; then
105                         if ! execute git commit --no-edit -v -a; then
106                                 fix_up "next commit failed for $tree"
107                         fi
108                         execute git diff -M --stat --summary 'HEAD^..'
109 #               fi
110         fi
111         if [ -f "../merge-fixes/$tree" ]; then
112                 while read -r p <&7; do
113                         if ! "$bin_dir/merge_fix" -n "$p"; then
114                                 fix_up "merge fix failed for $tree"
115                         fi 7<&-
116                 done 7<"../merge-fixes/$tree"
117         fi
118
119         tab=$'\t'
120         if [ "${#tree}" -le 8 ]; then
121                 tab=$'\t\t'
122         fi
123         printf '%s%s%s\n' "$tree" "$tab" "$(git rev-parse "$h^{}")" >> "$SHA1_FILE"
124
125         if $no_build; then
126                 continue
127         fi
128
129         if ! $need_build; then
130                 # See if we need to build after merging this tree
131                 if [ -n "$(git diff "$old_head"..)" ]; then
132                         need_build=true
133                 fi
134         fi
135         if ! $need_build; then
136                 continue
137         fi
138
139         do_build=$(awk -F '\t' '/^[^#]/ && $3=="'"$tree"'" { print $6; }' "$CTRL_FILE")
140         if [ "$do_build" != "yes" ]; then
141                 continue
142         fi
143
144         repo="${build_host:+$build_host:}${build_dir}"
145         if ! git push -f "$repo" master:refs/heads/next; then
146                 fix_up "push failed for $tree" "git push failed"
147         fi
148
149         if [ -x "../pre-build/$tree" ] &&
150            ! "../pre-build/$tree"; then
151                 fix_up "pre-build script failed for $tree" "Prebuild script failed"
152         fi
153         if ! "$bin_dir/do_build" "$tree"; then
154                 fix_up "build failed for $tree" "Build failed"
155         fi
156
157         need_build=false
158 done
159
160 exit 0