create_changelog 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bd381224eb8e14e9bdbb5b5b58dedb315b2390ab
4
- data.tar.gz: 3713419603968048a91c5bb5eb02f0df554b263e
3
+ metadata.gz: dbb6680237cbad0391a0726ceb5bcb78dc4a53c9
4
+ data.tar.gz: caf83089dd06505fcd8acb43f17f0b5e587f9829
5
5
  SHA512:
6
- metadata.gz: 1a38fea06c029efe529b4defb5cab2a772df00a554ea5f27eef7250c278eb46e5e686fe06b5b8a33d9c7fd09d8e67b0b6d624e2993262d3fc7785b28801c0837
7
- data.tar.gz: a9dc791d30ca360cbf964a8c303da4c9f44e152c858fc12c76c7732b6ddc747b87c7a87fdbb144e8fb1729e06296d0b5163501804f53a512dd17b20eebb8639e
6
+ metadata.gz: 22bc16e610025ba7d66e02552327c0e17e0271af8f550a7fd425dbf6e8b5fb914ddaf1b02c427aeca65f9354cdbd4fd85d2b860e317f4bb1e34bfb1b47f22efe
7
+ data.tar.gz: ce631d8ff2693ab82f0946a6d9662dd98b521bd1341e4d2a87a5fd94464e3180cd5f1dbc26d23ff280fd66432b929806b2b32c75978b5520eb13547dfd5d4dd1
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ Version 1.2.0 (2015-01-18)
2
+ ========================================================================
3
+
4
+ - FIX: Make "-r", "--recent" option actually work.
5
+ - FIX: Prevent combining -n and -r switch irrespective of order.
6
+ - NEW: Switch "-v", "--version" to print out the current version.
7
+
8
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
9
+
10
+
1
11
  Version 1.1.0 (2015-01-18)
2
12
  ========================================================================
3
13
 
data/README.md CHANGED
@@ -112,6 +112,8 @@ Live example
112
112
 
113
113
  <http://xltoolbox.sf.net/changelog-ng>
114
114
 
115
+ ... or of course [CHANGELOG.md][] in this repository.
116
+
115
117
 
116
118
  Code
117
119
  ----
@@ -119,6 +121,9 @@ Code
119
121
  To understand the code, you can run `rdoc` in the repository's
120
122
  directory. The resulting `doc` subdirectory will be ignored by Git.
121
123
 
124
+ Alternatively, you may browse
125
+ <http://www.rubydoc.info/github/bovender/create-changelog>.
126
+
122
127
 
123
128
  License
124
129
  -------
@@ -142,5 +147,6 @@ License
142
147
  [pandoc]: http://johnmacfarlane.net/pandoc
143
148
  [nanoc]: http://nanoc.ws
144
149
  [kacl]: http://keepachangelog.com
150
+ [CHANGELOG.md]: CHANGELOG.md
145
151
 
146
152
  <!-- vim: set tw=72 : -->
data/bin/ccl CHANGED
@@ -28,26 +28,32 @@ def main
28
28
  working_dir = Dir.pwd
29
29
  option_parser = OptionParser.new do |opts|
30
30
  exe_name = File.basename($PROGRAM_NAME)
31
- opts.banner = "#{exe_name} version #{CreateChangelog::VERSION}\n"
31
+ opts.banner = "create_changelog version #{CreateChangelog::VERSION}\n"
32
32
  opts.banner += "Creates changelog from log entries in git log\n"
33
33
  opts.banner += "Usage: #{exe_name} [options] [current_version]"
34
34
  opts.on("-r", "--recent",
35
35
  "Include only most recent changes") do
36
- abort "FATAL: Cannot combine --recent and --no-recent" if options[:no_recent]
37
36
  options[:only_recent] = true
38
37
  end
39
38
  opts.on("-n", "--no-recent",
40
39
  "Exclude the most recent changes (from untagged commits)") do
41
- abort "FATAL: Cannot combine --recent and --no-recent" if options[:recent]
42
40
  options[:no_recent] = true
43
41
  end
44
42
  opts.on("-d WORKING_DIR", "--dir WORKING_DIR",
45
43
  "Use alternate working directory") do |dir|
46
44
  working_dir = dir
