gem-release 1.0.0 → 2.0.0.dev.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/Gemfile +13 -0
- data/Gemfile.lock +72 -0
- data/{lib/gem_release/templates/LICENSE → MIT-LICENSE.md} +3 -2
- data/README.md +646 -0
- data/README.md.erb +159 -0
- data/TODO.txt +194 -0
- data/lib/gem/release.rb +13 -0
- data/lib/gem/release/cmds.rb +16 -0
- data/lib/gem/release/cmds/base.rb +101 -0
- data/lib/gem/release/cmds/bootstrap.rb +222 -0
- data/lib/gem/release/cmds/bump.rb +165 -0
- data/lib/gem/release/cmds/gemspec.rb +85 -0
- data/lib/gem/release/cmds/release.rb +100 -0
- data/lib/gem/release/cmds/runner.rb +52 -0
- data/lib/gem/release/cmds/tag.rb +93 -0
- data/lib/gem/release/config.rb +42 -0
- data/lib/gem/release/config/env.rb +49 -0
- data/lib/gem/release/config/files.rb +35 -0
- data/lib/gem/release/context.rb +76 -0
- data/lib/gem/release/context/gem.rb +28 -0
- data/lib/gem/release/context/gemspec.rb +41 -0
- data/lib/gem/release/context/paths.rb +87 -0
- data/lib/gem/release/context/system.rb +36 -0
- data/lib/gem/release/data.rb +60 -0
- data/lib/gem/release/files/template.rb +61 -0
- data/lib/gem/release/files/template/context.rb +30 -0
- data/lib/gem/release/files/templates.rb +59 -0
- data/lib/gem/release/files/templates/group.rb +47 -0
- data/lib/gem/release/files/version.rb +68 -0
- data/lib/gem/release/helper.rb +45 -0
- data/lib/gem/release/helper/hash.rb +35 -0
- data/lib/gem/release/helper/string.rb +43 -0
- data/lib/gem/release/support/gem_command.rb +67 -0
- data/lib/gem/release/support/registry.rb +59 -0
- data/lib/gem/release/templates/.gitignore +8 -0
- data/lib/gem/release/templates/Gemfile +3 -0
- data/lib/gem/release/templates/gemspec +19 -0
- data/lib/gem/release/templates/licenses/mit.md +21 -0
- data/lib/gem/release/templates/licenses/mpl-2.md +373 -0
- data/lib/gem/release/templates/main.rb +1 -0
- data/lib/gem/release/templates/rspec/.rspec +3 -0
- data/lib/gem/release/templates/rspec/spec/spec_helper.rb +4 -0
- data/lib/gem/release/templates/travis/.travis.yml +1 -0
- data/lib/gem/release/templates/version.rb +1 -0
- data/lib/gem/release/version.rb +5 -0
- data/lib/gem/release/version/number.rb +102 -0
- data/lib/rubygems/commands/bootstrap_command.rb +4 -93
- data/lib/rubygems/commands/bump_command.rb +4 -110
- data/lib/rubygems/commands/gemspec_command.rb +5 -29
- data/lib/rubygems/commands/release_command.rb +4 -70
- data/lib/rubygems/commands/tag_command.rb +5 -46
- data/lib/rubygems_plugin.rb +8 -2
- metadata +56 -83
- data/lib/core_ext/hash/symbolize_keys.rb +0 -13
- data/lib/core_ext/kernel/silence.rb +0 -18
- data/lib/core_ext/string/camelize.rb +0 -5
- data/lib/gem_release.rb +0 -10
- data/lib/gem_release/command_options.rb +0 -31
- data/lib/gem_release/configuration.rb +0 -33
- data/lib/gem_release/gemspec_template.rb +0 -35
- data/lib/gem_release/helpers.rb +0 -104
- data/lib/gem_release/template.rb +0 -52
- data/lib/gem_release/templates/Gemfile +0 -3
- data/lib/gem_release/templates/README.md +0 -1
- data/lib/gem_release/templates/Rakefile +0 -10
- data/lib/gem_release/templates/gemspec +0 -18
- data/lib/gem_release/templates/gitignore +0 -25
- data/lib/gem_release/templates/test/test_helper.rb +0 -2
- data/lib/gem_release/templates/version.rb +0 -12
- data/lib/gem_release/version.rb +0 -3
- data/lib/gem_release/version_file.rb +0 -115
- data/lib/gem_release/version_template.rb +0 -14
@@ -0,0 +1 @@
|
|
1
|
+
<%= define :module %>
|
@@ -0,0 +1 @@
|
|
1
|
+
language: ruby
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= define(:module) { "VERSION = '0.0.1'" } %>
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Gem
|
2
|
+
module Release
|
3
|
+
module Version
|
4
|
+
class Number < Struct.new(:number, :target)
|
5
|
+
NUMBER = /^(\d+)\.(\d+).(\d+).?(\w+)?.?(\d+)?$/
|
6
|
+
|
7
|
+
STAGES = %i(alpha beta pre rc)
|
8
|
+
|
9
|
+
def bump
|
10
|
+
return target if specific?
|
11
|
+
validate_stage
|
12
|
+
[major, minor, patch, stage, num].compact.join('.')
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def specific?
|
18
|
+
target =~ NUMBER
|
19
|
+
end
|
20
|
+
|
21
|
+
def major
|
22
|
+
part = parts[0]
|
23
|
+
part += 1 if to?(:major)
|
24
|
+
part
|
25
|
+
end
|
26
|
+
|
27
|
+
def minor
|
28
|
+
part = parts[1]
|
29
|
+
part = 0 if to?(:major)
|
30
|
+
part += 1 if to?(:minor) || fresh_pre_release?
|
31
|
+
part
|
32
|
+
end
|
33
|
+
|
34
|
+
def patch
|
35
|
+
part = parts[2]
|
36
|
+
part = 0 if to?(:major, :minor) || fresh_pre_release?
|
37
|
+
part += 1 if to?(:patch) && from_release?
|
38
|
+
part
|
39
|
+
end
|
40
|
+
|
41
|
+
def stage
|
42
|
+
target unless to_release?
|
43
|
+
end
|
44
|
+
|
45
|
+
def num
|
46
|
+
return if to_release?
|
47
|
+
part = parts[4].to_i
|
48
|
+
part += 1 if from_release? || same_stage?
|
49
|
+
part
|
50
|
+
end
|
51
|
+
|
52
|
+
def to?(*targets)
|
53
|
+
targets.include?(target)
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_release?
|
57
|
+
to?(:major, :minor, :patch)
|
58
|
+
end
|
59
|
+
|
60
|
+
def fresh_pre_release?
|
61
|
+
from_release? && to?(:pre, :rc)
|
62
|
+
end
|
63
|
+
|
64
|
+
def from_release?
|
65
|
+
!from_pre_release?
|
66
|
+
end
|
67
|
+
|
68
|
+
def from_pre_release?
|
69
|
+
!!from_stage
|
70
|
+
end
|
71
|
+
|
72
|
+
def same_stage?
|
73
|
+
from_stage == target
|
74
|
+
end
|
75
|
+
|
76
|
+
def from_stage
|
77
|
+
parts[3]
|
78
|
+
end
|
79
|
+
|
80
|
+
def target
|
81
|
+
super || (from_pre_release? ? from_stage : :patch)
|
82
|
+
end
|
83
|
+
|
84
|
+
def validate_stage
|
85
|
+
from, to = STAGES.index(from_stage), STAGES.index(target)
|
86
|
+
return unless from && to && from > to
|
87
|
+
raise Abort, "Cannot go from an #{from_stage} version to a #{target} version"
|
88
|
+
end
|
89
|
+
|
90
|
+
def parts
|
91
|
+
@parts ||= matches.compact.map(&:to_i).tap do |parts|
|
92
|
+
parts[3] = matches[3] && matches[3].to_sym
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def matches
|
97
|
+
@matches ||= number.match(NUMBER).to_a[1..-1]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -1,96 +1,7 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'gem/release/support/gem_command'
|
2
|
+
require 'gem/release/cmds/bootstrap'
|
3
3
|
|
4
4
|
class Gem::Commands::BootstrapCommand < Gem::Command
|
5
|
-
include
|
6
|
-
|
7
|
-
|
8
|
-
DEFAULTS = {
|
9
|
-
:gemspec => true,
|
10
|
-
:strategy => 'git',
|
11
|
-
:scaffold => true,
|
12
|
-
:github => false,
|
13
|
-
:quiet => false
|
14
|
-
}
|
15
|
-
|
16
|
-
attr_reader :arguments, :usage, :name
|
17
|
-
|
18
|
-
def initialize(options = {})
|
19
|
-
@name = 'bootstrap'
|
20
|
-
super @name, 'Bootstrap a new gem source repository', default_options_with(options)
|
21
|
-
|
22
|
-
option :gemspec, '-g', 'Generate a .gemspec'
|
23
|
-
option :scaffold, '-s', 'Scaffold lib/[gem_name]/version.rb README test/'
|
24
|
-
option :strategy, '-f', 'Strategy for collecting files [glob|git] in .gemspec'
|
25
|
-
option :github, '-h', 'Bootstrap a git repo, create on github and push'
|
26
|
-
option :quiet, '-q', 'Do not output status messages'
|
27
|
-
|
28
|
-
@arguments = "gemname - option name of the gem, will use the current directory if not specified"
|
29
|
-
@usage = "#{program_name} [gemname]"
|
30
|
-
end
|
31
|
-
|
32
|
-
def execute
|
33
|
-
in_bootstrapped_dir do
|
34
|
-
write_scaffold if options[:scaffold]
|
35
|
-
write_gemspec if options[:gemspec]
|
36
|
-
init_git if options[:github] || options[:args] # safe to 'git init' in new dir
|
37
|
-
create_repo if options[:github]
|
38
|
-
end
|
39
|
-
|
40
|
-
success
|
41
|
-
end
|
42
|
-
|
43
|
-
def write_gemspec
|
44
|
-
GemspecCommand.new(:quiet => quiet?, :strategy => options[:strategy], :quiet_success => true).execute
|
45
|
-
end
|
46
|
-
|
47
|
-
def write_scaffold
|
48
|
-
say 'scaffolding ...' unless quiet?
|
49
|
-
|
50
|
-
create_file Template.new('gitignore', :filename => '.gitignore')
|
51
|
-
create_file Template.new('README.md')
|
52
|
-
create_file Template.new('LICENSE', :year => Time.now.year, :author => user_name, :email => user_email)
|
53
|
-
create_file Template.new('Gemfile')
|
54
|
-
create_file Template.new('Rakefile')
|
55
|
-
create_file Template.new('test/test_helper.rb')
|
56
|
-
create_file VersionTemplate.new(options)
|
57
|
-
end
|
58
|
-
|
59
|
-
def create_lib
|
60
|
-
`mkdir -p lib test`
|
61
|
-
end
|
62
|
-
|
63
|
-
def create_file(template)
|
64
|
-
if File.exists?(template.filename)
|
65
|
-
say "Skipping #{template.filename}: already exists" unless quiet?
|
66
|
-
else
|
67
|
-
say "Creating #{template.filename}" unless quiet?
|
68
|
-
template.write
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def init_git
|
73
|
-
say 'Initializing git repository'
|
74
|
-
`git init`
|
75
|
-
end
|
76
|
-
|
77
|
-
def create_repo
|
78
|
-
options = { :login => github_user, :token => github_token, :name => gem_name }
|
79
|
-
options = options.map { |name, value| "-F '#{name}=#{value}'" }.join(' ')
|
80
|
-
|
81
|
-
say 'Staging files'
|
82
|
-
`git add .`
|
83
|
-
|
84
|
-
say 'Creating initial commit'
|
85
|
-
`git commit -m "initial commit"`
|
86
|
-
|
87
|
-
say "Adding remote origin git@github.com:#{github_user}/#{gem_name}.git"
|
88
|
-
`git remote add origin git@github.com:#{github_user}/#{gem_name}.git`
|
89
|
-
|
90
|
-
say 'Creating repository on Github'
|
91
|
-
silence { `curl #{options} http://github.com/api/v2/yaml/repos/create` }
|
92
|
-
|
93
|
-
say 'Pushing to Github'
|
94
|
-
`git push origin master`
|
95
|
-
end
|
5
|
+
include Gem::Release::GemCommand
|
6
|
+
self.cmd = :bootstrap
|
96
7
|
end
|
@@ -1,113 +1,7 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require 'rubygems/commands/release_command'
|
4
|
-
require 'shellwords'
|
1
|
+
require 'gem/release/support/gem_command'
|
2
|
+
require 'gem/release/cmds/bump'
|
5
3
|
|
6
4
|
class Gem::Commands::BumpCommand < Gem::Command
|
7
|
-
include
|
8
|
-
|
9
|
-
|
10
|
-
attr_reader :arguments, :usage, :name
|
11
|
-
|
12
|
-
DEFAULTS = {
|
13
|
-
:version => '',
|
14
|
-
:commit => true,
|
15
|
-
:push => false,
|
16
|
-
:tag => false,
|
17
|
-
:release => false,
|
18
|
-
:key => '',
|
19
|
-
:host => '',
|
20
|
-
:quiet => false,
|
21
|
-
:destination => "origin",
|
22
|
-
}
|
23
|
-
|
24
|
-
def initialize(options = {})
|
25
|
-
@name = 'bump'
|
26
|
-
super @name, 'Bump the gem version', default_options_with(options)
|
27
|
-
|
28
|
-
option :version, '-v', 'Target version: next [major|minor|patch|pre|release] or a given version number [x.x.x]'
|
29
|
-
option :commit, '-c', 'Perform a commit after incrementing gem version'
|
30
|
-
option :push, '-p', 'Push to the git destination'
|
31
|
-
option :destination, '-d', 'destination git repository'
|
32
|
-
option :tag, '-t', 'Create a git tag and push it to the git destination'
|
33
|
-
option :release, '-r', 'Build gem from a gemspec and push to rubygems.org'
|
34
|
-
option :key, '-k', 'When releasing: use the given API key from ~/.gem/credentials'
|
35
|
-
option :host, '-h', 'When releasing: push to a gemcutter-compatible host other than rubygems.org'
|
36
|
-
option :quiet, '-q', 'Do not output status messages'
|
37
|
-
end
|
38
|
-
|
39
|
-
def execute
|
40
|
-
@new_version_number = nil
|
41
|
-
|
42
|
-
tasks = [:commit, :push, :release, :tag]
|
43
|
-
|
44
|
-
# enforce option dependencies
|
45
|
-
options[:push] = true if options[:tag]
|
46
|
-
options[:commit] = options[:commit] || options[:push] || options[:tag] || options[:release]
|
47
|
-
|
48
|
-
in_gemspec_dirs do
|
49
|
-
run_cmd(:bump)
|
50
|
-
end
|
51
|
-
|
52
|
-
if @new_version_number == nil
|
53
|
-
say "No version files could be found, so no actions were performed." unless quiet?
|
54
|
-
else
|
55
|
-
tasks.each do |task|
|
56
|
-
run_cmd(task) if options[task]
|
57
|
-
end
|
58
|
-
|
59
|
-
success
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
protected
|
64
|
-
|
65
|
-
def bump
|
66
|
-
version = VersionFile.new(:target => (@new_version_number || options[:version]))
|
67
|
-
if File.exist?(version.filename)
|
68
|
-
@new_version_number ||= version.new_number
|
69
|
-
say "Bumping #{gem_name} from #{version.old_number} to version #{version.new_number}" unless quiet?
|
70
|
-
version.bump!
|
71
|
-
return system("git add #{escape(version.filename)}") if options[:commit]
|
72
|
-
else
|
73
|
-
say "Ignoring #{gem_name}. Version file #{version.filename} not found" unless quiet?
|
74
|
-
end
|
75
|
-
true
|
76
|
-
end
|
77
|
-
|
78
|
-
def escape(string)
|
79
|
-
Shellwords.escape(string)
|
80
|
-
end
|
81
|
-
|
82
|
-
def commit
|
83
|
-
say "Creating commit" unless quiet?
|
84
|
-
system("git commit -m \"Bump to #{@new_version_number}\"")
|
85
|
-
end
|
86
|
-
|
87
|
-
def push
|
88
|
-
destination = options[:destination]
|
89
|
-
say "Pushing to the #{destination} git repository" unless quiet?
|
90
|
-
system("git push #{destination}")
|
91
|
-
end
|
92
|
-
|
93
|
-
def release
|
94
|
-
cmd = ReleaseCommand.new
|
95
|
-
[:key, :host].each do |option|
|
96
|
-
cmd.options[option] = options[option]
|
97
|
-
end
|
98
|
-
cmd.options[:quiet] = options[:quiet]
|
99
|
-
cmd.options[:quiet_success] = true
|
100
|
-
cmd.execute
|
101
|
-
true
|
102
|
-
end
|
103
|
-
|
104
|
-
def tag
|
105
|
-
cmd = TagCommand.new
|
106
|
-
cmd.options[:quiet] = options[:quiet]
|
107
|
-
cmd.options[:quiet_success] = true
|
108
|
-
cmd.options[:push_tags_only] = true
|
109
|
-
cmd.options[:destination] = options[:destination]
|
110
|
-
cmd.execute
|
111
|
-
true
|
112
|
-
end
|
5
|
+
include Gem::Release::GemCommand
|
6
|
+
self.cmd = :bump
|
113
7
|
end
|
@@ -1,31 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
include Helpers, CommandOptions
|
4
|
-
|
5
|
-
DEFAULTS = {
|
6
|
-
:strategy => 'git',
|
7
|
-
:quiet => false
|
8
|
-
}
|
9
|
-
|
10
|
-
attr_reader :arguments, :usage, :name
|
11
|
-
|
12
|
-
def initialize(options = {})
|
13
|
-
@name = 'bootstrap'
|
14
|
-
super @name, 'Bootstrap a new gem source repository', default_options_with(options)
|
1
|
+
require 'gem/release/support/gem_command'
|
2
|
+
require 'gem/release/cmds/gemspec'
|
15
3
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
def execute
|
21
|
-
gemspec = GemspecTemplate.new(options)
|
22
|
-
if gemspec.exists?
|
23
|
-
say "Skipping #{gemspec.filename}: already exists" unless quiet?
|
24
|
-
else
|
25
|
-
say "Creating #{gemspec.filename}" unless quiet?
|
26
|
-
gemspec.write
|
27
|
-
|
28
|
-
success
|
29
|
-
end
|
30
|
-
end
|
4
|
+
class Gem::Commands::GemspecCommand < Gem::Command
|
5
|
+
include Gem::Release::GemCommand
|
6
|
+
self.cmd = :gemspec
|
31
7
|
end
|
@@ -1,73 +1,7 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require 'rubygems/commands/tag_command'
|
1
|
+
require 'gem/release/support/gem_command'
|
2
|
+
require 'gem/release/cmds/release'
|
4
3
|
|
5
4
|
class Gem::Commands::ReleaseCommand < Gem::Command
|
6
|
-
include
|
7
|
-
|
8
|
-
|
9
|
-
DEFAULTS = {
|
10
|
-
:tag => false,
|
11
|
-
:quiet => false,
|
12
|
-
:key => '',
|
13
|
-
:host => '',
|
14
|
-
:destination => "origin",
|
15
|
-
}
|
16
|
-
|
17
|
-
attr_reader :arguments, :usage, :name
|
18
|
-
|
19
|
-
def initialize(options = {})
|
20
|
-
@name = 'release'
|
21
|
-
super @name, 'Build gem from a gemspec and push to rubygems.org', default_options_with(options)
|
22
|
-
|
23
|
-
option :tag, '-t', 'Create a git tag and push it to the destination'
|
24
|
-
option :destination, '-d', 'Destination git repository'
|
25
|
-
option :quiet, '-q', 'Do not output status messages'
|
26
|
-
option :key, '-k', 'Use the given API key from ~/.gem/credentials'
|
27
|
-
option :host, '-h', 'Push to a gemcutter-compatible host other than rubygems.org'
|
28
|
-
|
29
|
-
@arguments = "gemspec - optional gemspec file name, will use the first *.gemspec if not specified"
|
30
|
-
@usage = "#{program_name} [gemspec]"
|
31
|
-
end
|
32
|
-
|
33
|
-
def execute
|
34
|
-
tasks = [:build, :push, :cleanup]
|
35
|
-
tasks.push(:tag) if options[:tag]
|
36
|
-
|
37
|
-
in_gemspec_dirs do
|
38
|
-
tasks.each do |task|
|
39
|
-
run_cmd(task)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
success
|
44
|
-
end
|
45
|
-
|
46
|
-
protected
|
47
|
-
|
48
|
-
def build
|
49
|
-
BuildCommand.new.invoke(gemspec_filename)
|
50
|
-
true
|
51
|
-
end
|
52
|
-
|
53
|
-
def push
|
54
|
-
args = []
|
55
|
-
[:key, :host].each do |option|
|
56
|
-
args += ["--#{option}", options[option]] unless options[option] == ''
|
57
|
-
end
|
58
|
-
args += "--quiet" if quiet?
|
59
|
-
|
60
|
-
PushCommand.new.invoke(gem_filename, *args)
|
61
|
-
true
|
62
|
-
end
|
63
|
-
|
64
|
-
def cleanup
|
65
|
-
say "Deleting left over gem file #{gem_filename}" unless quiet?
|
66
|
-
system("rm #{gem_filename}")
|
67
|
-
end
|
68
|
-
|
69
|
-
def tag
|
70
|
-
TagCommand.new(:quiet => quiet?, :quiet_success => true).invoke
|
71
|
-
true
|
72
|
-
end
|
5
|
+
include Gem::Release::GemCommand
|
6
|
+
self.cmd = :release
|
73
7
|
end
|