4 # This enforces stable/candidate/topic patterns.
8 # * stable must be moved 1 merge commit at a time (see below)
9 # * candidates/topics are frozen once merged into stable
10 # * topics are frozen once merged into candidates
12 # For DAG aesthetics, we prefer stable only moving in the approved way,
13 # which is via empty (no change) merge commits. The rationale is that
14 # in the DAG we want a simple, one-commit move from each release to the
17 # We started out with:
21 # \ * -- * -- B topic1
25 # And then publishing stable was a matter of fast-forwarding
28 # In a complicated (non-rebased) DAG, this becomes hard to follow,
29 # so want we want instead is:
31 # * -- A ----------- C stable
33 # \ * -- * -- B topic1
37 # Where commit C lists as it's first parent the prior stable
38 # commit and as it's second parent the release candidate. No
39 # other parents are allowed (e.g. no octopus merges here, which
40 # would insinuate qa didn't happen on the merged result).
42 # Also, we want to enforce that C does not actually introduce
43 # any diffs to the files between B and C--otherwise this changes
44 # would not have appeared in QA.
51 . $(dirname $0)/functions
56 short_refname=${refname##refs/heads/}
63 if [ "$change_type" == "delete" ] ; then
67 if [ "$change_type" == "create" -a "$short_refname" != "stable" ] ; then
68 not_on_stable=$(git rev-list stable..$newrev)
69 if [ "$not_on_stable" == "" ] ; then
70 echo "----------------------------------------------------"
72 echo "Creating a branch must include new commits"
74 echo "----------------------------------------------------"
79 # create/delete is okay
80 if [ "$change_type" != "update" ] ; then
84 # The tip must always be new
85 already=$(git branch --contains "$newrev")
86 if [ "$already" != "" ] ; then
88 echo "----------------------------------------------------"
90 echo "$short_refname is already referred to by $already"
92 echo "----------------------------------------------------"
96 if [ "$short_refname" == "stable" ] ; then
100 # - all commits from old..new
101 # - unless they were already pointed to by a branch
102 # = all new commits on stable
103 count=$(git rev-parse --not --branches | git rev-list --stdin $oldrev..$newrev | wc -l)
104 if [ "$count" -ne "1" ] ; then
105 echo "----------------------------------------------------"
107 echo "Moving stable must entail a single commit"
109 echo "----------------------------------------------------"
113 number_of_parents=$(git rev-list --no-walk --parents $newrev | sed 's/ /\n/g' | grep -v $newrev | wc -l)
114 if [ "$number_of_parents" -ne "2" ] ; then
115 echo "----------------------------------------------------"
117 echo "Moving stable must entail a merge commit"
119 echo "----------------------------------------------------"
123 first_parent=$(git rev-list --no-walk --parents $newrev | sed 's/ /\n/g' | grep -v $newrev | head --lines=1)
124 if [ "$first_parent" != "$oldrev" ] ; then
125 echo "----------------------------------------------------"
127 echo "Moving stable must have the previous stable as the first parent"
129 echo "----------------------------------------------------"
133 second_parent=$(git rev-list --no-walk --parents $newrev | sed 's/ /\n/g' | grep -v $newrev | tail --lines=1)
134 changed_lines=$(git diff $second_parent..$newrev | wc -l)
135 if [ "$changed_lines" -ne "0" ] ; then
136 echo "----------------------------------------------------"
138 echo "Moving stable must not result in any changes from $second_parent"
140 echo "----------------------------------------------------"
144 # Check if candidate/topic is already in stable
145 git branch --contains "$oldrev" | grep stable >/dev/null
146 if [ $? -eq 0 ] ; then
147 echo "----------------------------------------------------"
149 echo "$short_refname has been merged into stable"
151 echo "----------------------------------------------------"
155 # For now candidates can mix amongst each other so early exit
157 refs/heads/candidate*)
164 # Check if topic is already in candidates
165 candidate=$(git branch --contains "$oldrev" | grep -oP candidate.* --max-count=1)
166 if [ $? -eq 0 ] ; then
167 echo "----------------------------------------------------"
169 echo "$short_refname has been merged into $candidate"
171 echo "----------------------------------------------------"