47
45
  end
46
+ opts.on("-v", "--version", "Print version information and exit.") do
47
+ puts CreateChangelog::VERSION
48
+ exit
49
+ end
48
50
  end
49
51
  option_parser.parse!
50
52
 
53
+ if options[:no_recent] and options[:only_recent]
54
+ abort "FATAL: Cannot combine --recent and --no-recent"
55
+ end
56
+
51
57
  Dir.chdir(working_dir) do
52
58
  abort "FATAL: Not a git repository." unless Git.is_git_repository?
53
59
 
data/bin/ccl~ CHANGED
@@ -19,7 +19,7 @@
19
19
  # The filtered lines are sorted and written to standard out.
20
20
 
21
21
  require 'optparse'
22
- require_relative '../lib/changelog.rb'
22
+ require_relative '../lib/create_changelog.rb'
23
23
  require_relative '../lib/git.rb'
24
24
  require_relative '../lib/version.rb'
25
25
 
@@ -28,7 +28,7 @@ def main
28
28
  working_dir = Dir.pwd
29
29
  option_parser = OptionParser.new do |opts|
30
30
  exe_name = File.basename($PROGRAM_NAME)
31
- opts.banner = "#{exe_name} version #{CreateChangelog::VERSION}\n"
31
+ opts.banner = "create_changelog version #{CreateChangelog::VERSION}\n"
32
32
  opts.banner += "Creates changelog from log entries in git log\n"
33
33
  opts.banner += "Usage: #{exe_name} [options] [current_version]"
