gem-release 2.0.0.dev.5 → 2.0.0.rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -8
- data/Gemfile.lock +2 -2
- data/lib/gem/release/cmds/base.rb +15 -1
- data/lib/gem/release/cmds/bootstrap.rb +2 -2
- data/lib/gem/release/cmds/bump.rb +29 -6
- data/lib/gem/release/cmds/gemspec.rb +1 -1
- data/lib/gem/release/cmds/release.rb +1 -1
- data/lib/gem/release/cmds/runner.rb +11 -15
- data/lib/gem/release/cmds/tag.rb +4 -4
- data/lib/gem/release/context.rb +18 -54
- data/lib/gem/release/context/{system.rb → git.rb} +7 -17
- data/lib/gem/release/context/ui.rb +128 -0
- data/lib/gem/release/data.rb +8 -4
- data/lib/gem/release/helper.rb +6 -9
- data/lib/gem/release/support/gem_command.rb +1 -3
- data/lib/gem/release/version.rb +1 -1
- data/lib/gem/release/version/number.rb +12 -8
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 195c4cc3e957a72b5fd32d7b8988d4fb58afc373
|
4
|
+
data.tar.gz: 88be1c1f3b825670de7da30c65f19244494e625a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 871a21b9858931a0b7b2c374eb553a5a70f61e3d6b26055b7975ade21e20ea36d597a28083073bab27128297b1b39dd9cae79cf080f0eeb2877be831d6f03694
|
7
|
+
data.tar.gz: 24d5cbd92af1a4726328750b880d9871379891935667184b6638de34b6ef0e1aad020be8d87bbdf2c3cf13a2c3badc79bfdfa4f2d52d90eff07957b4dfcfd54b
|
data/CHANGELOG.md
CHANGED
@@ -6,22 +6,21 @@ This is a major rewrite, 7 years after the initial implementation.
|
|
6
6
|
|
7
7
|
### Major changes
|
8
8
|
|
9
|
-
* Consistent config format, using config files, environment variables, and
|
10
|
-
command line options
|
9
|
+
* Consistent config format, using config files, environment variables, and command line options
|
11
10
|
* Custom template groups for `gem bootstrap`
|
12
11
|
* Complete help output in `gem [command] --help`
|
13
|
-
* Consistent behaviour in multi-gem scenarios (see the
|
14
|
-
[README](https://github.com/svenfuchs/gem-release/blob/master/README.md#scenarios))
|
12
|
+
* Consistent behaviour in multi-gem scenarios (see the [README](https://github.com/svenfuchs/gem-release/blob/master/README.md#scenarios))
|
15
13
|
* Consistent command line option defaults across commands when invoked with a
|
16
14
|
shortcut, e.g. `gem bump --release --tag` vs `gem release --tag`
|
17
15
|
* Colorized, more consistently formatted output
|
16
|
+
* Parse friendly output on all commands when not on a tty (e.g. `gem bump --pretend --no-commit | awk '{ print $4 }')
|
18
17
|
|
19
18
|
### Other changes
|
20
19
|
|
21
20
|
* Fix misleading success message when `gem push` fails
|
22
21
|
* Release and tag now fail if there are uncommitted changes
|
23
|
-
* Add `--message` and `--skip-ci` to `gem bump` in order to customize the
|
24
|
-
|
25
|
-
* Add `--sign` to `gem bump` and `gem tag` in order to GPG sign commits and
|
26
|
-
|
22
|
+
* Add `--message` and `--skip-ci` to `gem bump` in order to customize the commit message
|
23
|
+
* Add `--branch` to `gem bump` in order to switch to a new branch
|
24
|
+
* Add `--sign` to `gem bump` and `gem tag` in order to GPG sign commits and tags
|
25
|
+
* Add `--no-color` to all commands
|
27
26
|
* Support version files of gems with an `*_rb` suffix
|
data/Gemfile.lock
CHANGED
@@ -34,10 +34,14 @@ module Gem
|
|
34
34
|
|
35
35
|
def descr(opt)
|
36
36
|
descr = self::DESCR[opt]
|
37
|
-
descr = "#{descr} (default: #{
|
37
|
+
descr = "#{descr} (default: #{default(opt)})" if default(opt)
|
38
38
|
descr
|
39
39
|
end
|
40
40
|
|
41
|
+
def default(opt)
|
42
|
+
Base::DEFAULTS[opt] || self::DEFAULTS[opt]
|
43
|
+
end
|
44
|
+
|
41
45
|
def usage(usage = nil)
|
42
46
|
usage ? @usage = usage : @usage || '[usage]'
|
43
47
|
end
|
@@ -53,6 +57,16 @@ module Gem
|
|
53
57
|
end
|
54
58
|
end
|
55
59
|
|
60
|
+
DEFAULTS = {
|
61
|
+
color: true,
|
62
|
+
pretend: false,
|
63
|
+
quiet: false
|
64
|
+
}
|
65
|
+
|
66
|
+
opt '--[no-]color' do |value|
|
67
|
+
opts[:color] = value
|
68
|
+
end
|
69
|
+
|
56
70
|
opt '--pretend' do
|
57
71
|
opts[:pretend] = true
|
58
72
|
end
|
@@ -194,12 +194,12 @@ module Gem
|
|
194
194
|
end
|
195
195
|
|
196
196
|
def create_repo
|
197
|
-
cmd :git_remote, remote, "#{
|
197
|
+
cmd :git_remote, remote, "#{git.user_login}/#{gem.name}"
|
198
198
|
cmd :git_push, remote if opts[:push]
|
199
199
|
end
|
200
200
|
|
201
201
|
def data
|
202
|
-
Data.new(
|
202
|
+
Data.new(git, gem, opts).data
|
203
203
|
end
|
204
204
|
|
205
205
|
def remote
|
@@ -43,6 +43,7 @@ module Gem
|
|
43
43
|
|
44
44
|
DESCR = {
|
45
45
|
version: 'Target version: next [major|minor|patch|pre|release] or a given version number [x.x.x]',
|
46
|
+
branch: 'Check out a new branch for the target version (e.g. `v1.0.0`)',
|
46
47
|
commit: 'Create a commit after incrementing gem version',
|
47
48
|
message: 'Commit message template',
|
48
49
|
skip_ci: 'Add the [skip ci] tag to the commit message',
|
@@ -59,10 +60,12 @@ module Gem
|
|
59
60
|
commit: true,
|
60
61
|
message: 'Bump %{name} to %{version} %{skip_ci}',
|
61
62
|
push: false,
|
63
|
+
branch: false,
|
62
64
|
remote: 'origin',
|
63
65
|
skip_ci: false,
|
64
66
|
sign: false,
|
65
|
-
recurse: false
|
67
|
+
recurse: false,
|
68
|
+
pretend: false
|
66
69
|
}
|
67
70
|
|
68
71
|
opt '-v', '--version VERSION', descr(:version) do |value|
|
@@ -93,6 +96,10 @@ module Gem
|
|
93
96
|
opts[:sign] = value
|
94
97
|
end
|
95
98
|
|
99
|
+
opt '--branch [BRANCH]', descr(:branch) do |value|
|
100
|
+
opts[:branch] = value.nil? ? true : value
|
101
|
+
end
|
102
|
+
|
96
103
|
opt '-t', '--tag', descr(:tag) do |value|
|
97
104
|
opts[:tag] = value
|
98
105
|
end
|
@@ -113,6 +120,7 @@ module Gem
|
|
113
120
|
bump: 'Bumping %s from version %s to %s',
|
114
121
|
version: 'Changing version in %s from %s to %s',
|
115
122
|
git_add: 'Staging %s',
|
123
|
+
git_checkout: 'Checking out branch %s',
|
116
124
|
git_commit: 'Creating commit',
|
117
125
|
git_push: 'Pushing to the %s git repository',
|
118
126
|
git_dirty: 'Uncommitted changes found. Please commit or stash.',
|
@@ -121,14 +129,16 @@ module Gem
|
|
121
129
|
}
|
122
130
|
|
123
131
|
CMDS = {
|
124
|
-
|
125
|
-
|
126
|
-
|
132
|
+
git_checkout: 'git checkout -b %s',
|
133
|
+
git_add: 'git add %s',
|
134
|
+
git_commit: 'git commit -m %p %s',
|
135
|
+
git_push: 'git push %s'
|
127
136
|
}
|
128
137
|
|
129
138
|
def run
|
130
139
|
in_gem_dirs do
|
131
140
|
validate
|
141
|
+
checkout if opts[:branch]
|
132
142
|
bump
|
133
143
|
commit if opts[:commit]
|
134
144
|
push if opts[:commit] && opts[:push]
|
@@ -141,11 +151,15 @@ module Gem
|
|
141
151
|
private
|
142
152
|
|
143
153
|
def validate
|
144
|
-
abort :git_dirty unless
|
145
|
-
abort :no_git_remote, remote if push? && !
|
154
|
+
abort :git_dirty unless git.clean?
|
155
|
+
abort :no_git_remote, remote if push? && !git.remotes.include?(remote.to_s)
|
146
156
|
abort :not_found, gem.name, version.path || '?' unless version.exists?
|
147
157
|
end
|
148
158
|
|
159
|
+
def checkout
|
160
|
+
cmd :git_checkout, branch
|
161
|
+
end
|
162
|
+
|
149
163
|
def bump
|
150
164
|
announce :bump, gem.name, version.from, version.to
|
151
165
|
return true if pretend?
|
@@ -170,6 +184,15 @@ module Gem
|
|
170
184
|
Release.new(context, args, except(opts, :tag)).run
|
171
185
|
end
|
172
186
|
|
187
|
+
def branch
|
188
|
+
case opts[:branch]
|
189
|
+
when ::String
|
190
|
+
opts[:branch]
|
191
|
+
when true
|
192
|
+
"v#{version.to}"
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
173
196
|
def message
|
174
197
|
args = { name: gem.name, skip_ci: opts[:skip_ci] ? '[skip ci]' : '' }
|
175
198
|
args = args.merge(version.to_h)
|
@@ -3,7 +3,7 @@ require 'gem/release/context'
|
|
3
3
|
module Gem
|
4
4
|
module Release
|
5
5
|
module Cmds
|
6
|
-
class Runner < Struct.new(:
|
6
|
+
class Runner < Struct.new(:name, :args, :opts, :context)
|
7
7
|
def run
|
8
8
|
run_cmd
|
9
9
|
success
|
@@ -11,6 +11,10 @@ module Gem
|
|
11
11
|
|
12
12
|
private
|
13
13
|
|
14
|
+
def success
|
15
|
+
context.ui.success "All is good, thanks my friend."
|
16
|
+
end
|
17
|
+
|
14
18
|
def run_cmd
|
15
19
|
const.new(context, args, opts).run
|
16
20
|
end
|
@@ -19,28 +23,20 @@ module Gem
|
|
19
23
|
Base[name]
|
20
24
|
end
|
21
25
|
|
22
|
-
def opts
|
23
|
-
except(super, :args, :build_args)
|
24
|
-
end
|
25
|
-
|
26
26
|
def args
|
27
27
|
super.select { |arg| arg.is_a?(String) && arg[0] != '-' }
|
28
28
|
end
|
29
29
|
|
30
|
-
def success
|
31
|
-
context.success "All is good, thanks my friend." unless quiet?
|
32
|
-
end
|
33
|
-
|
34
|
-
def quiet?
|
35
|
-
opts[:quiet] || opts[:silent]
|
36
|
-
end
|
37
|
-
|
38
30
|
def opts
|
39
|
-
@opts ||= config.merge(super)
|
31
|
+
@opts ||= except(Base::DEFAULTS.merge(config.merge(super)), :args, :build_args)
|
40
32
|
end
|
41
33
|
|
42
34
|
def config
|
43
|
-
|
35
|
+
Context.new.config.for(name.to_sym)
|
36
|
+
end
|
37
|
+
|
38
|
+
def context
|
39
|
+
@context ||= super || Context.new(opts)
|
44
40
|
end
|
45
41
|
|
46
42
|
def except(hash, *keys)
|
data/lib/gem/release/cmds/tag.rb
CHANGED
@@ -35,7 +35,7 @@ module Gem
|
|
35
35
|
sign: 'GPG sign the tag',
|
36
36
|
}
|
37
37
|
|
38
|
-
opt '-p', '--push', descr(:push) do |value|
|
38
|
+
opt '-p', '--[no-]push', descr(:push) do |value|
|
39
39
|
opts[:push] = value
|
40
40
|
end
|
41
41
|
|
@@ -72,8 +72,8 @@ module Gem
|
|
72
72
|
private
|
73
73
|
|
74
74
|
def validate
|
75
|
-
abort :git_dirty unless
|
76
|
-
abort :no_remote, remote if push? && !
|
75
|
+
abort :git_dirty unless git.clean?
|
76
|
+
abort :no_remote, remote if push? && !git.remotes.include?(remote)
|
77
77
|
end
|
78
78
|
|
79
79
|
def tag_and_push
|
@@ -83,7 +83,7 @@ module Gem
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def exists?
|
86
|
-
|
86
|
+
git.tags.include?(tag_name)
|
87
87
|
end
|
88
88
|
|
89
89
|
def tag
|
data/lib/gem/release/context.rb
CHANGED
@@ -1,59 +1,30 @@
|
|
1
1
|
require 'gem/release/context/gem'
|
2
|
+
require 'gem/release/context/git'
|
2
3
|
require 'gem/release/context/paths'
|
3
|
-
require 'gem/release/context/
|
4
|
+
require 'gem/release/context/ui'
|
4
5
|
|
5
6
|
module Gem
|
6
7
|
module Release
|
7
8
|
class Context
|
8
|
-
|
9
|
-
attr_accessor :last
|
10
|
-
end
|
11
|
-
|
12
|
-
attr_accessor :config, :gem, :system
|
13
|
-
|
14
|
-
COLORS = {
|
15
|
-
red: "\e[31m",
|
16
|
-
green: "\e[32m",
|
17
|
-
yellow: "\e[33m",
|
18
|
-
blue: "\e[34m",
|
19
|
-
gray: "\e[37m",
|
20
|
-
reset: "\e[0m"
|
21
|
-
}
|
9
|
+
attr_accessor :config, :gem, :git, :ui
|
22
10
|
|
23
|
-
def initialize(
|
11
|
+
def initialize(*args)
|
12
|
+
opts = args.last.is_a?(Hash) ? args.pop : {}
|
13
|
+
name = args.shift
|
24
14
|
@config = Config.new
|
25
15
|
@gem = Gem.new(name || File.basename(Dir.pwd))
|
26
|
-
@
|
27
|
-
|
28
|
-
|
29
|
-
def announce(str)
|
30
|
-
puts colored(:green, with_spacing(str, true))
|
31
|
-
end
|
32
|
-
|
33
|
-
def info(str)
|
34
|
-
puts colored(:blue, with_spacing(str, true))
|
35
|
-
end
|
36
|
-
|
37
|
-
def notice(str)
|
38
|
-
puts colored(:gray, with_spacing(str, false))
|
39
|
-
end
|
40
|
-
|
41
|
-
def warn(str)
|
42
|
-
puts colored(:yellow, with_spacing(str, false))
|
43
|
-
end
|
44
|
-
|
45
|
-
def error(str)
|
46
|
-
puts colored(:red, with_spacing(str, true))
|
16
|
+
@git = Git.new
|
17
|
+
@ui = Ui.new(opts)
|
47
18
|
end
|
48
19
|
|
49
|
-
def
|
50
|
-
|
51
|
-
puts
|
20
|
+
def run(cmd)
|
21
|
+
system(cmd)
|
52
22
|
end
|
53
23
|
|
54
|
-
def
|
55
|
-
|
56
|
-
|
24
|
+
def gem_cmd(cmd, *args)
|
25
|
+
::Gem::Commands.const_get("#{cmd.to_s.capitalize}Command").new.invoke(*args.flatten)
|
26
|
+
# TODO what's with the return value? maybe add our own abstraction that can check the result?
|
27
|
+
true
|
57
28
|
end
|
58
29
|
|
59
30
|
def in_dirs(args, opts, &block)
|
@@ -64,17 +35,10 @@ module Gem
|
|
64
35
|
Paths::ByGemspecs.new(args, opts).in_dirs(&block)
|
65
36
|
end
|
66
37
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
def with_spacing(str, space)
|
74
|
-
str = "\n#{str}" if space && !self.class.last
|
75
|
-
self.class.last = space
|
76
|
-
str
|
77
|
-
end
|
38
|
+
def abort(str)
|
39
|
+
ui.error(str)
|
40
|
+
exit 1
|
41
|
+
end
|
78
42
|
end
|
79
43
|
end
|
80
44
|
end
|
@@ -1,40 +1,30 @@
|
|
1
1
|
module Gem
|
2
2
|
module Release
|
3
3
|
class Context
|
4
|
-
class
|
5
|
-
def
|
6
|
-
system(cmd)
|
7
|
-
end
|
8
|
-
|
9
|
-
def gem_cmd(cmd, *args)
|
10
|
-
::Gem::Commands.const_get("#{cmd.to_s.capitalize}Command").new.invoke(*args.flatten)
|
11
|
-
# TODO what's with the return value? maybe add our own abstraction that can check the result?
|
12
|
-
true
|
13
|
-
end
|
14
|
-
|
15
|
-
def git_clean?
|
4
|
+
class Git
|
5
|
+
def clean?
|
16
6
|
system 'git diff-index --quiet HEAD'
|
17
7
|
end
|
18
8
|
|
19
|
-
def
|
9
|
+
def remotes
|
20
10
|
`git remote`.split("\n")
|
21
11
|
end
|
22
12
|
|
23
|
-
def
|
13
|
+
def tags
|
24
14
|
`git tag`.split("\n")
|
25
15
|
end
|
26
16
|
|
27
|
-
def
|
17
|
+
def user_name
|
28
18
|
str = `git config --get user.name`.strip
|
29
19
|
str unless str.empty?
|
30
20
|
end
|
31
21
|
|
32
|
-
def
|
22
|
+
def user_email
|
33
23
|
str = `git config --get user.email`.strip
|
34
24
|
str unless str.empty?
|
35
25
|
end
|
36
26
|
|
37
|
-
def
|
27
|
+
def user_login
|
38
28
|
str = `git config --get github.user`.strip
|
39
29
|
str.empty? ? git_user_name : str
|
40
30
|
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Gem
|
2
|
+
module Release
|
3
|
+
class Context
|
4
|
+
module Ui
|
5
|
+
class << self
|
6
|
+
def new(opts)
|
7
|
+
const = Quiet if opts[:quiet]
|
8
|
+
const ||= Tty if $stdout.tty?
|
9
|
+
const ||= Pipe
|
10
|
+
const.new(opts)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Base < Struct.new(:opts)
|
15
|
+
attr_writer :stdout
|
16
|
+
|
17
|
+
def stdout
|
18
|
+
@stdout || $stdout
|
19
|
+
end
|
20
|
+
|
21
|
+
def puts(*str)
|
22
|
+
stdout.puts(*str)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Pipe < Base
|
27
|
+
%i(announce info notice warn error).each do |name|
|
28
|
+
define_method (name) do |msg, args = nil, _ = nil|
|
29
|
+
puts format_msg(msg, args)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
%i(success cmd).each do |name|
|
34
|
+
define_method (name) { |*| }
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def format_msg(msg, args)
|
40
|
+
msg = [msg, args].flatten.map(&:to_s)
|
41
|
+
msg = msg.map { |str| quote_spaced(str) }
|
42
|
+
msg.join(' ').strip
|
43
|
+
end
|
44
|
+
|
45
|
+
def quote_spaced(str)
|
46
|
+
str.include?(' ') ? %("#{str}") : str
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class Quiet < Base
|
51
|
+
%i(announce info notice warn error success cmd).each do |name|
|
52
|
+
define_method (name) { |*| }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
module Colors
|
57
|
+
COLORS = {
|
58
|
+
red: "\e[31m",
|
59
|
+
green: "\e[32m",
|
60
|
+
yellow: "\e[33m",
|
61
|
+
blue: "\e[34m",
|
62
|
+
gray: "\e[37m",
|
63
|
+
reset: "\e[0m"
|
64
|
+
}
|
65
|
+
|
66
|
+
def colored(color, str)
|
67
|
+
[COLORS[color], str, COLORS[:reset]].join
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class Tty < Base
|
72
|
+
include Colors
|
73
|
+
|
74
|
+
def announce(msg, args = [], msgs = [])
|
75
|
+
msg = format_msg(msg, args, msgs)
|
76
|
+
puts colored(:green, with_spacing(msg, true))
|
77
|
+
end
|
78
|
+
|
79
|
+
def info(msg, args = [], msgs = [])
|
80
|
+
msg = format_msg(msg, args, msgs)
|
81
|
+
puts colored(:blue, with_spacing(msg, true))
|
82
|
+
end
|
83
|
+
|
84
|
+
def notice(msg, args = [], msgs = [])
|
85
|
+
msg = format_msg(msg, args, msgs)
|
86
|
+
puts colored(:gray, with_spacing(msg, false))
|
87
|
+
end
|
88
|
+
|
89
|
+
def warn(msg, args = [], msgs = [])
|
90
|
+
msg = format_msg(msg, args, msgs)
|
91
|
+
puts colored(:yellow, with_spacing(msg, false))
|
92
|
+
end
|
93
|
+
|
94
|
+
def error(msg, args = [], msgs = [])
|
95
|
+
msg = format_msg(msg, args, msgs)
|
96
|
+
puts colored(:red, with_spacing(msg, true))
|
97
|
+
end
|
98
|
+
|
99
|
+
def success(msg)
|
100
|
+
announce(msg)
|
101
|
+
puts
|
102
|
+
end
|
103
|
+
|
104
|
+
def cmd(msg)
|
105
|
+
notice("$ #{msg}")
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def colored(color, str)
|
111
|
+
opts[:color] ? super : str
|
112
|
+
end
|
113
|
+
|
114
|
+
def format_msg(msg, args, msgs)
|
115
|
+
msg = msgs[msg] % args if msg.is_a?(Symbol)
|
116
|
+
msg.strip
|
117
|
+
end
|
118
|
+
|
119
|
+
def with_spacing(str, space)
|
120
|
+
str = "\n#{str}" if space && !@last
|
121
|
+
@last = space
|
122
|
+
str
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
data/lib/gem/release/data.rb
CHANGED
@@ -4,7 +4,7 @@ require 'gem/release/helper/string'
|
|
4
4
|
|
5
5
|
module Gem
|
6
6
|
module Release
|
7
|
-
class Data < Struct.new(:
|
7
|
+
class Data < Struct.new(:git, :gem, :opts)
|
8
8
|
include Helper::String
|
9
9
|
|
10
10
|
def data
|
@@ -36,16 +36,20 @@ module Gem
|
|
36
36
|
gem_name.gsub('-', '/').sub(/_rb$/, '')
|
37
37
|
end
|
38
38
|
|
39
|
+
def user_login
|
40
|
+
git.user_login || '[your login]'
|
41
|
+
end
|
42
|
+
|
39
43
|
def user_name
|
40
|
-
|
44
|
+
git.user_name || '[your name]'
|
41
45
|
end
|
42
46
|
|
43
47
|
def user_email
|
44
|
-
|
48
|
+
git.user_email || '[your email]'
|
45
49
|
end
|
46
50
|
|
47
51
|
def homepage
|
48
|
-
"https://github.com/#{
|
52
|
+
"https://github.com/#{user_login}/#{gem_name}"
|
49
53
|
end
|
50
54
|
|
51
55
|
def licenses
|
data/lib/gem/release/helper.rb
CHANGED
@@ -4,9 +4,7 @@ module Gem
|
|
4
4
|
module Release
|
5
5
|
module Helper
|
6
6
|
extend Forwardable
|
7
|
-
def_delegators :context, :gem, :
|
8
|
-
def_delegators :system, :git_clean?, :git_remotes, :git_tags,
|
9
|
-
:git_user_name, :git_user_email, :github_user_name
|
7
|
+
def_delegators :context, :gem, :git, :ui
|
10
8
|
|
11
9
|
def run(cmd)
|
12
10
|
return true if send(cmd)
|
@@ -18,21 +16,20 @@ module Gem
|
|
18
16
|
cmd = self.class::CMDS[cmd] % args
|
19
17
|
end
|
20
18
|
cmd = cmd.strip
|
21
|
-
|
22
|
-
result = pretend? ? true :
|
19
|
+
ui.cmd cmd
|
20
|
+
result = pretend? ? true : context.run(cmd)
|
23
21
|
abort "The command `#{cmd}` was unsuccessful." unless result
|
24
22
|
end
|
25
23
|
|
26
24
|
def gem_cmd(cmd, *args)
|
27
25
|
info cmd, *args if cmd.is_a?(Symbol)
|
28
|
-
|
29
|
-
pretend? ? true :
|
26
|
+
ui.cmd "gem #{cmd} #{args.join(' ')}"
|
27
|
+
pretend? ? true : context.gem_cmd(cmd, *args)
|
30
28
|
end
|
31
29
|
|
32
30
|
%w(announce notice info warn error).each do |level|
|
33
31
|
define_method(level) do |msg, *args|
|
34
|
-
msg
|
35
|
-
context.send(level, msg.strip) unless quiet?
|
32
|
+
ui.send(level, msg, args, self.class::MSGS)
|
36
33
|
end
|
37
34
|
end
|
38
35
|
|
data/lib/gem/release/version.rb
CHANGED
@@ -2,7 +2,7 @@ module Gem
|
|
2
2
|
module Release
|
3
3
|
module Version
|
4
4
|
class Number < Struct.new(:number, :target)
|
5
|
-
NUMBER = /^(\d+)
|
5
|
+
NUMBER = /^(\d+)\.?(\d+)?\.?(\d+)?\.?(\w+)?\.?(\d+)?$/
|
6
6
|
|
7
7
|
STAGES = %i(alpha beta pre rc)
|
8
8
|
|
@@ -25,14 +25,14 @@ module Gem
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def minor
|
28
|
-
part = parts[1]
|
28
|
+
part = parts[1].to_i
|
29
29
|
part = 0 if to?(:major)
|
30
30
|
part += 1 if to?(:minor) || fresh_pre_release?
|
31
31
|
part
|
32
32
|
end
|
33
33
|
|
34
34
|
def patch
|
35
|
-
part = parts[2]
|
35
|
+
part = parts[2].to_i
|
36
36
|
part = 0 if to?(:major, :minor) || fresh_pre_release?
|
37
37
|
part += 1 if to?(:patch) && from_release?
|
38
38
|
part
|
@@ -44,9 +44,7 @@ module Gem
|
|
44
44
|
|
45
45
|
def num
|
46
46
|
return if to_release?
|
47
|
-
|
48
|
-
part += 1 if from_release? || same_stage?
|
49
|
-
part
|
47
|
+
same_stage? ? parts[4].to_i + 1 : 1
|
50
48
|
end
|
51
49
|
|
52
50
|
def to?(*targets)
|
@@ -89,12 +87,18 @@ module Gem
|
|
89
87
|
|
90
88
|
def parts
|
91
89
|
@parts ||= matches.compact.map(&:to_i).tap do |parts|
|
92
|
-
parts[3] = matches[3]
|
90
|
+
parts[3] = matches[3].to_sym if matches[3]
|
93
91
|
end
|
94
92
|
end
|
95
93
|
|
96
94
|
def matches
|
97
|
-
@matches ||=
|
95
|
+
@matches ||= parse.to_a[1..-1]
|
96
|
+
end
|
97
|
+
|
98
|
+
def parse
|
99
|
+
matches = number.match(NUMBER)
|
100
|
+
raise Abort, "Cannot parse version number #{number}" unless matches
|
101
|
+
matches
|
98
102
|
end
|
99
103
|
end
|
100
104
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gem-release
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.rc.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sven Fuchs
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-03-18 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Release your ruby gems with ease. (What a bold statement for such a tiny
|
15
15
|
plugin ...)
|
@@ -40,8 +40,9 @@ files:
|
|
40
40
|
- lib/gem/release/context.rb
|
41
41
|
- lib/gem/release/context/gem.rb
|
42
42
|
- lib/gem/release/context/gemspec.rb
|
43
|
+
- lib/gem/release/context/git.rb
|
43
44
|
- lib/gem/release/context/paths.rb
|
44
|
-
- lib/gem/release/context/
|
45
|
+
- lib/gem/release/context/ui.rb
|
45
46
|
- lib/gem/release/data.rb
|
46
47
|
- lib/gem/release/files/template.rb
|
47
48
|
- lib/gem/release/files/template/context.rb
|
@@ -91,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
92
|
version: 1.3.1
|
92
93
|
requirements: []
|
93
94
|
rubyforge_project:
|
94
|
-
rubygems_version: 2.6.
|
95
|
+
rubygems_version: 2.6.13
|
95
96
|
signing_key:
|
96
97
|
specification_version: 4
|
97
98
|
summary: Release your ruby gems with ease
|