release-gem 0.1.5 → 0.1.6
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.lock +1 -1
- data/lib/release/gem/gem_action.rb +1 -1
- data/lib/release/gem/release_infector.rb +179 -0
- data/lib/release/gem/vcs_action.rb +72 -0
- data/lib/release/gem/vcs_cli_action.rb +100 -1
- data/lib/release/gem/version.rb +1 -1
- data/templates/standard_cli_flow.rb +2 -0
- data/templates/standard_flow.rb +81 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b5f829021df7a73c3e93c06b2e4d788f103a1f0ac096d3c472a7b4cfd575122c
|
4
|
+
data.tar.gz: 7c4a3acaa233d7bcff3a1ef308dbdfe3ea7b669f3418d3205072b6b2c5b9ada2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8cc062083ef870fd5ef74eff9b9d8b05072b2348096d10fddab73c8d1ad2cf3ad81ce52dcf5c5447787103429e6c14f970189729a3873293358a432bf83aeb8
|
7
|
+
data.tar.gz: 9ae8f560785f812de5578155547df4ab94deefafa4e741fb2d6b23af13f063c672ae93a75cbce10abc5067d5be7abf640d4aa46f359808ab26f9d66c5327049e
|
data/Gemfile.lock
CHANGED
@@ -0,0 +1,179 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Release
|
4
|
+
module Gem
|
5
|
+
|
6
|
+
class ReleaseInfectorError < StandardError; end
|
7
|
+
|
8
|
+
#
|
9
|
+
# Setup the release-gem into other gem project automatically!
|
10
|
+
#
|
11
|
+
class ReleaseInfector
|
12
|
+
include TR::CondUtils
|
13
|
+
include TR::TerminalUtils
|
14
|
+
|
15
|
+
def initialize(root, name)
|
16
|
+
@root = root
|
17
|
+
@name = name
|
18
|
+
@backupFiles = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
def infect(&block)
|
22
|
+
if not is_release_gem_installed?
|
23
|
+
add_to_gemspec(&block)
|
24
|
+
Bundler.with_clean_env do
|
25
|
+
res = `cd #{@root} && bundle`
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
if not is_rakefile_activated?
|
30
|
+
activate_rakefile(&block)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def trigger_release_gem(&block)
|
35
|
+
|
36
|
+
block.call(:triggering_release_gem) if block
|
37
|
+
|
38
|
+
poss = tu_possible_terminal
|
39
|
+
raise ReleaseInfectorError, "No possible terminal found" if is_empty?(poss)
|
40
|
+
|
41
|
+
Bundler.with_clean_env do
|
42
|
+
|
43
|
+
cmd = "cd #{@root} && rake gem:release"
|
44
|
+
terminal = ""
|
45
|
+
if block
|
46
|
+
terminal = block.call(:select_terminal, name: @name, options: poss)
|
47
|
+
terminal = poss.first if is_empty?(terminal)
|
48
|
+
|
49
|
+
block.call(:new_terminal_launching, name: @name, terminal: terminal)
|
50
|
+
tu_new_terminal(terminal, cmd)
|
51
|
+
else
|
52
|
+
terminal = poss.first
|
53
|
+
block.call(:new_terminal_launching, name: @name, terminal: terminal)
|
54
|
+
tu_new_terminal(terminal, cmd)
|
55
|
+
end
|
56
|
+
|
57
|
+
block.call(:new_terminal_launched, name: @name, terminal: terminal) if block
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
def is_release_gem_installed?
|
64
|
+
#Bundler.with_clean_env do
|
65
|
+
Bundler.with_unbundled_env do
|
66
|
+
|
67
|
+
res = `cd #{@root} && bundle 2>&1`
|
68
|
+
|
69
|
+
puts res
|
70
|
+
|
71
|
+
if $?.success?
|
72
|
+
found = false
|
73
|
+
res.each_line do |l|
|
74
|
+
if l =~ / release-gem /
|
75
|
+
found = true
|
76
|
+
break
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
found
|
81
|
+
else
|
82
|
+
raise ReleaseInfectorError, "Error running bundle in '#{@root}'. Error was :\n#{res}"
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end # is_release_gem_installed?
|
87
|
+
|
88
|
+
def add_to_gemspec(&block)
|
89
|
+
|
90
|
+
|
91
|
+
gs = Dir.glob(File.join(@root,"*.gemspec"))
|
92
|
+
raise ReleaseInfectorError, "gemspec not found at '#{@root}'" if is_empty?(gs)
|
93
|
+
|
94
|
+
block.call(:adding_to_gemspec, gemspec: gs) if block
|
95
|
+
|
96
|
+
if gs.length > 1
|
97
|
+
if block
|
98
|
+
gs = block.call(:multiple_gemspecs, gs)
|
99
|
+
else
|
100
|
+
raise ReleaseInfectorError, "There are more than 1 gemspec file found (#{gs.length} found). Since no block to filter out the required one, this will be an error condition"
|
101
|
+
end
|
102
|
+
|
103
|
+
else
|
104
|
+
gs = gs.first
|
105
|
+
end
|
106
|
+
|
107
|
+
cont = File.read(gs)
|
108
|
+
lastEnd = cont.rindex("end")
|
109
|
+
|
110
|
+
FileUtils.mv(gs, "#{gs}.bak")
|
111
|
+
@backupFiles[gs] = "#{gs}.bak"
|
112
|
+
|
113
|
+
File.open(gs, "w") do |f|
|
114
|
+
f.write cont[0...lastEnd]
|
115
|
+
f.puts " spec.add_development_dependency 'release-gem'"
|
116
|
+
f.puts "end"
|
117
|
+
end
|
118
|
+
block.call(:gemspec_updated, name: @name, gemspec: gs )
|
119
|
+
|
120
|
+
end # add_to_gemspec
|
121
|
+
|
122
|
+
def activate_rakefile(&block)
|
123
|
+
|
124
|
+
rf = File.join(@root,"Rakefile")
|
125
|
+
if not File.exist?(rf)
|
126
|
+
rfCont <<-END
|
127
|
+
# frozen_string_literal: true
|
128
|
+
|
129
|
+
require "bundler/gem_tasks"
|
130
|
+
require "rspec/core/rake_task"
|
131
|
+
|
132
|
+
require "release/gem"
|
133
|
+
|
134
|
+
RSpec::Core::RakeTask.new(:spec)
|
135
|
+
|
136
|
+
task default: :spec
|
137
|
+
END
|
138
|
+
block.call(:creating_new_rakefile, rakefile: rf )
|
139
|
+
File.open(rf,"w") do |f|
|
140
|
+
f.write rfCont
|
141
|
+
end
|
142
|
+
else
|
143
|
+
|
144
|
+
block.call(:adding_to_rakefile, rakefile: rf )
|
145
|
+
|
146
|
+
cont = File.read(rf)
|
147
|
+
FileUtils.mv(rf, "#{rf}.bak")
|
148
|
+
@backupFiles[rf] = "#{rf}.bak"
|
149
|
+
|
150
|
+
File.open(rf,"w") do |f|
|
151
|
+
f.puts cont
|
152
|
+
f.puts "require 'release/gem'"
|
153
|
+
end
|
154
|
+
|
155
|
+
block.call(:rakefile_updated, name: @name, rakefile: rf) if block
|
156
|
+
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def is_rakefile_activated?
|
161
|
+
rf = File.join(@root,"Rakefile")
|
162
|
+
if not File.exist?(rf)
|
163
|
+
false
|
164
|
+
else
|
165
|
+
cont = File.read(rf)
|
166
|
+
found = false
|
167
|
+
cont.each_line do |l|
|
168
|
+
if l =~ /require ('|")(release\/gem)("|')/
|
169
|
+
found = true
|
170
|
+
break
|
171
|
+
end
|
172
|
+
end
|
173
|
+
found
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
@@ -42,6 +42,72 @@ module Release
|
|
42
42
|
instance_eval(&block) if block
|
43
43
|
end
|
44
44
|
|
45
|
+
#
|
46
|
+
# Special operation since the gem build will only include files from
|
47
|
+
# git ls-files
|
48
|
+
#
|
49
|
+
def commit_new_files(msg = nil, &block)
|
50
|
+
|
51
|
+
res = :value
|
52
|
+
if block
|
53
|
+
|
54
|
+
loop do
|
55
|
+
|
56
|
+
stgDir, stgFiles = @ws.staged_files
|
57
|
+
newDir, newFiles = @ws.new_files
|
58
|
+
|
59
|
+
if is_empty?(newFiles)
|
60
|
+
res = :skip
|
61
|
+
break
|
62
|
+
end
|
63
|
+
|
64
|
+
newFiles.delete_if { |f| stgFiles.include?(f) }
|
65
|
+
newDir.delete_if { |f| stgDir.include?(f) }
|
66
|
+
|
67
|
+
res = block.call(:select_files_to_commit, { new: { files: newFiles, dirs: newDir }, staged: { files: stgFiles, dirs: stgDir }, vcs: self } )
|
68
|
+
|
69
|
+
break if res == :skip or res == :done
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
if res == :done
|
74
|
+
|
75
|
+
stgDir, stgFiles = @ws.staged_files
|
76
|
+
block.call(:staged_elements_of_commit, { files: stgFiles, dirs: stgDir })
|
77
|
+
|
78
|
+
msg = block.call(:commit_message) if is_empty?(msg)
|
79
|
+
raise VcsActionError, "Commit message is empty" if is_empty?(msg)
|
80
|
+
|
81
|
+
cp "Commit with user message : #{msg}"
|
82
|
+
st, res = @ws.commit(msg)
|
83
|
+
if st
|
84
|
+
block.call(:commit_successful, res) if block
|
85
|
+
else
|
86
|
+
block.call(:commit_failed, res) if block
|
87
|
+
end
|
88
|
+
[st, res]
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
elsif not_empty?(msg)
|
94
|
+
|
95
|
+
newDir, newFiles = @ws.new_files
|
96
|
+
add_to_staging(*newFiles)
|
97
|
+
|
98
|
+
cp "Commit with user message : #{msg}"
|
99
|
+
st, res = @ws.commit(msg)
|
100
|
+
if st
|
101
|
+
block.call(:commit_successful, res) if block
|
102
|
+
else
|
103
|
+
block.call(:commit_failed, res) if block
|
104
|
+
end
|
105
|
+
[st, res]
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
45
111
|
def commit(msg = nil, &block)
|
46
112
|
|
47
113
|
res = :value
|
@@ -57,6 +123,12 @@ module Release
|
|
57
123
|
|
58
124
|
modFiles.delete_if { |f| stgFiles.include?(f) }
|
59
125
|
modDir.delete_if { |f| stgDir.include?(f) }
|
126
|
+
|
127
|
+
newFiles.delete_if { |f| stgFiles.include?(f) }
|
128
|
+
newDir.delete_if { |f| stgDir.include?(f) }
|
129
|
+
|
130
|
+
delFiles.delete_if { |f| stgFiles.include?(f) }
|
131
|
+
delDir.delete_if { |f| stgDir.include?(f) }
|
60
132
|
|
61
133
|
# block should call vcs for add, remove, ignore and other operations
|
62
134
|
res = block.call(:select_files_to_commit, { modified: { files: modFiles, dirs: modDir }, new: { files: newFiles, dirs: newDir }, deleted: { files: delFiles, dirs: delDir }, staged: { files: stgFiles, dirs: stgDir }, vcs: self, counter: counter } )
|
@@ -20,6 +20,105 @@ module Release
|
|
20
20
|
instance_eval(&block) if block
|
21
21
|
end
|
22
22
|
|
23
|
+
def commit_new_files(*args, &block)
|
24
|
+
res = @inst.commit_new_files do |ops, *args|
|
25
|
+
|
26
|
+
preset = false
|
27
|
+
if block
|
28
|
+
res = block.call(ops, *args)
|
29
|
+
if res.nil?
|
30
|
+
preset = true
|
31
|
+
else
|
32
|
+
res
|
33
|
+
end
|
34
|
+
else
|
35
|
+
preset = true
|
36
|
+
end
|
37
|
+
|
38
|
+
if preset
|
39
|
+
|
40
|
+
case ops
|
41
|
+
when :select_files_to_commit
|
42
|
+
mfiles = args.first
|
43
|
+
@prmt.puts pmsg("\n Files already added to staging : ")
|
44
|
+
mfiles[:staged].each do |k,v|
|
45
|
+
v.each do |vv|
|
46
|
+
@prmt.puts " * #{vv}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
@prmt.puts ""
|
51
|
+
|
52
|
+
sel = @prmt.multi_select pmsg("\n Following are new files that could be added to version control : ") do |m|
|
53
|
+
|
54
|
+
mfiles[:new].each do |k,v|
|
55
|
+
v.each do |vv|
|
56
|
+
m.choice vv, vv.path
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
m.choice "Skip", :skip #if mfiles[:counter] == 0
|
61
|
+
m.choice "Done", :done
|
62
|
+
m.choice "Abort", :abort
|
63
|
+
end
|
64
|
+
|
65
|
+
if sel.include?(:abort)
|
66
|
+
raise Release::Gem::Abort, "User aborted"
|
67
|
+
elsif sel.include?(:skip)
|
68
|
+
:skip
|
69
|
+
else
|
70
|
+
res = :done if sel.include?(:done)
|
71
|
+
s = sel.clone
|
72
|
+
s.delete_if { |e| e == :done }
|
73
|
+
if not_empty?(s)
|
74
|
+
st, cres = add_to_staging(*s) if not_empty?(s)
|
75
|
+
if st
|
76
|
+
@prmt.puts pmsg("\n Files added successfully", :green)
|
77
|
+
else
|
78
|
+
@prmt.puts pmsg("\n Files failed to be added. Message was : #{cres}", :red)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
res
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
when :commit_message
|
87
|
+
msg = ""
|
88
|
+
loop do
|
89
|
+
msg = @prmt.ask(pmsg("\n Commit message : "), required: true)
|
90
|
+
confirm = @prmt.yes?(pmsg(" Commit message : #{msg}\n Proceed? No to provide a new commit message "))
|
91
|
+
if confirm
|
92
|
+
break
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
msg
|
97
|
+
|
98
|
+
when :staged_elements_of_commit
|
99
|
+
|
100
|
+
elements = args.first
|
101
|
+
@prmt.puts pmsg("\n Following new files/directories shall be committed in this session : ")
|
102
|
+
elements.each do |k,v|
|
103
|
+
v.each do |vv|
|
104
|
+
@prmt.puts " * #{vv}"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
when :commit_successful
|
109
|
+
@prmt.puts pmsg("\n Changes committed",:green)
|
110
|
+
@prmt.puts args.first
|
111
|
+
|
112
|
+
when :commit_failed
|
113
|
+
@prmt.puts pmsg("\n Changes failed to be committed. Error was : #{args.first}")
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end # commit_new_files block
|
118
|
+
|
119
|
+
end # commit_new_files
|
120
|
+
|
121
|
+
|
23
122
|
def commit(*args, &block)
|
24
123
|
res = @inst.commit do |ops, *args|
|
25
124
|
|
@@ -60,7 +159,7 @@ module Release
|
|
60
159
|
|
61
160
|
end
|
62
161
|
|
63
|
-
m.choice "Skip", :skip if mfiles[:counter] == 0
|
162
|
+
m.choice "Skip", :skip #if mfiles[:counter] == 0
|
64
163
|
m.choice "Done", :done
|
65
164
|
m.choice "Abort", :abort
|
66
165
|
end
|
data/lib/release/gem/version.rb
CHANGED
data/templates/standard_flow.rb
CHANGED
@@ -59,6 +59,87 @@ Release::Gem.engine(:gem, root: Dir.getwd, ui: STDOUT) do
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
+
## Check in NEW file first or else the gem build will not pick up by the git ls-files
|
63
|
+
vcs_commit_new_files do |ops, *args|
|
64
|
+
|
65
|
+
case ops
|
66
|
+
when :select_files_to_commit
|
67
|
+
mfiles = args.first
|
68
|
+
pmt.puts "\n Files already added to staging : ".yellow
|
69
|
+
mfiles[:staged].each do |k,v|
|
70
|
+
v.each do |vv|
|
71
|
+
pmt.puts " * #{vv}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
pmt.puts ""
|
76
|
+
|
77
|
+
sel = pmt.multi_select "\n Following are new files that could be added to version control : ".yellow do |m|
|
78
|
+
|
79
|
+
[:modified, :new, :deleted].each do |cat|
|
80
|
+
mfiles[cat].each do |k,v|
|
81
|
+
v.each do |vv|
|
82
|
+
m.choice vv, vv.path
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
m.choice "Skip", :skip if mfiles[:counter] == 0
|
89
|
+
m.choice "Done", :done
|
90
|
+
m.choice "Abort", :abort
|
91
|
+
end
|
92
|
+
|
93
|
+
if sel.include?(:abort)
|
94
|
+
raise Release::Gem::Abort, "User aborted"
|
95
|
+
elsif sel.include?(:skip)
|
96
|
+
:skip
|
97
|
+
else
|
98
|
+
res = :done if sel.include?(:done)
|
99
|
+
s = sel.clone
|
100
|
+
s.delete_if { |e| e == :done }
|
101
|
+
if not_empty?(s)
|
102
|
+
st, cres = add_to_staging(*s) if not_empty?(s)
|
103
|
+
if st
|
104
|
+
pmt.puts "\n Files added successfully".green
|
105
|
+
else
|
106
|
+
pmt.puts "\n Files failed to be added. Message was : #{cres}".red
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
res
|
111
|
+
end
|
112
|
+
|
113
|
+
when :commit_message
|
114
|
+
msg = ""
|
115
|
+
loop do
|
116
|
+
msg = pmt.ask("\n Commit message : ".yellow, required: true)
|
117
|
+
confirm = pmt.yes?(" Commit message : #{msg}\n Proceed? No to provide a new commit message ".yellow)
|
118
|
+
if confirm
|
119
|
+
break
|
120
|
+
end
|
121
|
+
end
|
122
|
+
msg
|
123
|
+
|
124
|
+
when :staged_elements_of_commit
|
125
|
+
elements = args.first
|
126
|
+
pmt.puts "\n Following files/directories shall be committed in this session : ".yellow
|
127
|
+
elements.each do |k,v|
|
128
|
+
v.each do |vv|
|
129
|
+
pmt.puts " * #{vv}"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
when :commit_successful
|
134
|
+
pmt.puts "\n Changes committed".green
|
135
|
+
|
136
|
+
when :commit_failed
|
137
|
+
pmt.puts "\n Changes failed to be committed. Error was : #{args.first}"
|
138
|
+
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
62
143
|
# step 3 : build the gem
|
63
144
|
st, ver = build do |ops, *args|
|
64
145
|
case ops
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: release-gem
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris
|
@@ -126,6 +126,7 @@ files:
|
|
126
126
|
- lib/release/gem/gem_cli_action.rb
|
127
127
|
- lib/release/gem/gem_engine.rb
|
128
128
|
- lib/release/gem/gemdep.rb
|
129
|
+
- lib/release/gem/release_infector.rb
|
129
130
|
- lib/release/gem/vcs_action.rb
|
130
131
|
- lib/release/gem/vcs_cli_action.rb
|
131
132
|
- lib/release/gem/version.rb
|