]> git.ozlabs.org Git - next-scripts/blob - do_merge
update to_build_host a bit
[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=="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                 linux-next-notify "update branch ${h#branch/}"
78                 continue
79         fi
80
81         hlog=$(git log -1 --oneline "$h") 2>/dev/null
82         old_head=$(git rev-parse HEAD)
83         if [ -f "../pre-merge/$tree" ]; then
84                 while read -r p <&7; do
85                         if ! "$bin_dir/do_patch" -n "$p"; then
86                                 fix_up "premerge patch failed"
87                         fi 7<&-
88                 done 7<"../pre-merge/$tree"
89         fi
90         log Merging "$h" "($hlog)"
91         printf -v msg "Merge branch '%s' of %s" "${h#*/}" "$(get_url "$tree")"
92         if ! execute git merge -m "$msg" "$h"; then
93                 echo Merge failed 1>&2
94                 echo "$h" >>../merge.debug
95                 git diff >>../merge.debug 2>&1
96
97                 check_unmerged_files "$tree"
98
99                 if git diff 2>&1 | grep -E -q '<<<<<|^\*'; then
100                         if [ -f "../merge-fixes/$tree" ]; then
101                                 echo "Merge fixes exist for this tree:"
102                                 cat "../merge-fixes/$tree"
103                         fi
104                         fix_up "new conflict found merging $tree"
105                 fi
106 #               if [ "$(git status --porcelain)" ]; then
107                         if ! execute git commit --no-edit -v -a; then
108                                 fix_up "next commit failed for $tree"
109                         fi
110                         execute git diff -M --stat --summary 'HEAD^..'
111 #               fi
112         fi
113
114         tab=$'\t'
115         if [ "${#tree}" -lt 8 ]; then
116                 tab=$'\t\t'
117         fi
118         printf '%s%s%s\n' "$tree" "$tab" "$(git rev-parse "$h^{}")" >> "$SHA1_FILE"
119
120         if [ -f "../merge-fixes/$tree" ]; then
121                 while read -r p <&7; do
122                         if ! "$bin_dir/merge_fix" -n "$p"; then
123                                 fix_up "merge fix failed for $tree"
124                         fi 7<&-
125                 done 7<"../merge-fixes/$tree"
126         fi
127
128         if $no_build; then
129                 continue
130         fi
131
132         if ! $need_build; then
133                 # See if we need to build after merging this tree
134                 if [ -n "$(git diff "$old_head"..)" ]; then
135                         need_build=true
136                 fi
137         fi
138         if ! $need_build; then
139                 continue
140         fi
141
142         if [ "$(get_build_flag "$tree")" != "yes" ]; then
143                 continue
144         fi
145
146         repo="${build_host:+$build_host:}${build_dir}"
147         if ! git push -f "$repo" master:refs/heads/next; then
148                 fix_up "push failed for $tree" "git push failed"
149         fi
150
151         if [ -x "../pre-build/$tree" ] &&
152            ! "../pre-build/$tree"; then
153                 fix_up "pre-build script failed for $tree" "Prebuild script failed"
154         fi
155         if ! "$bin_dir/do_build" "$tree"; then
156                 fix_up "build failed for $tree" "Build failed"
157         fi
158
159         need_build=false
160 done
161
162 exit 0