rake-release 0.3.0 → 0.3.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/.gitignore +12 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +41 -0
- data/Rakefile +1 -0
- data/lib/rake/release.rb +34 -0
- data/lib/rake/release/spec.rb +89 -0
- data/lib/rake/release/task.rb +212 -0
- data/rake-release.gemspec +22 -0
- data/scripts/console +14 -0
- data/scripts/setup +8 -0
- metadata +14 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b765b7e4a6fa595d55c6eb83b41562b32624fce
|
4
|
+
data.tar.gz: 672abe5d9a19fe73061a7bdd46148222b4677b17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1418a8e642439637a45a2d52514519d052bd190451962d4d94041b03529b34782a44c3914ee8a66d6ea8c40acc5e80fdc1c1ab3dcf78c790c0d9026ab13936d
|
7
|
+
data.tar.gz: 427aec58e984d2ed8bbba388e806077e05fab3f6869ca4ef229b24c9976384e95b7effa2d0a45a23b419a20c261aabc2aee91995a749936e0cb2f88560a66524
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 Jan Graichen
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
# Rake::Release
|
2
|
+
|
3
|
+
Customized fork for bundlers gem task helpers.
|
4
|
+
|
5
|
+
Automatically detects multiple gemspecs and protect from releasing code not matching git version tag.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'rake-release'
|
13
|
+
```
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
Simply require in Rakefile:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
require 'rake/release'
|
21
|
+
```
|
22
|
+
|
23
|
+
Check with `rake -D`:
|
24
|
+
|
25
|
+
```
|
26
|
+
rake build
|
27
|
+
Build rake-release-0.2.1.gem.gem into the pkg directory.
|
28
|
+
|
29
|
+
rake install
|
30
|
+
Build and install rake-release-0.2.1.gem into system gems.
|
31
|
+
|
32
|
+
rake install:local
|
33
|
+
Build and install rake-release-0.2.1.gem into system gems without network access.
|
34
|
+
|
35
|
+
rake release[remote]
|
36
|
+
Create and push tag v0.2.1, build gem and publish to rubygems.org.
|
37
|
+
```
|
38
|
+
|
39
|
+
# License
|
40
|
+
|
41
|
+
MIT
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'rake/release'
|
data/lib/rake/release.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rake/release/spec'
|
2
|
+
require 'rake/release/task'
|
3
|
+
|
4
|
+
require 'bundler'
|
5
|
+
require 'pathname'
|
6
|
+
|
7
|
+
module Rake
|
8
|
+
module Release
|
9
|
+
class << self
|
10
|
+
def pwd
|
11
|
+
@pwd ||= Pathname.new Bundler::SharedHelpers.pwd
|
12
|
+
end
|
13
|
+
|
14
|
+
def ui
|
15
|
+
@ui ||= Bundler::UI::Shell.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def autodetect!
|
19
|
+
specs = Spec.scan pwd.join '{*/*/,*/,}*.gemspec'
|
20
|
+
specs.uniq! {|spec| spec.name }
|
21
|
+
|
22
|
+
if specs.size == 1
|
23
|
+
Task.new specs.first
|
24
|
+
else
|
25
|
+
specs.each do |spec|
|
26
|
+
Task.new spec, namespace: spec.name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
autodetect!
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
module Rake
|
5
|
+
module Release
|
6
|
+
class Spec
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
EMPTY_STR = ''.freeze
|
10
|
+
|
11
|
+
delegate name: :@gemspec
|
12
|
+
delegate version: :@gemspec
|
13
|
+
|
14
|
+
attr_reader :base
|
15
|
+
attr_reader :gemspec
|
16
|
+
attr_reader :gemspec_path
|
17
|
+
|
18
|
+
attr_accessor :namespace
|
19
|
+
|
20
|
+
def initialize(path, namespace: nil)
|
21
|
+
path = Release.pwd.join(path.to_s).expand_path
|
22
|
+
|
23
|
+
if path.directory?
|
24
|
+
@base = path
|
25
|
+
|
26
|
+
gemspecs = Dir[@base.join('*.gemspec')]
|
27
|
+
|
28
|
+
if gemspecs.size != 1
|
29
|
+
raise 'Unable to determine gemspec file.'
|
30
|
+
end
|
31
|
+
|
32
|
+
@gemspec_path = Pathname.new gemspecs.first
|
33
|
+
else
|
34
|
+
@base = path.parent
|
35
|
+
@gemspec_path = path
|
36
|
+
end
|
37
|
+
|
38
|
+
@gemspec = Bundler.load_gemspec @gemspec_path
|
39
|
+
|
40
|
+
raise RuntimeError.new 'Cannot load gemspec' unless @gemspec
|
41
|
+
end
|
42
|
+
|
43
|
+
def push_host
|
44
|
+
@push_host ||= begin
|
45
|
+
if @gemspec.metadata['allowed_push_host'].to_s.empty?
|
46
|
+
@push_host = URI 'https://rubygems.org'
|
47
|
+
else
|
48
|
+
@push_host = URI @gemspec.metadata['allowed_push_host']
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def push_host_name
|
54
|
+
push_host.host.to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
def pkg_path
|
58
|
+
@pkg_path ||= base.join 'pkg'
|
59
|
+
end
|
60
|
+
|
61
|
+
def pkg_file_name
|
62
|
+
@pkg_file_name ||= "#{name}-#{version}.gem"
|
63
|
+
end
|
64
|
+
|
65
|
+
def pkg_file_path
|
66
|
+
@pkg_file_path ||= pkg_path.join pkg_file_name
|
67
|
+
end
|
68
|
+
|
69
|
+
def version_tag
|
70
|
+
"v#{version}"
|
71
|
+
end
|
72
|
+
|
73
|
+
class << self
|
74
|
+
def load(*args, &block)
|
75
|
+
new(*args, &block)
|
76
|
+
rescue
|
77
|
+
nil
|
78
|
+
end
|
79
|
+
|
80
|
+
def scan(path = Release.pwd.join('*.gemspec'))
|
81
|
+
Pathname
|
82
|
+
.glob(path)
|
83
|
+
.map {|path| Rake::Release::Spec.load path }
|
84
|
+
.reject {|spec| spec.nil? }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,212 @@
|
|
1
|
+
require 'bundler/vendored_thor' unless defined?(Thor)
|
2
|
+
|
3
|
+
require 'open3'
|
4
|
+
require 'bundler'
|
5
|
+
require 'pathname'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
require 'rake/release/spec'
|
9
|
+
|
10
|
+
module Rake
|
11
|
+
module Release
|
12
|
+
class Task
|
13
|
+
include Rake::DSL
|
14
|
+
|
15
|
+
def initialize(spec = nil, **kwargs, &block)
|
16
|
+
@spec = spec || Rake::Release::Spec.new(**kwargs, &block)
|
17
|
+
|
18
|
+
namespace = @spec.namespace || kwargs[:namespace]
|
19
|
+
|
20
|
+
if namespace
|
21
|
+
send(:namespace, namespace) { setup }
|
22
|
+
else
|
23
|
+
setup
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
def setup
|
30
|
+
desc <<-EOF.strip
|
31
|
+
Build #{@spec.pkg_file_name}.gem into the pkg directory.
|
32
|
+
EOF
|
33
|
+
task(:build) { build }
|
34
|
+
|
35
|
+
desc <<-EOF.strip
|
36
|
+
Build and install #{@spec.pkg_file_name} into system gems.
|
37
|
+
EOF
|
38
|
+
task(install: [:build]) { install }
|
39
|
+
|
40
|
+
desc <<-EOF.strip
|
41
|
+
Build and install #{@spec.pkg_file_name} into system gems without network access.
|
42
|
+
EOF
|
43
|
+
task('install:local' => [:build]) { install local: true }
|
44
|
+
|
45
|
+
desc <<-EOF.strip
|
46
|
+
Create and push tag #{@spec.version_tag}, build gem and publish to #{@spec.push_host_name}.
|
47
|
+
EOF
|
48
|
+
task :release, [:remote] => %w(build release:push release:publish)
|
49
|
+
|
50
|
+
task 'release:guard:clean' do
|
51
|
+
guard_clean
|
52
|
+
end
|
53
|
+
|
54
|
+
task 'release:guard:tag' do
|
55
|
+
guard_tag
|
56
|
+
end
|
57
|
+
|
58
|
+
task 'release:push', [:remote] => %w(release:guard:clean) do |_, args|
|
59
|
+
tag_version { git_push(args[:remote]) } unless already_tagged?
|
60
|
+
end
|
61
|
+
|
62
|
+
task 'release:publish' => %w(release:guard:tag) do
|
63
|
+
publish if publish?
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def guard_clean
|
68
|
+
return if clean? && committed?
|
69
|
+
raise 'There are files that need to be committed first.'
|
70
|
+
end
|
71
|
+
|
72
|
+
def guard_tag
|
73
|
+
out, ret = sh! 'git', 'tag', '--points-at', 'HEAD'
|
74
|
+
|
75
|
+
if not out.split("\n").include? @spec.version_tag
|
76
|
+
raise "Tag #{@spec.version_tag} does not point to current HEAD. Cannot release wrong code."
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def build
|
81
|
+
@spec.pkg_path.mkpath
|
82
|
+
|
83
|
+
sh! 'gem', 'build', '-V', @spec.gemspec_path
|
84
|
+
|
85
|
+
@spec.pkg_path.mkpath
|
86
|
+
FileUtils.mv @spec.pkg_file_name, @spec.pkg_path.join(@spec.pkg_file_name)
|
87
|
+
|
88
|
+
Release.ui.confirm "#{@spec.name} #{@spec.version} built to #{@spec.pkg_path}."
|
89
|
+
end
|
90
|
+
|
91
|
+
def install(local: false)
|
92
|
+
cmd = %w(gem install) + [@spec.pkg_file_path]
|
93
|
+
cmd << '--local' if local
|
94
|
+
|
95
|
+
sh! *cmd
|
96
|
+
|
97
|
+
Release.ui.confirm "#{@spec.name} (#{@spec.version}) installed."
|
98
|
+
end
|
99
|
+
|
100
|
+
def publish
|
101
|
+
cmd = %w(gem push)
|
102
|
+
cmd << @spec.pkg_file_path
|
103
|
+
cmd << '--host'
|
104
|
+
cmd << @spec.push_host
|
105
|
+
|
106
|
+
sh! *cmd
|
107
|
+
|
108
|
+
Release.ui.confirm "Pushed #{@spec.pkg_file_name} to #{@spec.push_host}"
|
109
|
+
end
|
110
|
+
|
111
|
+
def git_clean
|
112
|
+
clean? && committed? || raise("There are files that need to be committed first.")
|
113
|
+
end
|
114
|
+
|
115
|
+
def clean?
|
116
|
+
out, ret = sh 'git', 'diff', '--exit-code'
|
117
|
+
|
118
|
+
ret == 0
|
119
|
+
end
|
120
|
+
|
121
|
+
def committed?
|
122
|
+
out, ret = sh 'git', 'diff-index', '--quiet', '--cached', 'HEAD'
|
123
|
+
|
124
|
+
ret == 0
|
125
|
+
end
|
126
|
+
|
127
|
+
def tag_version
|
128
|
+
sh! 'git', 'tag', '-a', '-m', "Version #{@spec.version}", @spec.version_tag
|
129
|
+
|
130
|
+
Release.ui.confirm "Tagged #{@spec.version_tag}."
|
131
|
+
|
132
|
+
yield if block_given?
|
133
|
+
rescue
|
134
|
+
Release.ui.error "Untagging #{@spec.version_tag} due to error."
|
135
|
+
|
136
|
+
sh! 'git', 'tag', '-d', @spec.version_tag
|
137
|
+
|
138
|
+
raise
|
139
|
+
end
|
140
|
+
|
141
|
+
def already_tagged?
|
142
|
+
out, ret = sh 'git', 'tag'
|
143
|
+
|
144
|
+
unless out.split(/\n/).include? @spec.version_tag
|
145
|
+
return false
|
146
|
+
end
|
147
|
+
|
148
|
+
Release.ui.confirm "Tag #{@spec.version_tag} has already been created."
|
149
|
+
|
150
|
+
true
|
151
|
+
end
|
152
|
+
|
153
|
+
def git_push(remote)
|
154
|
+
cmd = %w(git push --quiet)
|
155
|
+
|
156
|
+
if not remote.to_s.empty?
|
157
|
+
cmd << remote
|
158
|
+
end
|
159
|
+
|
160
|
+
sh! *cmd
|
161
|
+
sh! *cmd, '--tags'
|
162
|
+
|
163
|
+
Release.ui.confirm 'Pushed git commits and tags.'
|
164
|
+
end
|
165
|
+
|
166
|
+
def publish?
|
167
|
+
! %w(n no nil false off 0).include?(ENV["gem_push"].to_s.downcase)
|
168
|
+
end
|
169
|
+
|
170
|
+
def sh!(*cmd, **kwargs, &block)
|
171
|
+
cmd = cmd.flatten.map(&:to_s)
|
172
|
+
|
173
|
+
out, ret = sh(*cmd, **kwargs, &block)
|
174
|
+
|
175
|
+
if ret != 0
|
176
|
+
raise RuntimeError.new <<-EOS.gsub /^\s*\.?/, ''
|
177
|
+
Running `#{cmd}` failed, exit code: #{ret}
|
178
|
+
.#{out.gsub(/\n/, "\n ")}
|
179
|
+
EOS
|
180
|
+
end
|
181
|
+
|
182
|
+
[out, ret]
|
183
|
+
end
|
184
|
+
|
185
|
+
def sh(*cmd, chdir: @spec.base, raise_error: true, &block)
|
186
|
+
cmd = cmd.flatten.map(&:to_s)
|
187
|
+
|
188
|
+
Release.ui.debug cmd
|
189
|
+
|
190
|
+
Open3.popen2(*cmd, chdir: chdir) do |stdin, out, t|
|
191
|
+
stdin.close
|
192
|
+
|
193
|
+
status = t.value
|
194
|
+
|
195
|
+
[out.read, status.exitstatus]
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
class << self
|
200
|
+
def load_all(dir = Release.pwd)
|
201
|
+
specs = Spec.scan dir
|
202
|
+
|
203
|
+
if block_given?
|
204
|
+
specs.each(&Proc.new)
|
205
|
+
end
|
206
|
+
|
207
|
+
specs.each {|spec| Task.new spec }
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = 'rake-release'
|
5
|
+
spec.version = '0.3.1'
|
6
|
+
spec.authors = ['Jan Graichen']
|
7
|
+
spec.email = ['jgraichen@altimos.de']
|
8
|
+
spec.licenses = ['MIT']
|
9
|
+
|
10
|
+
spec.summary = %q{Configurable fork of bundlers release tasks.}
|
11
|
+
spec.description = %q{Configurable fork of bundlers release tasks.}
|
12
|
+
spec.homepage = 'https://github.com/jgraichen/rake-release'
|
13
|
+
|
14
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
15
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
|
+
spec.require_paths = %w(lib)
|
17
|
+
|
18
|
+
spec.add_dependency 'bundler', '~> 1.11'
|
19
|
+
|
20
|
+
spec.add_development_dependency 'bundler', '~> 1.11'
|
21
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
22
|
+
end
|
data/scripts/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "rake/release"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/scripts/setup
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rake-release
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Graichen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,7 +58,18 @@ email:
|
|
58
58
|
executables: []
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
|
-
files:
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- Gemfile
|
64
|
+
- LICENSE
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- lib/rake/release.rb
|
68
|
+
- lib/rake/release/spec.rb
|
69
|
+
- lib/rake/release/task.rb
|
70
|
+
- rake-release.gemspec
|
71
|
+
- scripts/console
|
72
|
+
- scripts/setup
|
62
73
|
homepage: https://github.com/jgraichen/rake-release
|
63
74
|
licenses:
|
64
75
|
- MIT
|