git-release 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,310 @@
1
+ #!/bin/bash
2
+ # [r5]: roundup.5.html
3
+ # [r1t]: roundup-1-test.sh.html
4
+ # [r5t]: roundup-5-test.sh.html
5
+
6
+ #Direct copy of roundup so we can use it on Travis CI
7
+ #https://github.com/bmizerany/roundup
8
+ #
9
+ # _(c) 2010 Blake Mizerany - MIT License_
10
+ #
11
+ # Spray **roundup** on your shells to eliminate weeds and bugs. If your shells
12
+ # survive **roundup**'s deathly toxic properties, they are considered
13
+ # roundup-ready.
14
+ #
15
+ # **roundup** reads shell scripts to form test plans. Each
16
+ # test plan is sourced into a sandbox where each test is executed.
17
+ #
18
+ # See [roundup-1-test.sh.html][r1t] or [roundup-5-test.sh.html][r5t] for example
19
+ # test plans.
20
+ #
21
+ # __Install__
22
+ #
23
+ # git clone http://github.com/bmizerany/roundup.git
24
+ # cd roundup
25
+ # make
26
+ # sudo make install
27
+ # # Alternatively, copy `roundup` wherever you like.
28
+ #
29
+ # __NOTE__: Because test plans are sourced into roundup, roundup prefixes its
30
+ # variable and function names with `roundup_` to avoid name collisions. See
31
+ # "Sandbox Test Runs" below for more insight.
32
+
33
+ # Usage and Prerequisites
34
+ # -----------------------
35
+
36
+ # Exit if any following command exits with a non-zero status.
37
+ set -e
38
+
39
+ # The current version is set during `make version`. Do not modify this line in
40
+ # anyway unless you know what you're doing.
41
+ ROUNDUP_VERSION="0.0.5"
42
+ export ROUNDUP_VERSION
43
+
44
+ # Usage is defined in a specific comment syntax. It is `grep`ed out of this file
45
+ # when needed (i.e. The Tomayko Method). See
46
+ # [shocco](http://rtomayko.heroku.com/shocco) for more detail.
47
+ #/ usage: roundup [--help|-h] [--version|-v] [plan ...]
48
+
49
+ roundup_usage() {
50
+ grep '^#/' <"$0" | cut -c4-
51
+ }
52
+
53
+ while test "$#" -gt 0
54
+ do
55
+ case "$1" in
56
+ --help|-h)
57
+ roundup_usage
58
+ exit 0
59
+ ;;
60
+ --version|-v)
61
+ echo "roundup version $ROUNDUP_VERSION"
62
+ exit 0
63
+ ;;
64
+ --color)
65
+ color=always
66
+ shift
67
+ ;;
68
+ -)
69
+ echo >&2 "roundup: unknown switch $1"
70
+ exit 1
71
+ ;;
72
+ *)
73
+ break
74
+ ;;
75
+ esac
76
+ done
77
+
78
+ # Consider all scripts with names matching `*-test.sh` the plans to run unless
79
+ # otherwise specified as arguments.
80
+ if [ "$#" -gt "0" ]
81
+ then
82
+ roundup_plans="$@"
83
+ else
84
+ roundup_plans="$(ls *-test.sh)"
85
+ fi
86
+
87
+ : ${color:="auto"}
88
+
89
+ # Create a temporary storage place for test output to be retrieved for display
90
+ # after failing tests.
91
+ roundup_tmp="$PWD/.roundup.$$"
92
+ mkdir -p "$roundup_tmp"
93
+
94
+ trap "rm -rf \"$roundup_tmp\"" EXIT INT
95
+
96
+ # __Tracing failures__
97
+ roundup_trace() {
98
+ # Delete the first two lines that represent roundups execution of the
99
+ # test function. They are useless to the user.
100
+ sed '1d' |
101
+ # Delete the last line which is the "set +x" of the error trap
102
+ sed '$d' |
103
+ # Replace the rc=$? of the error trap with an verbose string appended
104
+ # to the failing command trace line.
105
+ sed '$s/.*rc=/exit code /' |
106
+ # Trim the two left most `+` signs. They represent the depth at which
107
+ # roundup executed the function. They also, are useless and confusing.
108
+ sed 's/^++//' |
109
+ # Indent the output by 4 spaces to align under the test name in the
110
+ # summary.
111
+ sed 's/^/ /' |
112
+ # Highlight the last line in front of the exit code to bring notice to
113
+ # where the error occurred.
114
+ #
115
+ # The sed magic puts every line into the hold buffer first, then
116
+ # substitutes in the previous hold buffer content, prints that and starts
117
+ # with the next cycle. At the end the last line (in the hold buffer)
118
+ # is printed without substitution.
119
+ sed -n "x;1!{ \$s/\(.*\)/$mag\1$clr/; };1!p;\$x;\$p"
120
+ }
121
+
122
+ # __Other helpers__
123
+
124
+ # Track the test stats while outputting a real-time report. This takes input on
125
+ # **stdin**. Each input line must come in the format of:
126
+ #
127
+ # # The plan description to be displayed
128
+ # d <plan description>
129
+ #
130
+ # # A passing test
131
+ # p <test name>
132
+ #
133
+ # # A failed test
134
+ # f <test name>
135
+ roundup_summarize() {
136
+ set -e
137
+
138
+ # __Colors for output__
139
+
140
+ # Use colors if we are writing to a tty device.
141
+ if (test -t 1) || (test $color = always)
142
+ then
143
+ red=$(printf "\033[31m")
144
+ grn=$(printf "\033[32m")
145
+ mag=$(printf "\033[35m")
146
+ clr=$(printf "\033[m")
147
+ cols=$(tput cols)
148
+ fi
149
+
150
+ # Make these available to `roundup_trace`.
151
+ export red grn mag clr
152
+
153
+ ntests=0
154
+ passed=0
155
+ failed=0
156
+
157
+ : ${cols:=10}
158
+
159
+ while read status name
160
+ do
161
+ case $status in
162
+ p)
163
+ ntests=$(expr $ntests + 1)
164
+ passed=$(expr $passed + 1)
165
+ printf " %-48s " "$name:"
166
+ printf "$grn[PASS]$clr\n"
167
+ ;;
168
+ f)
169
+ ntests=$(expr $ntests + 1)
170
+ failed=$(expr $failed + 1)
171
+ printf " %-48s " "$name:"
172
+ printf "$red[FAIL]$clr\n"
173
+ roundup_trace < "$roundup_tmp/$name"
174
+ ;;
175
+ d)
176
+ printf "%s\n" "$name"
177
+ ;;
178
+ esac
179
+ done
180
+ # __Test Summary__
181
+ #
182
+ # Display the summary now that all tests are finished.
183
+ yes = | head -n 57 | tr -d '\n'
184
+ printf "\n"
185
+ printf "Tests: %3d | " $ntests
186
+ printf "Passed: %3d | " $passed
187
+ printf "Failed: %3d" $failed
188
+ printf "\n"
189
+
190
+ # Exit with an error if any tests failed
191
+ test $failed -eq 0 || exit 2
192
+ }
193
+
194
+ # Sandbox Test Runs
195
+ # -----------------
196
+
197
+ # The above checks guarantee we have at least one test. We can now move through
198
+ # each specified test plan, determine its test plan, and administer each test
199
+ # listed in a isolated sandbox.
200
+ for roundup_p in $roundup_plans
201
+ do
202
+ # Create a sandbox, source the test plan, run the tests, then leave
203
+ # without a trace.
204
+ (
205
+ # Consider the description to be the `basename` of the plan minus the
206
+ # tailing -test.sh.
207
+ roundup_desc=$(basename "$roundup_p" -test.sh)
208
+
209
+ # Define functions for
210
+ # [roundup(5)][r5]
211
+
212
+ # A custom description is recommended, but optional. Use `describe` to
213
+ # set the description to something more meaningful.
214
+ # TODO: reimplement this.
215
+ describe() {
216
+ roundup_desc="$*"
217
+ }
218
+
219
+ # Provide default `before` and `after` functions that run only `:`, a
220
+ # no-op. They may or may not be redefined by the test plan.
221
+ before() { :; }
222
+ after() { :; }
223
+
224
+ # Seek test methods and aggregate their names, forming a test plan.
225
+ # This is done before populating the sandbox with tests to avoid odd
226
+ # conflicts.
227
+
228
+ # TODO: I want to do this with sed only. Please send a patch if you
229
+ # know a cleaner way.
230
+ roundup_plan=$(
231
+ grep "^it_.*()" $roundup_p |
232
+ sed "s/\(it_[a-zA-Z0-9_]*\).*$/\1/g"
233
+ )
234
+
235
+ # We have the test plan and are in our sandbox with [roundup(5)][r5]
236
+ # defined. Now we source the plan to bring its tests into scope.
237
+ . ./$roundup_p
238
+
239
+ # Output the description signal
240
+ printf "d %s" "$roundup_desc" | tr "\n" " "
241
+ printf "\n"
242
+
243
+ for roundup_test_name in $roundup_plan
244
+ do
245
+ # Any number of things are possible in `before`, `after`, and the
246
+ # test. Drop into an subshell to contain operations that may throw
247
+ # off roundup; such as `cd`.
248
+ (
249
+ # Output `before` trace to temporary file. If `before` runs cleanly,
250
+ # the trace will be overwritten by the actual test case below.
251
+ {
252
+ # redirect tracing output of `before` into file.
253
+ {
254
+ set -x
255
+ # If `before` wasn't redefined, then this is `:`.
256
+ before
257
+ } &>"$roundup_tmp/$roundup_test_name"
258
+ # disable tracing again. Its trace output goes to /dev/null.
259
+ set +x
260
+ } &>/dev/null
261
+
262
+ # exit subshell with return code of last failing command. This
263
+ # is needed to see the return code 253 on failed assumptions.
264
+ # But, only do this if the error handling is activated.
265
+ set -E
266
+ trap 'rc=$?; set +x; set -o | grep "errexit.*on" >/dev/null && exit $rc' ERR
267
+
268
+ # If `before` wasn't redefined, then this is `:`.
269
+ before
270
+
271
+ # Momentarily turn off auto-fail to give us access to the tests
272
+ # exit status in `$?` for capturing.
273
+ set +e
274
+ (
275
+ # Set `-xe` before the test in the subshell. We want the
276
+ # test to fail fast to allow for more accurate output of
277
+ # where things went wrong but not in _our_ process because a
278
+ # failed test should not immediately fail roundup. Each
279
+ # tests trace output is saved in temporary storage.
280
+ set -xe
281
+ $roundup_test_name
282
+ ) >"$roundup_tmp/$roundup_test_name" 2>&1
283
+
284
+ # We need to capture the exit status before returning the `set
285
+ # -e` mode. Returning with `set -e` before we capture the exit
286
+ # status will result in `$?` being set with `set`'s status
287
+ # instead.
288
+ roundup_result=$?
289
+
290
+ # It's safe to return to normal operation.
291
+ set -e
292
+
293
+ # If `after` wasn't redefined, then this runs `:`.
294
+ after
295
+
296
+ # This is the final step of a test. Print its pass/fail signal
297
+ # and name.
298
+ if [ "$roundup_result" -ne 0 ]
299
+ then printf "f"
300
+ else printf "p"
301
+ fi
302
+
303
+ printf " $roundup_test_name\n"
304
+ )
305
+ done
306
+ )
307
+ done |
308
+
309
+ # All signals are piped to this for summary.
310
+ roundup_summarize
@@ -0,0 +1,95 @@
1
+ #!/bin/bash -e
2
+
3
+ #Script spec helpers
4
+
5
+ script_directory() {
6
+ "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
7
+ }
8
+
9
+ #Search argument 1 for substring in argument 2
10
+ search_substring() {
11
+ if echo "$1" | grep -q "$2"; then
12
+ echo 'found'
13
+ else
14
+ echo 'missing'
15
+ fi;
16
+ }
17
+
18
+ should_succeed() {
19
+ if [[ $? = 0 ]]; then
20
+ return 0
21
+ else
22
+ return 1
23
+ fi;
24
+ }
25
+
26
+ should_fail() {
27
+ ! should_succeed
28
+ }
29
+
30
+ file_should_exist() {
31
+ if [[ -f $1 ]];
32
+ then
33
+ return 0;
34
+ else
35
+ return 1;
36
+ fi;
37
+ }
38
+
39
+ file_should_not_exist() {
40
+ ! file_should_exist $1
41
+ }
42
+
43
+ enter_sandbox() {
44
+ __DIR__="$PWD"
45
+ rm -rf .sandbox
46
+ mkdir -p .sandbox
47
+ cd .sandbox
48
+ }
49
+
50
+ remove_sandbox() {
51
+ rm -rf .sandbox
52
+ }
53
+
54
+ generate_git_repo() {
55
+ enter_sandbox
56
+ git init
57
+ touch 'commit_1'
58
+ git add -A
59
+ git commit -am "Initial Commit"
60
+ }
61
+
62
+ generate_sandbox_tags() {
63
+ if [[ ! -f '.git' ]]; then
64
+ #Generate git repo & enter sandbox
65
+ generate_git_repo
66
+ fi;
67
+
68
+ #Optional arrays for sets of tags and commits
69
+ if [[ "$1" != '' ]]; then
70
+ declare -a tag_names=("${!1}")
71
+ else
72
+ local tag_names="$1"
73
+ fi;
74
+ if [[ "$2" != '' ]]; then
75
+ declare -a tag_commit_messages=("${!2}")
76
+ else
77
+ local tag_commit_messages="$2"
78
+ fi;
79
+
80
+ if [[ $tag_names = '' ]]; then
81
+ echo "Error - Please be specific on the tag names you want to generate";
82
+ exit 1;
83
+ fi;
84
+ for i in "${!tag_names[@]}"; do
85
+ touch "change${i}" &>/dev/null
86
+ git add -A &>/dev/null
87
+ local commit_message="${tag_commit_messages[$i]}"
88
+ if [[ "$commit_message" = '' ]]; then
89
+ #Use default commit message
90
+ commit_message="Change : ${i}";
91
+ fi;
92
+ git commit -m "$commit_message" &>/dev/null
93
+ git tag "${tag_names[$i]}" &>/dev/null
94
+ done;
95
+ }
@@ -0,0 +1,440 @@
1
+ #!/bin/bash -e
2
+
3
+ . ./test/test_helper.sh
4
+ . ./support/git-functions.sh
5
+ . ./support/changelog-functions.sh
6
+
7
+ describe "git-release - unit - changelog"
8
+
9
+ after() {
10
+ if [[ $MAINTAIN_SANDBOX != true ]]; then
11
+ remove_sandbox
12
+ fi;
13
+ }
14
+
15
+
16
+ #get_changelog_text_for_commits
17
+
18
+ it_uses_get_changelog_text_for_commits_to_return_titles_by_default() {
19
+ local tags=(
20
+ 'random_tag_1'
21
+ 'release/v1.0.5'
22
+ 'random_tag_2'
23
+ 'release/v1.0.6'
24
+ )
25
+
26
+ local commit_message_1="Release 1.0.6"
27
+ local commit_message_2="Random Release 2"
28
+ local commit_message_3="Older Release 1.0.5"
29
+
30
+ local commit_messages=(
31
+ "Random Release numero uno"
32
+ "$commit_message_3"
33
+ "$commit_message_2"
34
+ "$commit_message_1"
35
+ )
36
+ generate_sandbox_tags tags[@] commit_messages[@]
37
+
38
+ local commit_shas=$(get_commits_between_points "release/v1.0.5" "release/v1.0.6")
39
+
40
+ output=$(get_changelog_text_for_commits "$commit_shas")
41
+
42
+ test "$output" = "${commit_message_1}
43
+ ${commit_message_2}
44
+ ${commit_message_3}"
45
+ }
46
+
47
+ it_uses_get_changelog_text_for_commits_to_return_titles_with_a_custom_format() {
48
+ local tags=(
49
+ 'random_tag_1'
50
+ 'release/v1.0.5'
51
+ 'random_tag_2'
52
+ 'release/v1.0.6'
53
+ )
54
+
55
+ local commit_message_1="Release 1.0.6"
56
+ local commit_message_2="Random Release 2"
57
+ local commit_message_3="Older Release 1.0.5"
58
+
59
+ local commit_messages=(
60
+ "Random Release numero uno"
61
+ "$commit_message_3"
62
+ "$commit_message_2"
63
+ "$commit_message_1"
64
+ )
65
+ generate_sandbox_tags tags[@] commit_messages[@]
66
+
67
+ local commit_shas=$(get_commits_between_points "release/v1.0.5" "release/v1.0.6")
68
+ local sha_array=($commit_shas)
69
+
70
+ output=$(get_changelog_text_for_commits "--format=%H--%s" "$commit_shas")
71
+
72
+ test "$output" = "${sha_array[0]}--${commit_message_1}
73
+ ${sha_array[1]}--${commit_message_2}
74
+ ${sha_array[2]}--${commit_message_3}"
75
+ }
76
+
77
+ it_uses_get_changelog_text_for_commits_to_return_titles_grouped_by_tags() {
78
+ local tags=(
79
+ "releases/v0.0.3"
80
+ "releases/v0.0.4"
81
+ "releases/v0.1.4"
82
+ "releases/v1.1.4"
83
+ "releases/v1.1.5"
84
+ "releases/v1.1.6"
85
+ )
86
+ local commit_messages=(
87
+ "Start of the project"
88
+ "[bugs]Argh, I fixed a bug here"
89
+ "[feature] OMG. I had time to write something of use"
90
+ "[features]Its so exciting writing useful things!!"
91
+ "[bug] What comes up, must come down"
92
+ "Some random tweak fix"
93
+ )
94
+ generate_sandbox_tags tags[@] commit_messages[@]
95
+ local commit_shas=$(get_commits_between_points "${tags[0]}" "${tags[5]}")
96
+
97
+ output=$(get_changelog_text_for_commits "$commit_shas")
98
+
99
+ local sha_array=($commit_shas)
100
+ test "$output" = "Features:
101
+ Its so exciting writing useful things!!
102
+ OMG. I had time to write something of use
103
+
104
+ Bugs:
105
+ What comes up, must come down
106
+ Argh, I fixed a bug here
107
+
108
+ Some random tweak fix
109
+ Start of the project"
110
+ }
111
+
112
+ it_uses_get_changelog_text_for_commits_to_return_titles_grouped_by_tags_case_insensitive() {
113
+ local tags=(
114
+ "releases/v0.0.3"
115
+ "releases/v1.1.5"
116
+ "releases/v1.1.6"
117
+ )
118
+ local commit_messages=(
119
+ "[Bug] Start of the project"
120
+ "[BUGS] Argh, I fixed a bug here"
121
+ "[fEaTuRes] OMG. I had time to write something of use"
122
+ )
123
+ generate_sandbox_tags tags[@] commit_messages[@]
124
+ local commit_shas=$(get_commits_between_points "${tags[0]}" "${tags[2]}")
125
+
126
+ output=$(get_changelog_text_for_commits "$commit_shas")
127
+
128
+ test "$output" = "Features:
129
+ OMG. I had time to write something of use
130
+
131
+ Bugs:
132
+ Argh, I fixed a bug here
133
+ Start of the project"
134
+ }
135
+
136
+ it_uses_get_changelog_text_for_commits_to_return_titles_grouped_by_tags_with_multiple_brackets() {
137
+ local tags=(
138
+ "releases/v0.0.3"
139
+ "releases/v1.1.6"
140
+ )
141
+ local commit_messages=(
142
+ "[BUGS] [QC Some Reference][More Custom References] Fixed the tagged bugs"
143
+ "[fEaTuRes][Additonal Tag one] Another referenced feature"
144
+ )
145
+ generate_sandbox_tags tags[@] commit_messages[@]
146
+ local commit_shas=$(get_commits_between_points "${tags[0]}" "${tags[1]}")
147
+
148
+ output=$(get_changelog_text_for_commits "$commit_shas")
149
+
150
+ test "$output" = "Features:
151
+ [Additonal Tag one] Another referenced feature
152
+
153
+ Bugs:
154
+ [QC Some Reference][More Custom References] Fixed the tagged bugs"
155
+ }
156
+
157
+ #generate_changelog_content
158
+
159
+ it_uses_generate_changelog_content_to_exit_with_errors_without_release_name() {
160
+ generate_git_repo
161
+
162
+ should_fail $(generate_changelog_content)
163
+ should_fail $(generate_changelog_content '')
164
+ }
165
+
166
+ it_uses_generate_changelog_content_to_exit_with_errors_with_invalid_commit_filter() {
167
+ generate_git_repo
168
+
169
+ should_fail $(generate_changelog_content 'AnyOldReleaseName')
170
+ should_fail $(generate_changelog_content 'AnyOldReleaseName' '')
171
+ should_fail $(generate_changelog_content 'AnyOldReleaseName' ':unknown')
172
+ should_fail $(generate_changelog_content 'AnyOldReleaseName' ':anything')
173
+
174
+ should_succeed $(generate_changelog_content 'AnyOldReleaseName' ':all_commits')
175
+ should_succeed $(generate_changelog_content 'AnyOldReleaseName' ':pulls_only')
176
+ }
177
+
178
+ it_uses_generate_changelog_content_to_succeed_without_a_startpoint() {
179
+ generate_git_repo
180
+
181
+ should_succeed $(generate_changelog_content 'v0.0.5' ':all_commits' '' 'releases/end/v02.34')
182
+ }
183
+
184
+ it_uses_generate_changelog_content_to_succeed_without_an_endpoint() {
185
+ generate_git_repo
186
+
187
+ should_succeed $(generate_changelog_content 'v0.0.5' ':all_commits' 'releases/v1.0.45')
188
+ }
189
+
190
+ it_uses_generate_changelog_content_to_generate_with_all_commit_messages(){
191
+ local tags=(
192
+ 'random_tag_1'
193
+ 'release/v1.0.5'
194
+ 'random_tag_2'
195
+ 'release/v1.0.6'
196
+ )
197
+ local commit_messages=(
198
+ 'Message For Random Tag 1'
199
+ '[Any Old] Message for 1.0.5'
200
+ 'Lots of changes in this commit for random tag 2'
201
+ 'latest release to 1.0.6'
202
+ )
203
+
204
+ generate_sandbox_tags tags[@] commit_messages[@]
205
+
206
+ local custom_release_name="v1.0.7"
207
+ local output=$(generate_changelog_content "$custom_release_name" ':all_commits')
208
+
209
+ test "$output" = "$(changelog_divider)
210
+ || Release: ${custom_release_name}
211
+ || Released on $(get_current_release_date)
212
+ $(changelog_divider)
213
+ ${commit_messages[3]}
214
+ ${commit_messages[2]}
215
+ ${commit_messages[1]}
216
+ ${commit_messages[0]}
217
+ $(get_commit_message_for_first_commit)
218
+ $(changelog_divider)"
219
+ }
220
+
221
+ it_uses_generate_changelog_content_to_generate_with_commit_messages_for_a_range(){
222
+ local tags=(
223
+ 'random_tag_1'
224
+ 'release/v1.0.5'
225
+ 'random_tag_2'
226
+ 'release/v1.0.6'
227
+ )
228
+ local commit_messages=(
229
+ 'Message For Random Tag 1'
230
+ '[Any Old] Message for 1.0.5'
231
+ 'Lots of changes in this commit for random tag 2'
232
+ 'latest release to 1.0.6'
233
+ )
234
+
235
+ generate_sandbox_tags tags[@] commit_messages[@]
236
+
237
+ local custom_release_name="v1.0.7"
238
+ local output=$(generate_changelog_content "$custom_release_name" ':all_commits' 'release/v1.0.5' 'random_tag_2')
239
+
240
+ test "$output" = "$(changelog_divider)
241
+ || Release: ${custom_release_name}
242
+ || Released on $(get_current_release_date)
243
+ $(changelog_divider)
244
+ ${commit_messages[2]}
245
+ ${commit_messages[1]}
246
+ $(changelog_divider)"
247
+ }
248
+
249
+ it_uses_generate_changelog_content_to_generate_scoped_to_only_pull_requests(){
250
+ local tags=(
251
+ 'tag_with_pulls_1'
252
+ 'tag_witout_pull'
253
+ 'tag_with_pulls_2'
254
+ 'another_tag_without'
255
+ 'tag_with_pulls_3'
256
+ 'tag_with_pulls_4'
257
+ )
258
+ local commit_messages=(
259
+ "Merge pull request #705 from Ferocia/bug/limit-payment-description-length
260
+
261
+ [BUG] Pay anyone from the accounts screen"
262
+ " This commit is not a pull request and should be ignored"
263
+ "Merge pull request #722 from Ferocia/feature/running-balance-field (Anthony Langhorne, 18 hours ago)
264
+
265
+ [Features] This is a pull request merging a feature across multiple
266
+ lines and continuing"
267
+ " Yet another commit,that isn't a pull request"
268
+ "Merge pull request #714 from Ferocia/fix-customer-login
269
+
270
+ Fixing the customer login but no tag displayed."
271
+ "Merge pull request #685 from Ferocia/bug/modal-new-payee
272
+
273
+ [Security] Commit fixing the modal with security flaw"
274
+ )
275
+
276
+ generate_sandbox_tags tags[@] commit_messages[@]
277
+
278
+ local custom_release_name="v2.0.5"
279
+ local output=$(generate_changelog_content "$custom_release_name" ':pulls_only')
280
+
281
+ test "$output" = "$(changelog_divider)
282
+ || Release: ${custom_release_name}
283
+ || Released on $(get_current_release_date)
284
+ $(changelog_divider)
285
+ Features:
286
+ This is a pull request merging a feature across multiple
287
+ lines and continuing
288
+
289
+ Security:
290
+ Commit fixing the modal with security flaw
291
+
292
+ Bugs:
293
+ Pay anyone from the accounts screen
294
+
295
+ Fixing the customer login but no tag displayed.
296
+ $(changelog_divider)"
297
+ }
298
+
299
+ #generate_version_file
300
+
301
+ it_uses_generate_version_file_to_fail_with_no_version_number_passed() {
302
+ should_fail $(generate_version_file)
303
+ }
304
+
305
+ it_uses_generate_version_file_to_create_a_version_file() {
306
+ enter_sandbox
307
+
308
+ file_should_not_exist "VERSION"
309
+
310
+ generate_version_file 'v12.03.23'
311
+
312
+ file_should_exist "VERSION"
313
+
314
+ test "$(cat VERSION)" = "v12.03.23"
315
+ }
316
+
317
+ it_uses_generate_version_file_to_create_a_custom_version_file() {
318
+ enter_sandbox
319
+
320
+ file_should_not_exist "CUSTOM_VERSION"
321
+
322
+ generate_version_file 'v12.03.23' 'CUSTOM_VERSION'
323
+
324
+ file_should_exist "CUSTOM_VERSION"
325
+
326
+ test "`cat CUSTOM_VERSION`" = "v12.03.23"
327
+ }
328
+
329
+ it_uses_generate_version_file_to_replace_any_existing_version_file() {
330
+ enter_sandbox
331
+
332
+ file_should_not_exist "VERSION"
333
+
334
+ generate_version_file 'v12.03.23'
335
+
336
+ file_should_exist "VERSION"
337
+
338
+ test "`cat VERSION`" = "v12.03.23"
339
+
340
+ generate_version_file 'v14.05.25'
341
+
342
+ test "`cat VERSION`" = "v14.05.25"
343
+ }
344
+
345
+ #generate_changelog_file
346
+
347
+ it_uses_generate_changelog_file_to_fail_with_content_passed_or_strategy() {
348
+ enter_sandbox
349
+
350
+ should_fail $(generate_changelog_file)
351
+ should_fail $(generate_changelog_file 'some content')
352
+ should_fail $(generate_changelog_file 'some content' '')
353
+
354
+ should_succeed $(generate_changelog_file 'some content' ':overwrite')
355
+ }
356
+
357
+ it_uses_generate_changelog_file_to_fail_with_invalid_strategy() {
358
+ enter_sandbox
359
+
360
+ should_fail $(generate_changelog_file 'some content' '')
361
+ should_fail $(generate_changelog_file 'some content' ':anything')
362
+ should_fail $(generate_changelog_file 'some content' ':unknown')
363
+
364
+
365
+ should_succeed $(generate_changelog_file 'some content' ':overwrite')
366
+ should_succeed $(generate_changelog_file 'some content' ':append')
367
+ }
368
+
369
+ it_uses_generate_changelog_file_file_to_create_a_changelog_file() {
370
+ enter_sandbox
371
+
372
+ file_should_not_exist "CHANGELOG"
373
+
374
+ local content="
375
+ My Content
376
+ Is Here Across Multiple Lines
377
+ "
378
+ local output=$(generate_changelog_file "$content" ':overwrite')
379
+
380
+ file_should_exist "CHANGELOG"
381
+
382
+ test "$(cat CHANGELOG)" = "$content
383
+ $(changelog_footer)"
384
+ }
385
+
386
+ it_uses_generate_changelog_file_file_to_create_a_custom_version_file() {
387
+ enter_sandbox
388
+
389
+ file_should_not_exist "CHANGELOG"
390
+ file_should_not_exist "CUSTOM_CHANGELOG"
391
+
392
+ local content="
393
+ My Content
394
+ Is Here Across Multiple Lines
395
+ "
396
+ output=$(generate_changelog_file "$content" ':overwrite' 'CUSTOM_CHANGELOG')
397
+
398
+ file_should_not_exist "CHANGELOG"
399
+ file_should_exist "CUSTOM_CHANGELOG"
400
+
401
+ test "`cat CUSTOM_CHANGELOG`" = "$content
402
+ $(changelog_footer)"
403
+ }
404
+
405
+ it_uses_generate_changelog_file_to_replace_any_existing_file_with_overwrite_strategy() {
406
+ enter_sandbox
407
+
408
+ file_should_not_exist "CHANGELOG"
409
+
410
+ output=$(generate_changelog_file 'Original Content' ':overwrite')
411
+
412
+ file_should_exist "CHANGELOG"
413
+
414
+ test "`cat CHANGELOG`" = "Original Content
415
+ $(changelog_footer)"
416
+
417
+ generate_changelog_file 'Updated Content' ':overwrite'
418
+
419
+ test "`cat CHANGELOG`" = "Updated Content
420
+ $(changelog_footer)"
421
+ }
422
+
423
+ it_uses_generate_changelog_file_to_append_to_any_existing_file_with_append_strategy() {
424
+ enter_sandbox
425
+
426
+ file_should_not_exist "CHANGELOG"
427
+
428
+ generate_changelog_file 'Original Content' ':append'
429
+
430
+ file_should_exist "CHANGELOG"
431
+
432
+ test "`cat CHANGELOG`" = "Original Content
433
+ $(changelog_footer)"
434
+
435
+ generate_changelog_file 'Updated Content' ':append'
436
+
437
+ test "`cat CHANGELOG`" = "Updated Content
438
+ Original Content
439
+ $(changelog_footer)"
440
+ }