2 ################################################################################
5 # Description: Merges from one branch to another. If the merge is successful
6 # then a build is performed. If that is also successful then the
7 # merged elements are checked in and optionally labeled. A cleanup
8 # of .contrib files is also performed (only if the merge and build
9 # succeed). After this email is set to SITE_ADMIN_EMAIL (default).
10 # Author: Andrew@DeFaria.com
11 # Created: Wed Jun 11 13:22:11 PDT 2003
12 # Language: Bash Shell
15 # (c) Copyright 2003, Andrew@DeFaria.com, all rights reserved
17 ################################################################################
18 # Set me to command name
21 # Source /etc/site_parms
22 if [ -f /etc/site_parms ]; then
25 echo "$me: WARNING: /etc/site_parms does not exist!"
29 adm_base="$SITE_TOOLS_PATH/adm"
32 adm_fpath=${adm_fpath:-$adm_base/functions}
40 # Set a logfile for the merge
41 logfile=/tmp/$me.$$.log
43 # File for merge commands
44 merge_cmd=/tmp/$me.$$.cmd
47 exclusions=/tmp/$me.$$.exclude
49 # How many elements merged
50 declare -i nbr_merges=0
52 # How many exclusions were found
53 declare -i nbr_exclusions=0
55 # Element exclusion list
59 # Result of merging, building, etc. Codes are:
61 # 0: Success! Everything worked.
62 # 1: Errors occured during merging
63 # 2: Not all merges could be performed automatically
64 # 3: No merging required
66 # 5: Unable to checkin elements
67 # 6: Problems applying label
68 declare -i result_code=0
71 if [ ! -z "$1" ]; then
74 display "Usage: $me: -view <view path> -b|ranch <from_branch>"
75 display "\t\t[-to <email_address>] [-cc <email_address>]"
76 display "\t\t[-nocheckin] [-l|abel <label>] [-nocleanup]"
77 display "\t\t[-v|erbose] [-d|ebug] [-u|sage]"
80 display "\t-view:\t\tPath to view to perform the merge to (Required)"
81 display "\t-branch:\tName of branch to merge the LATEST from (Required)"
82 display "\t-to:\t\tEmail address where to mail the build log"
83 display "\t\t\t(default $SITE_ADMIN_EMAIL)"
84 display "\t-cc:\t\tEmail address where to cc the build log"
85 display "\t\t\t(default NONE)"
86 display "\t-nocheckin:\tDo not check in merged elements after"
87 display "\t\t\tsuccessful merge and build (default check in)"
88 display "\t-label:\t\tLabel to apply after successful build. Note that"
89 display "\t\t\tthe current date (format _DD_MM_YYYY) will be appended"
90 display "\t\t\tto this label (default no label applied)"
91 display "\t-nocleanup:\tDo not clean up contrib files after successful"
92 display "\t\t\tbuild (default cleanup)"
93 display "\t-verbose:\tTurn on verbose mode"
94 display "\t-debug:\t\tTurn on debug mode"
95 display "\t-usage:\t\tDisplay usage"
102 display "$1" >> $logfile
106 function merge_directories {
107 # First merge directories
108 log "Finding directories that need merging..."
110 # Convert $merge_cmd to Window path for cleartool
111 cmd=$(cygpath -w $merge_cmd)
113 cleartool findmerge \
117 -comment "BUGS200003035: Merge from $branch -> $viewtag" \
118 -fversion .../$branch/LATEST \
120 -print >> $logfile 2>&1
122 # The merging of directories could, in theory, unearth directories
123 # inside those directories thus causing further directory merging.
124 # Here we keep merging directories until there are no more to merge.
125 while [ -f $merge_cmd -a -s $merge_cmd ]; do
126 # Remove any comments from the merge command. Comments are inserted
127 # as warnings is directory merges were needed and not performed.
128 grep -ve ^# $merge_cmd > $merge_cmd.2
129 mv $merge_cmd.2 $merge_cmd
131 # Restore execute permissions to $merge_cmd
134 log "Performing directory merges..."
135 let nbr_merges=nbr_merges+$(wc -l $merge_cmd | awk '{print $1}')
136 $merge_cmd >> $logfile 2>&1
139 # Check for errors. If there was a reserved checkout on a directory and
140 # we do not detect this error we will loop here because the merge will
141 # not be performed yet it needs to be merged
144 if [ $result_code -ne 0 ]; then
149 log "Looking for further directory merges..." >> $logfile
151 cleartool findmerge \
155 -comment "BUGS200003035: Merge from $branch -> $viewtag" \
156 -fversion .../$branch/LATEST \
158 -print >> $logfile 2>&1
163 } # merge_directories
165 function merge_elements {
166 log "Performing element merges..."
168 # Convert $merge_cmd to Window path for cleartool
169 cmd=$(cygpath -w $merge_cmd)
171 cleartool findmerge \
177 -comment "BUGS200003035: Merge from $branch -> $viewtag" \
178 -fversion .../$branch/LATEST \
181 -print >> $logfile 2>&1
183 # Exclude certain elements...
186 for element in $excluded_elements; do
187 grep -q $element $merge_cmd
189 if [ $? -eq 0 ]; then
190 log "Excluded element $element found - removing element from merge list..."
191 grep $element $merge_cmd >> $exclusions
192 grep -v $element $merge_cmd > $merge_cmd.2
193 mv $merge_cmd.2 $merge_cmd
197 let nbr_merges=nbr_merges+$(wc -l $merge_cmd | awk '{print $1}')
198 let nbr_exclusions=$(wc -l $exclusions | awk '{print $1}')
200 if [ -f $merge_cmd -a -s $merge_cmd ]; then
201 # Restore execute permissions to merge.cmd
203 $merge_cmd >> $logfile 2>&1
211 function send_email {
217 if [ -z "$cc" ]; then
218 display "From: ccadmin\nTo: $to\nSubject: $subject\n" > /tmp/msg.$$
220 display "From: ccadmin\nTo: $to\ncc: $cc\nSubject: $subject\n" > /tmp/msg.$$
224 cat /tmp/msg.$$ $logfile | $ssmtp -t
226 if [ $? -eq 0 ]; then
231 function check_error {
232 # Check for cleartool errors
233 errors=$(grep -c "cleartool: Error" $logfile)
235 if [ $errors -ne 0 ]; then
237 log "Errors occurred during merging"
240 # Check how many merges failed:
241 errors=$(grep -c -e "*** Aborting..." $logfile)
243 if [ $errors -ne 0 ]; then
245 log "\nUnable to merge all elements automatically. $errors merges failed"
246 log "The following element(s) require manual merge:\n\n"
250 # Report individual files that could not be automatically merged
251 grep -e "Needs Merge" -e "\*\*\* Aborting\.\.\." $logfile |
252 tr '\\' '/' | while read line; do
253 if [[ $line != *Aborting\.\.\. ]]; then
254 file=$(echo $line | cut -f2 -d\")
261 if [ $nbr_exclusions -ne 0 ]; then
262 if [ $nbr_exclusions -eq 1 ]; then
263 log "$nbr_exclusions element excluded merge"
265 log "$nbr_exclusions elements excluded from merge"
268 if [ $nbr_merges -eq 0 ]; then
269 log "No merging required"
271 elif [ $nbr_merges -eq 1 ]; then
272 log "$nbr_merges element merged succesfully"
274 log "$nbr_merges elements merged succesfully"
279 function report_results {
280 log "\nEnd of merge of Branch: $branch -> View: $viewtag @ $(date)"
281 log "Logfile: $(hostname):$logfile"
286 subject="Successful merge"
290 subject="Errors merging"
294 subject="Unable to automatically merge"
298 subject="No elements required merging"
302 subject="Build failed after successfully merging"
306 subject="Unable to checkin element after merging"
310 subject="Unable to apply label to elements after merge"
314 subject="Unknown result code while merging"
318 subject="$subject from Branch: $branch -> View: $viewtag"
319 send_email $to "$cc" "$subject"
328 while [ $# -ge 1 ]; do
339 if [ $# -le 1 ]; then
340 usage "View path is mmissing"
352 if [ $# -le 1 ]; then
353 usage "Branch missing"
361 if [ $# -le 1 ]; then
362 usage "To address missing"
370 if [ $# -le 1 ]; then
371 usage "CC address missing"
383 if [ $# -le 1 ]; then
384 usage "Label missing"
387 label="$(echo $1 | tr [:lower:] [:upper:])_$(date +%d_%m_%Y)"
396 usage "Unknown option encountered: \"$1\"!"
402 # Default to to $SITE_ADMIN_EMAIL
403 to=${to:-$SITE_ADMIN_EMAIL}
405 # Check for required parameters
406 if [ "$view" = "" ]; then
407 usage "View not specified"
408 elif [ "$branch" = "" ]; then
409 usage "Branch name not specified"
413 if [ ! -d "$view" ]; then
414 # View path doesn't seem to exist. If this is a dynamic view then perhaps
415 # it's not started. Attempt to start it and see if it comes into existance
416 cleartool startview $(basename "$view") > /dev/null 2>&1
418 if [ $? -ne 0 ]; then
419 usage "View specified, $(basename $view), does not appear to be a valid view"
422 if [ ! -d "$view" ]; then
423 usage "View path specified, $view, does not exist"
428 viewtag=$(cleartool pwv -short)
434 log "Start merge of Branch: $branch -> View: $viewtag @ $(date)"
437 if [ $result_code -ne 0 ]; then
438 log "Unable to merge directories"
439 log "Further merging halted"
446 if [ $result_code -ne 0 ]; then
447 if [ $result_code -eq 3 ]; then
448 log "Build not performed"
450 log "Merging failed - build not performed"
454 log "Merge successful - building..."
458 $SITE_TOOLS_PATH/bin/build_view $viewtag
460 if [ $? -ne 0 ]; then
466 log "Build successful"
469 if [ $checkin = "yes" ]; then
470 # Check in merges, if any
471 log "Checking in merges..."
472 cleartool lscheckout -cview -me -all -short | tr '\\' '/' | while read element; do
473 log "Checking in element $element"
474 cleartool checkin -nc $element >> $logfile 2>&1
477 if [ $status -ne 0 ]; then
479 log "Unable to checkin $element (Status: $status)"
483 log "All merges checked in"
487 if [ ! -z "$label" ]; then
488 log "Applying locked, dated label $label..."
489 $SITE_TOOLS_PATH/bin/label -label $label -dated -lock \
490 . -recurse salira/neopon -recurse salira/EMS -recurse salira/Hardware
492 if [ $? -eq 0 ]; then
493 log "Applied labels successfully"
496 log "Problems applying label"
500 # Cleanup contrib files
501 if [ $cleanup = "yes" ]; then
502 # Cleanup contrib files...
503 log "Cleaning up contrib files..."
504 find . -name "*.contrib*" -exec rm -f {} \;
505 log "Cleaned up contrib files"