File: merge.sh

package info (click to toggle)
spring 103.0%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 43,720 kB
  • ctags: 63,685
  • sloc: cpp: 368,283; ansic: 33,988; python: 12,417; java: 12,203; awk: 5,879; sh: 1,846; xml: 655; perl: 405; php: 211; objc: 194; makefile: 77; sed: 2
file content (159 lines) | stat: -rwxr-xr-x 4,200 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#!/bin/sh
#
# Author: Tobi Vollebregt
#
# This script is to be used to auto-merge trunk revisions with the "BUGFIX"
# keyword to the current working directory.
#
# Run it from inside a svn checkout of the release branch, optionally a
# subdirectory of it (it will merge only in that subdirectory in that case).
#
# Pass two numeric revision arguments to the script. The script
# will loop through all revisions in this range & get the log message from that
# commit in trunk. If the log message contains the "BUGFIX" keyword it merges
# that revision to the working copy.
#
# As a special case, revision1 may be "AUTO" in which case the script
# examines the log messages of the branch in reverse order (from latest to
# oldest). If a log message contains a line "AUTO_MERGE r1 r2" it sets
# sets the revision1 argument to r2+1.
#
# As a special case, revision2 may be "HEAD" in which case the script replaces
# it with the revision the current checkout is at. (from the output of svn info)
#
# Extra arguments are interpreted as additional revisions numbers to merge.
# (ie. where the BUGFIX keyword was forgottten).
#
# After running the script you should review the diff & commit the merge.
# The script will give you the command to run for committing (includes a
# generated log message)
#


# Set this to 1 for debugging output
verbose=0

args="$@"


#
# Some sanity checks
#

quit=0

# Enough arguments?
if [[ $# < 2 ]]; then
        echo "Usage: $0 revision1 revision2"
        quit=1
fi

# Are we inside a svn checkout directory?
[ "x$(svn info)" != "x" ] || quit=1

if [ "$quit" != "0" ]; then
        exit "$quit"
fi


#
# Some generic code to set up $url, $branch and $path
#

url=$(svn info | grep "Repository Root" | sed 's,Repository Root: ,,g')/
[ $verbose != 0 ] &&  echo "Repo   : $url"

path=$(svn info | grep "URL" | sed "s,URL: ,,g;s,$url,,g")/

if [ "$(echo "$path" | awk -F / '{print $1}')" == "branches" ]; then
	branch=$(echo $path | awk -F / '{ print $1"/"$2 }')/
else
	branch="trunk/"
fi
[ $verbose != 0 ] && echo "Branch : $branch"

path=$(echo "$path" | sed "s,$branch,,g")
[ $verbose != 0 ] && echo "Path   : $path"


#
# Retrieve & parse the log & merge BUGFIX revisions
#

r1=$1
r2=$2
shift 2
logurl="$url""trunk/$path"
merge=0
commitmsg="__merge_commit__.txt"

[ $verbose != 0 ] && echo "URL    : $logurl"

# Truncate $commitmsg file before we start appending to it.
rm -f "$commitmsg"

# Resolve AUTO to the first unprocessed revision (by looking at the log).
if [ "$r1" == "AUTO" ]; then
	r1=$(svn info | grep "Revision" | sed 's,Revision: ,,g')
	logurl2="$url$branch"
	for (( r=$r1 ; ; r=$r-1 )); do
		echo "* Checking revision $r for AUTO_MERGE." 1>&2
		automerge=$(svn log -r "$r" "$logurl2" | grep AUTO_MERGE)
		if [ "x$automerge" != "x" ]; then
			r1=$(echo "$automerge" | awk '{print $3}')
			r1=$(($r1+1))
			[ $verbose != 0 ] && echo "AUTO   : $r1"
			break
		fi
	done
fi

# Replace HEAD by revision number so we can do arithmetic with it
if [ "$r2" == "HEAD" ]; then
	r2=$(svn info | grep "Revision" | sed 's,Revision: ,,g')
	[ $verbose != 0 ] && echo "HEAD   : $r2"
fi

# Loop through the revision range
for (( r=$r1 ; r <= $r2 ; r=$r+1 )); do

	echo "* Checking revision $r for BUGFIX." 1>&2

	# Check BUGFIX keyword in log
	if [ "x$(svn log -r "$r" "$logurl" | grep BUGFIX)" != "x" ] || [ "x$(echo $@ | grep $r)" != "x" ] ; then
		[ $verbose != 0 ] && echo "  Revision $r is a BUGFIX revision, trying to merge ..."
		# Perform merge
		svn merge -r "$(($r-1)):$r" "$logurl"
		merge=$(($merge+1))
		# Put entry in commit message
		echo "* Automated merge of bugfix revision $r." >> "$commitmsg"
	fi
done

# This is parsed by this script if revision1 is set to "AUTO".
echo "AUTO_MERGE $r1 $r2" >> "$commitmsg"
echo "(This commit has been generated by the command '$0 $args')" >> "$commitmsg"


#
# Summary & further instructions
#

echo

if [ "$merge" == 0 ]; then
	echo "No BUGFIX revisions found."
elif [ "$merge" == 1 ]; then
	echo "Performed 1 merge."
else
	echo "Performed $merge merges."
fi

if [ "$merge" != 0 ]; then
	echo "Check the diff and commit the changes using the command:"
	echo "svn commit -F $commitmsg"
	echo
	cat "$commitmsg"
fi

echo