milestoner 11.2.0 → 12.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -2
- data/README.adoc +48 -50
- data/bin/milestoner +1 -3
- data/lib/milestoner.rb +9 -10
- data/lib/milestoner/cli/actions/config.rb +35 -0
- data/lib/milestoner/cli/actions/publish.rb +20 -0
- data/lib/milestoner/cli/actions/status.rb +33 -0
- data/lib/milestoner/cli/configuration/content.rb +21 -0
- data/lib/milestoner/cli/configuration/defaults.yml +12 -0
- data/lib/milestoner/cli/configuration/loader.rb +37 -0
- data/lib/milestoner/cli/parsers.rb +11 -0
- data/lib/milestoner/cli/parsers/assembler.rb +34 -0
- data/lib/milestoner/cli/parsers/core.rb +78 -0
- data/lib/milestoner/cli/parsers/security.rb +48 -0
- data/lib/milestoner/cli/shell.rb +51 -0
- data/lib/milestoner/commits/categorizer.rb +51 -0
- data/lib/milestoner/container.rb +40 -0
- data/lib/milestoner/error.rb +7 -0
- data/lib/milestoner/identity.rb +2 -1
- data/lib/milestoner/presenters/commit.rb +34 -0
- data/lib/milestoner/tags/creator.rb +70 -0
- data/lib/milestoner/tags/publisher.rb +26 -0
- data/lib/milestoner/tags/pusher.rb +40 -0
- metadata +56 -18
- metadata.gz.sig +0 -0
- data/lib/milestoner/cli.rb +0 -120
- data/lib/milestoner/commit.rb +0 -24
- data/lib/milestoner/errors/base.rb +0 -12
- data/lib/milestoner/errors/duplicate_tag.rb +0 -9
- data/lib/milestoner/errors/git.rb +0 -12
- data/lib/milestoner/publisher.rb +0 -21
- data/lib/milestoner/pusher.rb +0 -34
- data/lib/milestoner/tagger.rb +0 -89
metadata.gz.sig
CHANGED
Binary file
|
data/lib/milestoner/cli.rb
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "thor"
|
4
|
-
require "thor/actions"
|
5
|
-
require "runcom"
|
6
|
-
|
7
|
-
module Milestoner
|
8
|
-
# The Command Line Interface (CLI) for the gem.
|
9
|
-
class CLI < Thor
|
10
|
-
include Thor::Actions
|
11
|
-
|
12
|
-
package_name Identity::VERSION_LABEL
|
13
|
-
|
14
|
-
def self.configuration
|
15
|
-
Runcom::Config.new "#{Identity::NAME}/configuration.yml",
|
16
|
-
defaults: {
|
17
|
-
git_commit_prefixes: %w[Fixed Added Updated Removed Refactored],
|
18
|
-
git_tag_sign: false
|
19
|
-
}
|
20
|
-
end
|
21
|
-
|
22
|
-
def initialize args = [], options = {}, config = {}
|
23
|
-
super args, options, config
|
24
|
-
@configuration = self.class.configuration
|
25
|
-
@tagger = Tagger.new commit_prefixes: @configuration.to_h[:git_commit_prefixes]
|
26
|
-
@pusher = Pusher.new
|
27
|
-
@publisher = Publisher.new tagger: tagger, pusher: pusher
|
28
|
-
rescue Runcom::Errors::Base => error
|
29
|
-
abort error.message
|
30
|
-
end
|
31
|
-
|
32
|
-
desc "-C, [--commits]", "Show commits for next milestone."
|
33
|
-
map %w[-C --commits] => :commits
|
34
|
-
def commits
|
35
|
-
tagger.commit_list.each { |commit| say commit }
|
36
|
-
rescue StandardError => error
|
37
|
-
say_status :error, error.message, :red
|
38
|
-
end
|
39
|
-
|
40
|
-
desc "-t, [--tag=VERSION]", "Tag local repository with new version."
|
41
|
-
map %w[-t --tag] => :tag
|
42
|
-
method_option :sign,
|
43
|
-
aliases: "-s",
|
44
|
-
desc: "Sign tag with GPG key.",
|
45
|
-
type: :boolean,
|
46
|
-
default: false
|
47
|
-
def tag version
|
48
|
-
tagger.create version, sign: sign_tag?(options[:sign])
|
49
|
-
say "Repository tagged: #{version}."
|
50
|
-
rescue StandardError => error
|
51
|
-
say_status :error, error.message, :red
|
52
|
-
end
|
53
|
-
|
54
|
-
desc "-p, [--push=VERSION]", "Push local tag to remote repository."
|
55
|
-
map %w[-p --push] => :push
|
56
|
-
def push version
|
57
|
-
pusher.push version
|
58
|
-
say_status :info, "Tags pushed to remote repository.", :green
|
59
|
-
rescue StandardError => error
|
60
|
-
say_status :error, error.message, :red
|
61
|
-
end
|
62
|
-
|
63
|
-
desc "-P, [--publish=VERSION]", "Tag and push milestone to remote repository."
|
64
|
-
map %w[-P --publish] => :publish
|
65
|
-
method_option :sign,
|
66
|
-
aliases: "-s",
|
67
|
-
desc: "Sign tag with GPG key.",
|
68
|
-
type: :boolean,
|
69
|
-
default: false
|
70
|
-
def publish version
|
71
|
-
publisher.publish version, sign: sign_tag?(options[:sign])
|
72
|
-
say_status :info, "Repository tagged and pushed: #{version}.", :green
|
73
|
-
say_status :info, "Milestone published!", :green
|
74
|
-
rescue StandardError => error
|
75
|
-
say_status :error, error.message, :red
|
76
|
-
end
|
77
|
-
|
78
|
-
desc "-c, [--config]", "Manage gem configuration."
|
79
|
-
map %w[-c --config] => :config
|
80
|
-
method_option :edit,
|
81
|
-
aliases: "-e",
|
82
|
-
desc: "Edit gem configuration.",
|
83
|
-
type: :boolean,
|
84
|
-
default: false
|
85
|
-
method_option :info,
|
86
|
-
aliases: "-i",
|
87
|
-
desc: "Print gem configuration.",
|
88
|
-
type: :boolean,
|
89
|
-
default: false
|
90
|
-
def config
|
91
|
-
path = configuration.current
|
92
|
-
|
93
|
-
if options.edit? then `#{ENV["EDITOR"]} #{path}`
|
94
|
-
elsif options.info?
|
95
|
-
path ? say(path) : say("Configuration doesn't exist.")
|
96
|
-
else help :config
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
desc "-v, [--version]", "Show gem version."
|
101
|
-
map %w[-v --version] => :version
|
102
|
-
def version
|
103
|
-
say Identity::VERSION_LABEL
|
104
|
-
end
|
105
|
-
|
106
|
-
desc "-h, [--help=COMMAND]", "Show this message or get help for a command."
|
107
|
-
map %w[-h --help] => :help
|
108
|
-
def help task = nil
|
109
|
-
say and super
|
110
|
-
end
|
111
|
-
|
112
|
-
private
|
113
|
-
|
114
|
-
attr_reader :configuration, :tagger, :pusher, :publisher
|
115
|
-
|
116
|
-
def sign_tag? sign
|
117
|
-
sign | configuration.to_h[:git_tag_sign]
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
data/lib/milestoner/commit.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "forwardable"
|
4
|
-
|
5
|
-
module Milestoner
|
6
|
-
# Wraps the Git Kit Commit for presentation purposes.
|
7
|
-
class Commit
|
8
|
-
extend Forwardable
|
9
|
-
|
10
|
-
delegate [*GitPlus::Commit.members, :fixup?, :squash?] => :source
|
11
|
-
|
12
|
-
def initialize source
|
13
|
-
@source = source
|
14
|
-
end
|
15
|
-
|
16
|
-
def subject_author delimiter: " - "
|
17
|
-
"#{subject}#{delimiter}#{author_name}"
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
attr_reader :source
|
23
|
-
end
|
24
|
-
end
|
data/lib/milestoner/publisher.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Milestoner
|
4
|
-
# Handles the tagging and pushing of a milestone to a remote repository.
|
5
|
-
class Publisher
|
6
|
-
def initialize tagger: Tagger.new, pusher: Pusher.new
|
7
|
-
@tagger = tagger
|
8
|
-
@pusher = pusher
|
9
|
-
end
|
10
|
-
|
11
|
-
# :reek:BooleanParameter
|
12
|
-
def publish version, sign: false
|
13
|
-
tagger.create version, sign: sign
|
14
|
-
pusher.push version
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
attr_reader :tagger, :pusher
|
20
|
-
end
|
21
|
-
end
|
data/lib/milestoner/pusher.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Milestoner
|
4
|
-
# Handles publishing of Git tags to remote repository.
|
5
|
-
class Pusher
|
6
|
-
def initialize repository: GitPlus::Repository.new
|
7
|
-
@repository = repository
|
8
|
-
end
|
9
|
-
|
10
|
-
def push version
|
11
|
-
version = Versionaire::Version version
|
12
|
-
|
13
|
-
fail Errors::Git, "Remote repository not configured." unless repository.config_origin?
|
14
|
-
fail Errors::Git, "Remote tag exists: #{version}." if tag_exists? version
|
15
|
-
return if push_tags
|
16
|
-
|
17
|
-
fail Errors::Git, "Tags could not be pushed to remote repository."
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
attr_reader :repository, :version
|
23
|
-
|
24
|
-
def tag_exists? version
|
25
|
-
repository.tag_remote? version
|
26
|
-
end
|
27
|
-
|
28
|
-
def push_tags
|
29
|
-
repository.tag_push.then do |_stdout, stderr, status|
|
30
|
-
status.success? && stderr.match?(/[new tag]/)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
data/lib/milestoner/tagger.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "thor"
|
4
|
-
require "versionaire"
|
5
|
-
|
6
|
-
module Milestoner
|
7
|
-
# Handles the tagging of a project repository.
|
8
|
-
# :reek:TooManyInstanceVariables
|
9
|
-
class Tagger
|
10
|
-
attr_reader :commit_prefixes
|
11
|
-
|
12
|
-
def initialize commit_prefixes: [], repository: GitPlus::Repository.new, presenter: Commit
|
13
|
-
@commit_prefixes = commit_prefixes
|
14
|
-
@repository = repository
|
15
|
-
@presenter = presenter
|
16
|
-
@shell = Thor::Shell::Color.new
|
17
|
-
end
|
18
|
-
|
19
|
-
def commit_prefix_regex
|
20
|
-
commit_prefixes.empty? ? Regexp.new("") : Regexp.union(commit_prefixes)
|
21
|
-
end
|
22
|
-
|
23
|
-
def commits
|
24
|
-
groups = build_commit_prefix_groups
|
25
|
-
group_by_commit_prefix groups
|
26
|
-
groups.each_value { |commits| commits.sort_by!(&:subject) }
|
27
|
-
groups.values.flatten.uniq(&:subject)
|
28
|
-
end
|
29
|
-
|
30
|
-
def commit_list
|
31
|
-
commits.map { |source| presenter.new source }
|
32
|
-
.map { |commit| "- #{commit.subject_author}" }
|
33
|
-
end
|
34
|
-
|
35
|
-
# :reek:BooleanParameter
|
36
|
-
# :reek:ControlParameter
|
37
|
-
# :reek:TooManyStatements
|
38
|
-
def create version, sign: false
|
39
|
-
version = Versionaire::Version version
|
40
|
-
|
41
|
-
return if local? version
|
42
|
-
fail Errors::Git, "Unable to tag without commits." if computed_commits.empty?
|
43
|
-
|
44
|
-
content = message version
|
45
|
-
sign ? repository.tag_sign(version, content) : repository.tag_unsign(version, content)
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
attr_reader :repository, :presenter, :shell
|
51
|
-
|
52
|
-
def saved_commits
|
53
|
-
repository.commits
|
54
|
-
end
|
55
|
-
|
56
|
-
def tagged_commits
|
57
|
-
repository.commits "#{repository.tag_last}..HEAD"
|
58
|
-
end
|
59
|
-
|
60
|
-
def computed_commits
|
61
|
-
(repository.tagged? ? tagged_commits : saved_commits)
|
62
|
-
end
|
63
|
-
|
64
|
-
def build_commit_prefix_groups
|
65
|
-
commit_prefixes.map
|
66
|
-
.with_object({}) { |prefix, group| group.merge! prefix => [] }
|
67
|
-
.merge! "Other" => []
|
68
|
-
end
|
69
|
-
|
70
|
-
def group_by_commit_prefix groups = {}
|
71
|
-
computed_commits.each do |commit|
|
72
|
-
prefix = commit.subject[commit_prefix_regex]
|
73
|
-
key = groups.key?(prefix) ? prefix : "Other"
|
74
|
-
groups[key] << commit
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def message version
|
79
|
-
%(Version #{version}\n\n#{commit_list.join "\n"}\n\n)
|
80
|
-
end
|
81
|
-
|
82
|
-
def local? version
|
83
|
-
return false unless repository.tag_local? version
|
84
|
-
|
85
|
-
shell.say_status :warn, "Local tag exists: #{version}. Skipped.", :yellow
|
86
|
-
true
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|