34
34
  opts.on("-r", "--recent",
@@ -38,16 +38,23 @@ def main
38
38
  end
39
39
  opts.on("-n", "--no-recent",
40
40
  "Exclude the most recent changes (from untagged commits)") do
41
- abort "FATAL: Cannot combine --recent and --no-recent" if options[:recent]
42
41
  options[:no_recent] = true
43
42
  end
44
43
  opts.on("-d WORKING_DIR", "--dir WORKING_DIR",
45
44
  "Use alternate working directory") do |dir|
46
45
  working_dir = dir
47
46
  end
47
+ opts.on("-v", "--version", "Print version information and exit.") do
48
+ puts CreateChangelog::VERSION
49
+ exit
50
+ end
48
51
  end
49
52
  option_parser.parse!
50
53
 
54
+ if options[:no_recent] and options[:only_recent]
55
+ abort "FATAL: Cannot combine --recent and --no-recent" if options[:recent]
56
+ end
57
+
51
58
  Dir.chdir(working_dir) do
52
59
  abort "FATAL: Not a git repository." unless Git.is_git_repository?
53
60
 
@@ -38,6 +38,9 @@ class Changelog
38
38
  # Returns a simple, undecorated list of changelog entries
39
39
  # since the most recent tag.
40
40
  def generate_recent
41
+ tags = TagList.new
42
+ log = CommitChangelog.new(tags.list[0], tags.list[1])
43
+ log.changelog
41
44
  end
42
45
 
43
46
  private
@@ -0,0 +1,77 @@
1
+ # changelog.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
+ require_relative './commit_changelog.rb'
15
+ require_relative './tag_list.rb'
16
+ require_relative './tag.rb'
17
+
18
+ # Central class that puts together the changelog.
19
+ class Changelog
20
+ # Heading for the most recent changes.
21
+ attr_writer :recent_changes_heading
22
+
23
+ def initialize
24
+ @recent_changes_heading = "Unpublished changes"
25
+ end
26
+
27
+ # Generates a decorated changelog.
28
+ def generate(exclude_recent = false)
29
+ # Traverse tags
30
+ tags = TagList.new(!exclude_recent)
31
+ output = String.new
32
+ tags.list.each_cons(2) do |current_tag, previous_tag|
33
+ output << generate_for(current_tag, previous_tag)
34
+ end
35
+ output
36
+ end
37
+
38
+ # Returns a simple, undecorated list of changelog entries
39
+ # since the most recent tag.
40
+ def generate_recent
41
+ tags = TagList.new
42
+ log = CommitChangelog.new(tags.list[0], tags.list[1])
43
+ log.changelog.inspect
44
+ end
45
+
46
+ private
47
+
48
+ def generate_for(current_tag, previous_tag)
49
+ tag = Tag.new(current_tag)
50
+ commit_changelog = CommitChangelog.new(current_tag, previous_tag)
51
+
52
+ # Combine changelog entries from tag annotation and commit messages
53
+ if tag.changelog
54
+ combined_changelog = tag.changelog.concat(commit_changelog.changelog)
55
+ else
56
+ combined_changelog = commit_changelog.changelog
57
+ end
58
+ combined_changelog.uniq! if combined_changelog
59
+
60
+ output = String.new
61
+ tag.heading = @recent_changes_heading unless tag.heading
62
+ if tag.heading
63
+ output << tag.heading + " (#{tag.date})\n"
64
+ output << "=" * 72 + "\n"
65
+ end
66
+ output << tag.text.join("\n") + "\n" if tag.text
67
+ output << combined_changelog.join("\n") + "\n" if combined_changelog
68
+ output << end_separator if tag.heading or tag.text or combined_changelog
69
+ output
70
+ end
71
+
72
+ def end_separator
73
+ "\n" + ("* " * 36) +"\n\n\n"
74
+ end
75
+ end
76
+
77
+ # vim: nospell
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module CreateChangelog
2
- VERSION = '1.1.0'
2
+ VERSION = '1.2.0'
3
3
  end
data/lib/version.rb~ CHANGED
@@ -1,3 +1,3 @@
1
1
  module CreateChangelog
2
- VERSION = '1.0.0'
2
+ VERSION = '1.1.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: create_changelog
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Kraus
@@ -24,11 +24,10 @@ files:
24
24
  - bin/ccl~
25
25
  - lib/array.rb
26
26
  - lib/changelog_filter.rb
27
- - lib/changelog_filter.rb~
28
27
  - lib/commit_changelog.rb
29
28
  - lib/create_changelog.rb
29
+ - lib/create_changelog.rb~
30
30
  - lib/git.rb
31
- - lib/git.rb~
32
31
  - lib/tag.rb
33
32
  - lib/tag_list.rb
34
33
  - lib/version.rb
@@ -1,57 +0,0 @@
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, filter.other_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
38
- end
39
-
40
- # Returns the grep string that matches changelog entries.
41
- def self.pattern
42
- '\s*\*\s+[^:]+:\s'
43
- end
44
-
45
- # An array of changelog entries.
46
- attr_accessor :changelog
47
-
48
- # An array of text lines that are not changelog entries.
49
- attr_accessor :other_text
50
-
51
- private
52
-
53
- def initialize
54
- end
55
- end
56
-
57
- # vim: nospell
data/lib/git.rb~ DELETED
@@ -1,58 +0,0 @@
1
- # git.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
- require_relative 'tag_list'
15
-
16
- # A static wrapper class for git
17
- class Git
18
-
19
- # Determines whether the (current) directory is a git repository
20
- def self.is_git_repository?(dir = nil)
21
- dir = Dir.pwd if dir.nil?
22
- system("git status > /dev/null 2>&1")
23
- $? == 0
24
- end
25
-
26
- # Retrieves the first 99 lines of the annotation of a tag.
27
- def self.get_tag_annotation(tag)
28
- test_tag tag
29
- `git tag -l -n99 #{tag}`.rstrip
30
- end
31
-
32
- # Retrieves the date of a tag
33
- def self.get_tag_date(tag)
34
- test_tag tag
35
- `git log -1 --format=format:%ai #{tag}`
36
- end
37
-
38
- # Retrieves commit messages and filters them
39
- # Todo: Armor this against code injection!
40
- def self.get_filtered_messages(from_commit, to_commit, filter)
41
- `git log #{from_commit}..#{to_commit} -E --grep='#{filter}' --format=%b`
42
- end
43
-
44
- @@tags = nil
45
-
46
- def self.tags
47
- @@tags = TagList.new unless @@tags
48
- @@tags
49
- end
50
-
51
- # Tests if the given tag exists and fails if it doesn't
52
- def self.test_tag(tag)
53
- fail "Invalid tag: #{tag}" unless tags.list.include?(tag)
54
- end
55
- private_class_method :test_tag, :tags
56
- end
57
-
58
- # vim: nospell