create_changelog 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/ccl +10 -3
- data/bin/ccl~ +102 -44
- data/features/changelog_only_recent_changes.feature +51 -0
- data/features/changelog_only_recent_changes.feature~ +51 -0
- data/features/changelog_without_recent_changes.feature +51 -0
- data/features/changelog_without_recent_changes.feature~ +50 -0
- data/features/commandline.feature~ +21 -0
- data/features/complete_changelog.feature +51 -0
- data/features/complete_changelog.feature~ +51 -0
- data/features/create_changelog.feature~ +19 -0
- data/features/decorate_output.feature +30 -0
- data/features/decorate_output.feature~ +30 -0
- data/features/prepare_release.feature~ +26 -0
- data/features/step_definitions/git_steps.rb +61 -0
- data/features/step_definitions/git_steps.rb~ +74 -0
- data/features/step_definitions/stdout_steps.rb +7 -0
- data/features/step_definitions/stdout_steps.rb~ +10 -0
- data/features/support/assertions.rb +7 -0
- data/features/support/assertions.rb~ +7 -0
- data/features/support/env.rb +1 -0
- data/features/support/env.rb~ +6 -0
- data/lib/array.rb~ +18 -0
- data/lib/changelog.rb +5 -1
- data/lib/changelog.rb~ +14 -14
- data/lib/changelog_filter.rb~ +58 -0
- data/lib/commit_changelog.rb~ +9 -1
- data/lib/git.rb +66 -0
- data/lib/git.rb~ +76 -1
- data/lib/tag.rb~ +4 -5
- data/lib/tag_list.rb~ +13 -2
- data/lib/version.rb +1 -1
- data/lib/version.rb~ +1 -1
- data/test/test_changelog_filter.rb +21 -0
- data/test/test_changelog_filter.rb~ +19 -0
- data/test/test_tag_list.rb +12 -0
- data/test/test_tag_list.rb~ +12 -0
- metadata +74 -7
@@ -0,0 +1,51 @@
|
|
1
|
+
@announce
|
2
|
+
Feature: Creating a complete, decorated changelog.
|
3
|
+
|
4
|
+
Scenario: Repository with identical changelog lines only in commit messages
|
5
|
+
Given an empty Git repository
|
6
|
+
When 2 commits with standard changelog line are added
|
7
|
+
And I successfully run `ccl`
|
8
|
+
Then the stdout should contain 1 line starting with "- "
|
9
|
+
|
10
|
+
Scenario: Repository with multiple changelog lines only in commit messages
|
11
|
+
Given an empty Git repository
|
12
|
+
When 3 commits with unique changelog line are added
|
13
|
+
And I successfully run `ccl`
|
14
|
+
Then the stdout should contain 3 lines starting with "- "
|
15
|
+
|
16
|
+
Scenario: Changelog lines in commit messages and tag without changelog line
|
17
|
+
Given an empty Git repository
|
18
|
+
When 3 commits with unique changelog line are added
|
19
|
+
And a tag without changelog line is added
|
20
|
+
And I successfully run `ccl`
|
21
|
+
Then the stdout should contain 3 lines starting with "- "
|
22
|
+
|
23
|
+
Scenario: Changelog lines in commit messages and tag with different changelog line
|
24
|
+
Given an empty Git repository
|
25
|
+
When 3 commits with unique changelog line are added
|
26
|
+
And a tag with unique changelog line is added
|
27
|
+
And I successfully run `ccl`
|
28
|
+
Then the stdout should contain 4 lines starting with "- "
|
29
|
+
|
30
|
+
Scenario: Changelog lines in commit messages and tag with same changelog line
|
31
|
+
Given an empty Git repository
|
32
|
+
When 3 commits with standard changelog line are added
|
33
|
+
And a tag with standard changelog line is added
|
34
|
+
And I successfully run `ccl`
|
35
|
+
Then the stdout should contain 1 line starting with "- "
|
36
|
+
|
37
|
+
Scenario: Unique changelog lines in commit messages, tag, and recent commits
|
38
|
+
Given an empty Git repository
|
39
|
+
When 3 commits with unique changelog line are added
|
40
|
+
And a tag with unique changelog line is added
|
41
|
+
And 2 commits with unique changelog line are added
|
42
|
+
And I successfully run `ccl`
|
43
|
+
Then the stdout should contain 6 lines starting with "- "
|
44
|
+
|
45
|
+
Scenario: Same changelog lines in commit messages, tag, and recent commits
|
46
|
+
Given an empty Git repository
|
47
|
+
When 3 commits with standard changelog line are added
|
48
|
+
And a tag with standard changelog line is added
|
49
|
+
And 2 commits with standard changelog line are added
|
50
|
+
And I successfully run `ccl`
|
51
|
+
Then the stdout should contain 2 lines starting with "- "
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Feature: Creating a complete, decorated changelog
|
2
|
+
|
3
|
+
Scenario: Repository with identical changelog lines only in commit messages
|
4
|
+
Given an empty Git repository
|
5
|
+
When 2 commits with identical changelog lines are added
|
6
|
+
And I successfully run `ccl`
|
7
|
+
Then the stdout should contain 1 line starting with "- "
|
8
|
+
|
9
|
+
Scenario: Log lines only in commit messages, generate without recent
|
10
|
+
Given an empty Git repository
|
11
|
+
When 2 commits with identical changelog lines are added
|
12
|
+
When I successfully run `ccl --no-recent`
|
13
|
+
Then the stdout should not contain anything
|
14
|
+
|
15
|
+
Scenario: Repository with multiple changelog lines only in commit messages
|
16
|
+
Given an empty Git repository
|
17
|
+
When 3 commits with unique changelog lines are added
|
18
|
+
And I successfully run `ccl`
|
19
|
+
Then the stdout should contain 3 line starting with "- "
|
@@ -0,0 +1,30 @@
|
|
1
|
+
@announce
|
2
|
+
Feature: Output may be decorated
|
3
|
+
|
4
|
+
Scenario: Creating complete changelog
|
5
|
+
Given an empty Git repository
|
6
|
+
When 2 commits with standard changelog line are added
|
7
|
+
And I successfully run `ccl`
|
8
|
+
Then the stdout should contain "====="
|
9
|
+
And the stdout should contain "* * *"
|
10
|
+
|
11
|
+
Scenario: Creating changelog without recent changes
|
12
|
+
Given an empty Git repository
|
13
|
+
When 2 commits with standard changelog line are added
|
14
|
+
And I successfully run `ccl --no-recent`
|
15
|
+
Then the stdout should not contain anything
|
16
|
+
|
17
|
+
Scenario: Creating changelog with recent changes only
|
18
|
+
Given an empty Git repository
|
19
|
+
When 2 commits with standard changelog line are added
|
20
|
+
And I successfully run `ccl --recent`
|
21
|
+
Then the stdout should not contain "====="
|
22
|
+
And the stdout should not contain "* * *"
|
23
|
+
|
24
|
+
Scenario: Creating changelog with custom 'recent' heading
|
25
|
+
Given an empty Git repository
|
26
|
+
When 2 commits with standard changelog line are added
|
27
|
+
And I successfully run `ccl TEST_VERSION`
|
28
|
+
Then the stdout should contain "TEST_VERSION"
|
29
|
+
And the stdout should contain "====="
|
30
|
+
And the stdout should contain "* * *"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
@announce
|
2
|
+
Feature: Output may be decorated
|
3
|
+
|
4
|
+
Scenario: Creating complete changelog
|
5
|
+
Given an empty Git repository
|
6
|
+
When 2 commits with standard changelog line are added
|
7
|
+
And I successfully run `ccl`
|
8
|
+
Then the stdout should contain "====="
|
9
|
+
And the stdout should contain "* * *
|
10
|
+
|
11
|
+
Scenario: Creating changelog without recent changes
|
12
|
+
Given an empty Git repository
|
13
|
+
When 2 commits with standard changelog line are added
|
14
|
+
And I successfully run `ccl --no-recent`
|
15
|
+
Then the stdout should not contain anything
|
16
|
+
|
17
|
+
Scenario: Creating changelog with recent changes only
|
18
|
+
Given an empty Git repository
|
19
|
+
When 2 commits with standard changelog line are added
|
20
|
+
And I successfully run `ccl --recent`
|
21
|
+
Then the stdout should not contain "====="
|
22
|
+
And the stdout should not contain "* * *"
|
23
|
+
|
24
|
+
Scenario: Creating changelog with custom 'recent' heading
|
25
|
+
Given an empty Git repository
|
26
|
+
When 2 commits with standard changelog line are added
|
27
|
+
And I successfully run `ccl TEST_VERSION`
|
28
|
+
Then the stdout should contain "TEST_VERSION"
|
29
|
+
And the stdout should contain "====="
|
30
|
+
And the stdout should contain "* * *"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Feature: Prepare-release workflow
|
2
|
+
|
3
|
+
Scenario: Prepare-release fails if current branch is not release branch
|
4
|
+
Given an empty Git repository
|
5
|
+
When I run `ccl --prepare-release 1.0.0`
|
6
|
+
Then the exit status should not be 0
|
7
|
+
|
8
|
+
Scenario: Prepare-release requires tag name on the command line
|
9
|
+
Given an empty Git repository
|
10
|
+
And a new branch "release-1.0.0"
|
11
|
+
When I run `ccl --prepare-release`
|
12
|
+
Then the exit status should not be 0
|
13
|
+
And the stderr should contain "FATAL: Missing argument: TAG"
|
14
|
+
|
15
|
+
Scenario: Prepare-release aborts if annotation is empty
|
16
|
+
Given an empty Git repository
|
17
|
+
And a new branch "release-1.0.0"
|
18
|
+
When I run `ccl --prepare-release`
|
19
|
+
Then the stdout should contain "aborted"
|
20
|
+
And the current branch should be "release-1.0.0"
|
21
|
+
|
22
|
+
Scenario: Prepare-release checks out master branch and tags it
|
23
|
+
Given an empty Git repository
|
24
|
+
And a new branch "release-1.0.0"
|
25
|
+
When I run `ccl --prepare-release 1.0.0`
|
26
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'securerandom'
|
3
|
+
|
4
|
+
Given /^an empty Git repository$/ do
|
5
|
+
in_current_dir do
|
6
|
+
`git init`
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
When(/^(\d+) commits with standard changelog line are added$/) do |n|
|
11
|
+
in_current_dir do
|
12
|
+
n.to_i.times do
|
13
|
+
alter_dummy_file
|
14
|
+
`git add -A`
|
15
|
+
`git commit -m 'heading' -m '#{standard_log_entry}'`
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
When(/^(\d+) commits with unique changelog line are added$/) do |n|
|
21
|
+
in_current_dir do
|
22
|
+
n.to_i.times do
|
23
|
+
alter_dummy_file
|
24
|
+
`git add -A`
|
25
|
+
`git commit -m 'heading' -m '#{random_log_entry}'`
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
When(/a tag without changelog line is added/) do
|
31
|
+
in_current_dir do
|
32
|
+
`git tag -a some-tag -m "Some tag"`
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
When(/a tag with unique changelog line is added/) do
|
37
|
+
in_current_dir do
|
38
|
+
`git tag -a some-tag -m "Some tag" -m '#{random_log_entry}'`
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
When(/a tag with standard changelog line is added/) do
|
43
|
+
in_current_dir do
|
44
|
+
`git tag -a some-tag -m "Some tag" -m '#{standard_log_entry}'`
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def alter_dummy_file
|
49
|
+
open 'dummy_file_for_commits.txt', 'a' do |f|
|
50
|
+
f.puts 'some text'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def standard_log_entry
|
55
|
+
"- INFO: This is a standard log entry for testing"
|
56
|
+
end
|
57
|
+
|
58
|
+
def random_log_entry
|
59
|
+
# ('a'..'z').to_a.shuffle[0,8].join
|
60
|
+
"- INFO: This is a unique log entry for testing - #{SecureRandom.hex}"
|
61
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'securerandom'
|
3
|
+
require '../lib/git.rb'
|
4
|
+
|
5
|
+
Given(/^an empty Git repository$/) do
|
6
|
+
in_current_dir do
|
7
|
+
`git init`
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
When(/^(\d+) commits with standard changelog line are added$/) do |n|
|
12
|
+
in_current_dir do
|
13
|
+
n.to_i.times do
|
14
|
+
alter_dummy_file
|
15
|
+
`git add -A`
|
16
|
+
`git commit -m 'heading' -m '#{standard_log_entry}'`
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
When(/^(\d+) commits with unique changelog line are added$/) do |n|
|
22
|
+
in_current_dir do
|
23
|
+
n.to_i.times do
|
24
|
+
alter_dummy_file
|
25
|
+
`git add -A`
|
26
|
+
`git commit -m 'heading' -m '#{random_log_entry}'`
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
When(/a tag without changelog line is added/) do
|
32
|
+
in_current_dir do
|
33
|
+
`git tag -a some-tag -m "Some tag"`
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
When(/a tag with unique changelog line is added/) do
|
38
|
+
in_current_dir do
|
39
|
+
`git tag -a some-tag -m "Some tag" -m '#{random_log_entry}'`
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
When(/a tag with standard changelog line is added/) do
|
44
|
+
in_current_dir do
|
45
|
+
`git tag -a some-tag -m "Some tag" -m '#{standard_log_entry}'`
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
Given(/a new branch "([^"]+)"/) do |branch|
|
50
|
+
in_current_dir do
|
51
|
+
Git.new_branch branch
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
Then(/the current branch should be "([^"]+)"/) do |branch|
|
56
|
+
in_current_dir do
|
57
|
+
Git.current_branch == branch
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def alter_dummy_file
|
62
|
+
open 'dummy_file_for_commits.txt', 'a' do |f|
|
63
|
+
f.puts 'some text'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def standard_log_entry
|
68
|
+
"- INFO: This is a standard log entry for testing"
|
69
|
+
end
|
70
|
+
|
71
|
+
def random_log_entry
|
72
|
+
# ('a'..'z').to_a.shuffle[0,8].join
|
73
|
+
"- INFO: This is a unique log entry for testing - #{SecureRandom.hex}"
|
74
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Then(/^the stdout should contain 1 line starting with "([^"]*)"$/) do |s|
|
2
|
+
expected = "(^#{s}.*\n){1}"
|
3
|
+
assert_matching_output(expected, all_output)
|
4
|
+
end
|
5
|
+
|
6
|
+
Then(/^the stdout should contain (\d+) lines starting with "([^"]*)"$/) do |n, s|
|
7
|
+
# expected = "(^#{s}.*\n){#{n}}"
|
8
|
+
# assert_matching_output(expected, all_output)
|
9
|
+
assert_lines_starting_with all_stdout, n, s
|
10
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
# Checks whether a mult-line text contains a specific number
|
2
|
+
# of lines that start with a given sequence.
|
3
|
+
def assert_lines_starting_with(text, number, start_with)
|
4
|
+
number = number.to_i if number.is_a? String
|
5
|
+
count = text.split("\n").count { |line| line.start_with? start_with }
|
6
|
+
expect(count).to eq number
|
7
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
# Checks whether a mult-line text contains a specific number
|
2
|
+
# of lines that start with a given sequence.
|
3
|
+
def assert_lines_starting_with(text, number, start_with)
|
4
|
+
number = number.to_i if number.is_a(String)
|
5
|
+
count = text.split("\n").count { |line| line.start_with? start_with }
|
6
|
+
expect(count).to eq number
|
7
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'aruba/cucumber'
|
data/lib/array.rb~
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# Removes common indentation from an array of strings
|
2
|
+
class Array
|
3
|
+
def remove_indent
|
4
|
+
lines_with_indent = self.select do |line|
|
5
|
+
line.size > 0
|
6
|
+
end
|
7
|
+
indents = lines_with_indent.map do |line|
|
8
|
+
match = line.match(/^( +)([^ ]|$)+/)
|
9
|
+
match ? match[1].size : 0
|
10
|
+
end
|
11
|
+
indent = indents.min
|
12
|
+
self.map do |line|
|
13
|
+
line[indent..-1]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# vim: nospell
|
data/lib/changelog.rb
CHANGED
@@ -93,7 +93,11 @@ class Changelog
|
|
93
93
|
|
94
94
|
# Combine changelog entries from tag annotation and commit messages
|
95
95
|
if tag.changelog
|
96
|
-
|
96
|
+
if commit_changelog.changelog
|
97
|
+
combined_changelog = tag.changelog.concat(commit_changelog.changelog)
|
98
|
+
else
|
99
|
+
combined_changelog = tag.changelog
|
100
|
+
end
|
97
101
|
else
|
98
102
|
combined_changelog = commit_changelog.changelog
|
99
103
|
end
|
data/lib/changelog.rb~
CHANGED
@@ -30,12 +30,12 @@ class Changelog
|
|
30
30
|
# Generates a decorated changelog for the entire commit history.
|
31
31
|
#
|
32
32
|
# @param [bool] exclude_recent
|
33
|
-
#
|
34
|
-
#
|
33
|
+
# Indicates whether to exclude recent changelog lines that were
|
34
|
+
# added since the last tag.
|
35
35
|
#
|
36
36
|
# @return [String]
|
37
|
-
#
|
38
|
-
#
|
37
|
+
# Decorated changelog, or nil if no lines were found.
|
38
|
+
#
|
39
39
|
def generate(exclude_recent = false)
|
40
40
|
# Traverse tags
|
41
41
|
@@tags = TagList.new(!exclude_recent)
|
@@ -50,8 +50,8 @@ class Changelog
|
|
50
50
|
# since the most recent tag.
|
51
51
|
#
|
52
52
|
# @return [Array]
|
53
|
-
#
|
54
|
-
#
|
53
|
+
# Array of changelog lines, or nil if no lines were found.
|
54
|
+
#
|
55
55
|
def generate_recent
|
56
56
|
@@tags = TagList.new
|
57
57
|
log = CommitChangelog.new(@@tags.list[0], @@tags.list[1])
|
@@ -73,17 +73,17 @@ class Changelog
|
|
73
73
|
# repository.
|
74
74
|
#
|
75
75
|
# @param [String] current_tag
|
76
|
-
#
|
77
|
-
#
|
76
|
+
# Version tag for which to collect changelog information.
|
77
|
+
#
|
78
78
|
# @param [String] previous_tag
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
79
|
+
# Previous version tag whose changelog information does not belong to
|
80
|
+
# the current version's changelog information. However, if previous_tag
|
81
|
+
# is the Sha-1 hash of the initial commit, its changelog lines _will_ be
|
82
|
+
# included.
|
83
83
|
#
|
84
84
|
# @return [String]
|
85
|
-
#
|
86
|
-
#
|
85
|
+
# Changelog decorated with markdown formatting, or empty string.
|
86
|
+
#
|
87
87
|
def generate_for(current_tag, previous_tag)
|
88
88
|
tag = Tag.new(current_tag)
|
89
89
|
commit_changelog = CommitChangelog.new(current_tag, previous_tag)
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# changelog_filter.rb, part of Create-changelog
|
2
|
+
# Copyright 2015 Daniel Kraus
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require_relative 'array'
|
16
|
+
|
17
|
+
# Filters a text or array for changelog entries.
|
18
|
+
class ChangelogFilter
|
19
|
+
# Factory method that creates an instance given a text string
|
20
|
+
def self.FromString(string)
|
21
|
+
unless string.is_a?(String)
|
22
|
+
fail "Must call this factory with String, not " + string.class.to_s
|
23
|
+
end
|
24
|
+
self.FromArray(string.chomp.split("\n"))
|
25
|
+
end
|
26
|
+
|
27
|
+
# Factory method that creates an instance given an array of strings
|
28
|
+
def self.FromArray(ary)
|
29
|
+
unless ary.is_a?(Array)
|
30
|
+
fail "Must call this factory with Array, not " + ary.class.to_s
|
31
|
+
end
|
32
|
+
filter = ChangelogFilter.new
|
33
|
+
log, text = ary.partition do |line|
|
34
|
+
line.match(pattern)
|
35
|
+
end
|
36
|
+
filter.changelog = log.uniq.sort.remove_indent if log.length > 0
|
37
|
+
filter.other_text = text if text.length > 0
|
38
|
+
filter
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns the grep string that matches changelog entries.
|
42
|
+
def self.pattern
|
43
|
+
'\s*[*-]\s+[^:]+:\s'
|
44
|
+
end
|
45
|
+
|
46
|
+
# An array of changelog entries.
|
47
|
+
attr_accessor :changelog
|
48
|
+
|
49
|
+
# An array of text lines that are not changelog entries.
|
50
|
+
attr_accessor :other_text
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def initialize
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# vim: nospell
|