release_manager 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.gitlab-ci-dev.yml +51 -0
- data/CHANGELOG.md +13 -0
- data/Dockerfile +2 -1
- data/Gemfile +2 -2
- data/Gemfile.lock +30 -29
- data/README.md +1 -3
- data/docker-compose.yml +20 -2
- data/exe/bump-changelog +3 -2
- data/exe/deploy-r10k +4 -0
- data/lib/release_manager/changelog.rb +49 -47
- data/lib/release_manager/cli/bump_changelog_cli.rb +36 -0
- data/lib/release_manager/cli/deploy_mod_cli.rb +7 -7
- data/lib/release_manager/cli/deploy_r10k_cli.rb +64 -0
- data/lib/release_manager/cli/release_mod_cli.rb +20 -1
- data/lib/release_manager/cli/sandbox_create_cli.rb +1 -0
- data/lib/release_manager/control_repo.rb +14 -0
- data/lib/release_manager/errors.rb +4 -0
- data/lib/release_manager/git/utilites.rb +187 -49
- data/lib/release_manager/module_deployer.rb +8 -6
- data/lib/release_manager/puppet_module.rb +70 -41
- data/lib/release_manager/puppetfile.rb +23 -13
- data/lib/release_manager/r10k_deployer.rb +135 -0
- data/lib/release_manager/release.rb +41 -34
- data/lib/release_manager/remote_release.rb +68 -0
- data/lib/release_manager/sandbox.rb +15 -68
- data/lib/release_manager/vcs_manager/gitlab_adapter.rb +189 -35
- data/lib/release_manager/vcs_manager/vcs_adapter.rb +103 -0
- data/lib/release_manager/vcs_manager.rb +12 -1
- data/lib/release_manager/version.rb +1 -1
- data/release_manager.gemspec +2 -2
- data/scratchcode.rb +13 -0
- data/setup_repos.rb +7 -4
- data/test_release.sh +3 -0
- data/test_sandbox.rb +0 -0
- metadata +18 -8
@@ -3,6 +3,7 @@ require 'uri'
|
|
3
3
|
|
4
4
|
module ReleaseManager
|
5
5
|
module Git
|
6
|
+
STATUSES = [:added, :deleted, :modified, :renamed, :copied, :ignored, :untracked, :typechange]
|
6
7
|
module Utilities
|
7
8
|
|
8
9
|
def repo
|
@@ -13,11 +14,10 @@ module ReleaseManager
|
|
13
14
|
def fetch(remote_name = 'upstream')
|
14
15
|
return unless remote_exists?(remote_name)
|
15
16
|
remote = repo.remotes[remote_name]
|
17
|
+
options = {credentials: credentials.call(remote.url)}
|
16
18
|
logger.info("Fetching remote #{remote_name} from #{remote.url}")
|
17
|
-
|
18
|
-
|
19
|
-
credentials: credentials.call(remote.url)
|
20
|
-
})
|
19
|
+
options[:certificate_check] = lambda { |valid, host| true } if ENV['GIT_SSL_NO_VERIFY']
|
20
|
+
remote.fetch(options)
|
21
21
|
end
|
22
22
|
|
23
23
|
def transports
|
@@ -110,12 +110,16 @@ module ReleaseManager
|
|
110
110
|
# @param [String] name - the name of the branch to delete
|
111
111
|
def delete_branch(name)
|
112
112
|
repo.branches.delete(name)
|
113
|
+
!branch_exist?(name)
|
113
114
|
end
|
114
115
|
|
115
116
|
# @param [String] remote_name - the remote name to push the branch to
|
116
|
-
def push_branch(remote_name, branch)
|
117
|
+
def push_branch(remote_name, branch, force = false)
|
117
118
|
remote = find_or_create_remote(remote_name)
|
118
|
-
|
119
|
+
b = repo.branches[branch]
|
120
|
+
raise InvalidBranchName.new("Branch #{branch} does not exist locally, cannot push") unless b
|
121
|
+
refs = [b.canonical_name]
|
122
|
+
refs = refs.map { |r| r.prepend('+') } if force
|
119
123
|
logger.info("Pushing branch #{branch} to remote #{remote.url}")
|
120
124
|
remote.push(refs, credentials: credentials)
|
121
125
|
end
|
@@ -134,10 +138,28 @@ module ReleaseManager
|
|
134
138
|
repo.head.name.sub(/^refs\/heads\//, '')
|
135
139
|
end
|
136
140
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
+
# @param name [String] - the name of the branch
|
142
|
+
# @return [Boolean] returns true if the current branch is the name
|
143
|
+
def current_branch?(name)
|
144
|
+
current_branch != name
|
145
|
+
end
|
146
|
+
|
147
|
+
# @param name [String] - the name of the tag
|
148
|
+
# @param ref [String] - the ref oid the tag should point to
|
149
|
+
# @param message [String] - optional tag message
|
150
|
+
def create_local_tag(name, ref, message = nil)
|
151
|
+
message ||= name
|
152
|
+
logger.info("Creating tag #{name} which points to #{ref}")
|
153
|
+
repo.tags.create(name, ref, {:message => message} )
|
154
|
+
end
|
155
|
+
|
156
|
+
# @param name [String] - the name of the branch to checkout
|
157
|
+
# @return [Rugged::Branch] returns the rugged branch object
|
158
|
+
def checkout_branch(name, options = {})
|
159
|
+
if current_branch?(name)
|
160
|
+
logger.debug("Checking out branch: #{name} for #{path}")
|
161
|
+
repo.checkout(name, options)
|
162
|
+
logger.debug("Checked out branch: #{current_branch} for #{path}")
|
141
163
|
else
|
142
164
|
# already checked out
|
143
165
|
logger.debug("Currently on branch #{name} for #{path}")
|
@@ -172,7 +194,7 @@ module ReleaseManager
|
|
172
194
|
# @return [MatchData] MatchData if the remote name is a url
|
173
195
|
# Is the name actually a url?
|
174
196
|
def git_url?(name)
|
175
|
-
/((
|
197
|
+
/([A-Za-z0-9]+@|http(|s)\:\/\/)([A-Za-z0-9.]+)(:|\/)([A-Za-z0-9\/]+)(\.git)?/.match(name)
|
176
198
|
end
|
177
199
|
|
178
200
|
# @return [String] - the author name found in the config
|
@@ -190,66 +212,128 @@ module ReleaseManager
|
|
190
212
|
{:email=>author_email, :time=>Time.now, :name=>author_name}
|
191
213
|
end
|
192
214
|
|
193
|
-
#
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
# index.write
|
200
|
-
# end
|
215
|
+
# @param pathspec Array[String] path specs as strings in an array
|
216
|
+
def add_all(pathspec = [])
|
217
|
+
index = repo.index
|
218
|
+
index.add_all
|
219
|
+
index.write
|
220
|
+
end
|
201
221
|
|
202
222
|
# @param [String] file - the path to the file you want to add
|
203
223
|
def add_file(file)
|
224
|
+
logger.debug("Adding file #{file}")
|
225
|
+
return add_all if file == '.'
|
226
|
+
index = repo.index
|
227
|
+
file.slice!(repo.workdir)
|
228
|
+
index.add(:path => file, :oid => Rugged::Blob.from_workdir(repo, file), :mode => 0100644)
|
229
|
+
end
|
230
|
+
|
231
|
+
# @param [String] file - the path to the patch file you want to apply
|
232
|
+
def apply_patch(file)
|
204
233
|
# TODO: change this to rugged implementation
|
205
|
-
|
234
|
+
logger.info("Applying patch #{file}")
|
235
|
+
Dir.chdir(path) do
|
236
|
+
output = `#{git_command} apply #{file} 2>&1`
|
237
|
+
end
|
238
|
+
raise PatchError.new(output) unless $?.success?
|
239
|
+
end
|
240
|
+
|
241
|
+
# [Rugged::Diff] a rugged diff object
|
242
|
+
# Not fully tested
|
243
|
+
def apply_diff(diff)
|
244
|
+
diff.deltas.each do |d|
|
245
|
+
case d.status
|
246
|
+
when :deleted
|
247
|
+
remove_file(d.new_file[:path])
|
248
|
+
File.delete(File.join(path, path))
|
249
|
+
when :added, :modified
|
250
|
+
add_file(d.new_file[:path])
|
251
|
+
when :renamed
|
252
|
+
remove_file(d.old_file[:path])
|
253
|
+
File.delete(File.join(path, path))
|
254
|
+
add_file(d.new_file[:path])
|
255
|
+
else
|
256
|
+
logger.warn("File has a status of #{d.status}")
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
def up2date?(src_ref, dst_ref)
|
262
|
+
create_diff(src_ref, dst_ref).deltas.count < 1
|
263
|
+
end
|
264
|
+
|
265
|
+
# @return [String] the git command with
|
266
|
+
def git_command
|
267
|
+
@git_command ||= "git --work-tree=#{path} --git-dir=#{repo.path}"
|
206
268
|
end
|
207
269
|
|
208
270
|
# @param [String] file - the path to the file you want to remove
|
209
271
|
def remove_file(file)
|
272
|
+
logger.debug("Removing file #{file}")
|
210
273
|
index = repo.index
|
211
274
|
File.unlink(file)
|
212
275
|
index.remove(file)
|
213
|
-
index.write
|
214
276
|
end
|
215
277
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
# logger.info repo.status { |file, status_data| puts "#{file} has status: #{status_data.inspect}" }
|
220
|
-
#
|
221
|
-
# index = repo.index
|
222
|
-
# index.read_tree repo.head.target.tree unless repo.empty?
|
223
|
-
# require 'pry'; binding.pry
|
224
|
-
# #repo.lookup
|
225
|
-
# tree_new = index.write_tree repo
|
226
|
-
# oid = Rugged::Commit.create(repo,
|
227
|
-
# author: author,
|
228
|
-
# message: message,
|
229
|
-
# committer: author,
|
230
|
-
# parents: repo.empty? ? [] : [repo.head.target].compact,
|
231
|
-
# tree: tree_new,
|
232
|
-
# update_ref: 'HEAD')
|
233
|
-
# logger.info("Created commit #{oid} with #{message}")
|
234
|
-
# index.write
|
235
|
-
# #repo.status { |file, status_data| puts "#{file} has status: #{status_data.inspect}" }
|
236
|
-
# oid
|
237
|
-
# end
|
278
|
+
def update_cli_index
|
279
|
+
`#{git_command} update-index --really-refresh`
|
280
|
+
end
|
238
281
|
|
239
282
|
# @param [String] message - the message you want in the commit
|
240
|
-
# TODO: change this to rugged implementation
|
241
283
|
def create_commit(message)
|
242
|
-
|
284
|
+
# get the index for this repository
|
285
|
+
repo.status { |file, status_data| logger.debug "#{file} has status: #{status_data.inspect}" }
|
286
|
+
index = repo.index
|
287
|
+
index.write
|
288
|
+
options = {}
|
289
|
+
options[:author] = author
|
290
|
+
options[:message] = message
|
291
|
+
options[:committer] = author
|
292
|
+
options[:parents] = repo.empty? ? [] : [repo.head.target_id].compact
|
293
|
+
options[:update_ref] = 'HEAD'
|
294
|
+
options[:tree] = index.write_tree
|
295
|
+
oid = Rugged::Commit.create(repo, options)
|
296
|
+
if oid
|
297
|
+
logger.info("Created commit #{message}")
|
298
|
+
repo.status { |file, status_data| logger.debug "#{file} has status: #{status_data.inspect}" }
|
299
|
+
else
|
300
|
+
logger.warn("Something went wrong with the commit")
|
301
|
+
end
|
302
|
+
update_cli_index # for some reason the command line doesn't refresh the index after committing.
|
303
|
+
oid
|
304
|
+
end
|
305
|
+
|
306
|
+
# @param [String] message - the message you want in the commit
|
307
|
+
# TODO: change this to rugged implementation
|
308
|
+
def cli_create_commit(message)
|
309
|
+
output = nil
|
310
|
+
Dir.chdir(path) do
|
311
|
+
output = `#{git_command} commit --message '#{message}' 2>&1`
|
312
|
+
end
|
243
313
|
if $?.success?
|
244
314
|
logger.info("Created commit #{message}")
|
245
315
|
else
|
246
|
-
|
316
|
+
if output =~ /nothing\sto\scommit/
|
317
|
+
logger.info("Nothing to commit")
|
318
|
+
else
|
319
|
+
logger.error output
|
320
|
+
end
|
321
|
+
return false
|
247
322
|
end
|
248
323
|
end
|
249
324
|
|
250
|
-
# @
|
251
|
-
|
252
|
-
|
325
|
+
# @param [String] branch_name - the branch name you want to update
|
326
|
+
# @param [String] target - the target branch you want to rebase against
|
327
|
+
# @param [String] remote - the remote name to rebase from, defaults to local
|
328
|
+
# TODO: change this to rugged implementation
|
329
|
+
def rebase_branch(branch_name, target, remote = nil)
|
330
|
+
src = [remote, target].compact.join('/') # produces upstream/master
|
331
|
+
Dir.chdir(path) do
|
332
|
+
checkout_branch(branch_name)
|
333
|
+
logger.info("Rebasing #{branch_name} with #{src}")
|
334
|
+
output = `#{git_command} rebase #{src} 2>&1`
|
335
|
+
raise GitError.new(output) unless $?.success?
|
336
|
+
end
|
253
337
|
end
|
254
338
|
|
255
339
|
def cherry_pick(commit)
|
@@ -258,6 +342,60 @@ module ReleaseManager
|
|
258
342
|
logger.info("Cherry picking commit with id: #{commit}")
|
259
343
|
end
|
260
344
|
|
345
|
+
# @param src [Rubbed::Object] - the rugged object to compare from
|
346
|
+
# @param dst [Rubbed::Object] - the rugged object to compare to
|
347
|
+
# @return [Array[String]] the changed files in the commit or all the commits in the diff between src and dst
|
348
|
+
def changed_files(src_ref, dst_ref)
|
349
|
+
src = repo.lookup(find_ref(src_ref))
|
350
|
+
src = src.kind_of?(Rugged::Tag::Annotation) ? src.target : src
|
351
|
+
dst = repo.lookup(find_ref(dst_ref))
|
352
|
+
dst.diff(src).deltas.map { |d| [d.old_file[:path], d.new_file[:path]] }.flatten.uniq
|
353
|
+
end
|
354
|
+
|
355
|
+
# @param oid [String] the oid of the file object
|
356
|
+
# @return [String] the contents of the file from the object
|
357
|
+
def get_content(oid)
|
358
|
+
return nil if oid =~ /0000000000000000000000000000000000000000/
|
359
|
+
obj = repo.read(oid)
|
360
|
+
obj.data
|
361
|
+
end
|
362
|
+
|
363
|
+
# @param src [Rugged::Object] - the rugged object or string to compare from
|
364
|
+
# @param dst [Rugged::Object] - the rugged object or string to compare to
|
365
|
+
# @return Array[Hash] the changed files in the commit or all the commits in the diff between src and dst
|
366
|
+
# with status, old_path, new_path, and content
|
367
|
+
# status can be one of: :added, :deleted, :modified, :renamed, :copied, :ignored, :untracked, :typechange
|
368
|
+
def create_diff_obj(src, dst)
|
369
|
+
diff = create_diff(src, dst)
|
370
|
+
diff.deltas.map do |d|
|
371
|
+
{ old_path: d.old_file[:path], status: d.status,
|
372
|
+
new_path: d.new_file[:path], content: get_content(d.new_file[:oid])
|
373
|
+
}
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
377
|
+
# @param src_ref [Rugged::Object] - the rugged object or string to compare from
|
378
|
+
# @param dst_ref [Rugged::Object] - the rugged object or string to compare to
|
379
|
+
# @return [Rugged::Diff] a rugged diff object between src and dst
|
380
|
+
def create_diff(src_ref, dst_ref)
|
381
|
+
logger.debug("Creating a diff between #{dst_ref} and #{src_ref}")
|
382
|
+
src = repo.lookup(find_ref(src_ref))
|
383
|
+
src = src.kind_of?(Rugged::Tag::Annotation) ? src.target : src
|
384
|
+
dst = repo.lookup(find_ref(dst_ref))
|
385
|
+
dst = dst.kind_of?(Rugged::Tag::Annotation) ? dst.target : dst
|
386
|
+
dst.diff(src)
|
387
|
+
end
|
388
|
+
|
389
|
+
# @param sha_or_ref [String] - the name or sha of the ref
|
390
|
+
# @return [String] the oid of the sha or ref
|
391
|
+
def find_ref(sha_or_ref)
|
392
|
+
case sha_or_ref
|
393
|
+
when Rugged::Object
|
394
|
+
sha_or_ref.oid
|
395
|
+
else
|
396
|
+
repo.rev_parse_oid(sha_or_ref)
|
397
|
+
end
|
398
|
+
end
|
261
399
|
end
|
262
400
|
end
|
263
401
|
end
|
@@ -41,12 +41,16 @@ class ModuleDeployer
|
|
41
41
|
@puppetfile ||= Puppetfile.new(puppetfile_path)
|
42
42
|
end
|
43
43
|
|
44
|
+
def remote_deploy?
|
45
|
+
options[:remote]
|
46
|
+
end
|
47
|
+
|
44
48
|
# @param [PuppetModule] puppet_module - the puppet module to check for existance
|
45
49
|
# raises
|
46
50
|
def add_module(puppet_module)
|
47
51
|
unless puppetfile.mod_exists?(puppet_module.name)
|
48
|
-
answer = ask("The #{puppet_module.name} module does not exist, do you want to add it? (y/n): ", String) { |q| q =~ /y|n/i }.downcase
|
49
|
-
if answer == 'y'
|
52
|
+
answer = ask("The #{puppet_module.name} module does not exist, do you want to add it? (y/n): ", String) { |q| q =~ /y|n/i }.downcase unless options[:auto]
|
53
|
+
if answer == 'y' or options[:auto]
|
50
54
|
puppetfile.add_module(puppet_module.name, git: puppet_module.repo, tag: "v#{puppet_module.version}") unless options[:dry_run]
|
51
55
|
end
|
52
56
|
end
|
@@ -56,22 +60,20 @@ class ModuleDeployer
|
|
56
60
|
begin
|
57
61
|
check_requirements
|
58
62
|
logger.info "Deploying module #{puppet_module.name} with version: #{latest_version}"
|
63
|
+
add_module(puppet_module)
|
59
64
|
if options[:dry_run]
|
60
|
-
add_module(puppet_module)
|
61
65
|
puts "Would have updated module #{puppet_module.name} in Puppetfile to version: #{latest_version}".green
|
62
66
|
puts "Would have committed with message: bump #{puppet_module.name} to version: #{latest_version}".green if options[:commit]
|
63
67
|
puts "Would have just pushed branch: #{puppetfile.current_branch} to remote: #{control_repo_remote}".green if options[:push]
|
64
68
|
else
|
65
|
-
add_module(puppet_module)
|
66
69
|
puppetfile.write_version(puppet_module.name, latest_version)
|
67
70
|
puppetfile.write_source(puppet_module.name, puppet_module.source)
|
68
71
|
puppetfile.write_to_file
|
69
72
|
logger.info "Updated module #{puppet_module.name} in Puppetfile to version: #{latest_version}"
|
70
73
|
if options[:commit]
|
71
74
|
puppetfile.commit("bump #{puppet_module.name} to version #{latest_version}")
|
72
|
-
logger.info "Commited with message: bump #{puppet_module.name} to version #{latest_version}"
|
73
75
|
end
|
74
|
-
if
|
76
|
+
if remote_deploy?
|
75
77
|
puppetfile.push(control_repo_remote, puppetfile.current_branch)
|
76
78
|
logger.info "Just pushed branch: #{puppetfile.current_branch} to remote: #{control_repo_remote}"
|
77
79
|
end
|
@@ -1,19 +1,20 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'release_manager/errors'
|
3
3
|
require 'release_manager/workflow_action'
|
4
|
+
require 'release_manager/vcs_manager'
|
4
5
|
require 'release_manager/git/utilites'
|
5
6
|
require 'rugged'
|
6
7
|
|
7
|
-
|
8
8
|
class PuppetModule < WorkflowAction
|
9
9
|
attr_reader :name, :metadata_file, :path, :version, :upstream
|
10
10
|
attr_writer :version, :source
|
11
11
|
|
12
12
|
include ReleaseManager::Git::Utilities
|
13
13
|
include ReleaseManager::Logger
|
14
|
+
include ReleaseManager::VCSManager
|
14
15
|
|
15
16
|
def initialize(mod_path, upstream = nil)
|
16
|
-
raise ModNotFoundException if mod_path.nil?
|
17
|
+
raise ModNotFoundException.new("#{mod_path} is not a valid puppet module path") if mod_path.nil?
|
17
18
|
@path = mod_path
|
18
19
|
@upstream = upstream
|
19
20
|
@metadata_file = File.join(mod_path, 'metadata.json')
|
@@ -40,21 +41,23 @@ class PuppetModule < WorkflowAction
|
|
40
41
|
# @returns [Hash] the metadata object as a ruby hash
|
41
42
|
def metadata
|
42
43
|
unless @metadata
|
43
|
-
raise ModNotFoundException unless File.exists?(metadata_file)
|
44
|
+
raise ModNotFoundException.new("#{path} does not contain a metadata file") unless File.exists?(metadata_file)
|
44
45
|
@metadata ||= JSON.parse(File.read(metadata_file))
|
45
46
|
end
|
46
47
|
@metadata
|
47
48
|
end
|
48
49
|
|
50
|
+
def already_latest?
|
51
|
+
return false unless latest_tag
|
52
|
+
up2date?(latest_tag, src_branch)
|
53
|
+
end
|
54
|
+
|
49
55
|
def add_upstream_remote
|
50
|
-
|
51
|
-
`#{git_command} remote rm upstream`
|
52
|
-
end
|
53
|
-
`#{git_command} remote add upstream #{source}`
|
56
|
+
add_remote(source,'upstream',true )
|
54
57
|
end
|
55
58
|
|
56
59
|
def git_upstream_url
|
57
|
-
|
60
|
+
repo.remotes['upstream'].url if remote_exists?('upstream')
|
58
61
|
end
|
59
62
|
|
60
63
|
def git_upstream_set?
|
@@ -62,7 +65,7 @@ class PuppetModule < WorkflowAction
|
|
62
65
|
end
|
63
66
|
|
64
67
|
def tags
|
65
|
-
|
68
|
+
repo.tags.map{|v| pad_version_string(v.name)}
|
66
69
|
end
|
67
70
|
|
68
71
|
def source=(s)
|
@@ -82,7 +85,6 @@ class PuppetModule < WorkflowAction
|
|
82
85
|
end
|
83
86
|
|
84
87
|
def latest_tag
|
85
|
-
Gem::Version.new('0.0.12') >= Gem::Version.new('0.0.2')
|
86
88
|
v = tags.sort do |a,b|
|
87
89
|
Gem::Version.new(a.tr('v', '')) <=> Gem::Version.new(b.tr('v', ''))
|
88
90
|
end
|
@@ -103,10 +105,20 @@ class PuppetModule < WorkflowAction
|
|
103
105
|
metadata['version']
|
104
106
|
end
|
105
107
|
|
106
|
-
|
107
|
-
|
108
|
+
# @param remote [Boolean] - create the tag remotely using the remote VCS
|
109
|
+
# @param id [String] - the commit id to tag to
|
110
|
+
def tag_module(remote = false, id = nil)
|
111
|
+
id ||= repo.head.target_id
|
112
|
+
if remote
|
113
|
+
# TODO add release_notes as the last argument, currently nil
|
114
|
+
# where we get the latest from the changelog
|
115
|
+
create_tag(source, "v#{version}", id, "v#{version}", nil)
|
116
|
+
else
|
117
|
+
create_local_tag("v#{version}", id)
|
118
|
+
end
|
108
119
|
end
|
109
120
|
|
121
|
+
# Updates the version in memory
|
110
122
|
def bump_patch_version
|
111
123
|
return unless version
|
112
124
|
pieces = version.split('.')
|
@@ -115,6 +127,7 @@ class PuppetModule < WorkflowAction
|
|
115
127
|
metadata['version'] = pieces.join('.')
|
116
128
|
end
|
117
129
|
|
130
|
+
# Updates the version in memory
|
118
131
|
def bump_minor_version
|
119
132
|
return unless version
|
120
133
|
pieces = version.split('.')
|
@@ -124,6 +137,7 @@ class PuppetModule < WorkflowAction
|
|
124
137
|
metadata['version'] = pieces.join('.')
|
125
138
|
end
|
126
139
|
|
140
|
+
# Updates the version in memory
|
127
141
|
def bump_major_version
|
128
142
|
return unless version
|
129
143
|
pieces = version.split('.')
|
@@ -139,16 +153,7 @@ class PuppetModule < WorkflowAction
|
|
139
153
|
end
|
140
154
|
|
141
155
|
def r10k_module?
|
142
|
-
|
143
|
-
end
|
144
|
-
|
145
|
-
def branch_exists?(name)
|
146
|
-
`#{git_command} branch |grep '#{name}$'`
|
147
|
-
$?.success?
|
148
|
-
end
|
149
|
-
|
150
|
-
def git_command
|
151
|
-
@git_command ||= "git --work-tree=#{path} --git-dir=#{path}/.git"
|
156
|
+
mod_name =~ /r10k[-_]?control/i
|
152
157
|
end
|
153
158
|
|
154
159
|
def upstream
|
@@ -157,18 +162,11 @@ class PuppetModule < WorkflowAction
|
|
157
162
|
|
158
163
|
# ensures the dev branch has been created and is up to date
|
159
164
|
def create_dev_branch
|
160
|
-
|
161
|
-
|
162
|
-
#puts "#{git_command} checkout -b #{src_branch} upstream/#{src_branch}"
|
163
|
-
`#{git_command} checkout -b #{src_branch} upstream/#{src_branch}` unless branch_exists?(src_branch)
|
164
|
-
raise GitError unless $?.success?
|
165
|
+
fetch('upstream')
|
166
|
+
create_branch(src_branch, "upstream/#{src_branch}")
|
165
167
|
# ensure we have updated our local branch
|
166
|
-
|
167
|
-
|
168
|
-
raise GitError unless $?.success?
|
169
|
-
#puts "#{git_command} rebase upstream/#{src_branch}"
|
170
|
-
`#{git_command} rebase upstream/#{src_branch}`
|
171
|
-
raise GitError unless $?.success?
|
168
|
+
checkout_branch(src_branch)
|
169
|
+
rebase_branch(src_branch, src_branch, 'upstream')
|
172
170
|
end
|
173
171
|
|
174
172
|
# @returns [String] - the source branch to push to
|
@@ -183,17 +181,48 @@ class PuppetModule < WorkflowAction
|
|
183
181
|
end
|
184
182
|
|
185
183
|
# @return [String] the oid of the commit that was created
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
184
|
+
# @param remote [Boolean] if true creates the commit on the remote repo
|
185
|
+
def commit_metadata(remote = false)
|
186
|
+
message = "[ReleaseManager] - bump version to #{version}"
|
187
|
+
if remote
|
188
|
+
actions = [{
|
189
|
+
action: 'update',
|
190
|
+
file_path: metadata_file.split(repo.workdir).last,
|
191
|
+
content: JSON.pretty_generate(metadata)
|
192
|
+
}]
|
193
|
+
obj = vcs_create_commit(source, src_branch, message, actions)
|
194
|
+
obj.id if obj
|
195
|
+
else
|
196
|
+
to_metadata_file
|
197
|
+
add_file(metadata_file)
|
198
|
+
create_commit(message)
|
199
|
+
end
|
190
200
|
end
|
191
201
|
|
192
202
|
# @return [String] the oid of the commit that was created
|
193
|
-
def commit_metadata_source
|
194
|
-
|
195
|
-
|
196
|
-
|
203
|
+
def commit_metadata_source(remote = false)
|
204
|
+
message = "[ReleaseManager] - change source to #{source}"
|
205
|
+
if remote
|
206
|
+
actions = [{
|
207
|
+
action: 'update',
|
208
|
+
file_path: metadata_file.split(repo.workdir).last,
|
209
|
+
content: JSON.pretty_generate(metadata)
|
210
|
+
}]
|
211
|
+
obj = vcs_create_commit(source, src_branch, message, actions)
|
212
|
+
obj.id if obj
|
213
|
+
else
|
214
|
+
to_metadata_file
|
215
|
+
add_file(metadata_file)
|
216
|
+
create_commit(message)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def tag_exists?(tag, remote = false)
|
221
|
+
if remote
|
222
|
+
remote_tag_exists?(source, tag)
|
223
|
+
else
|
224
|
+
latest_tag == tag
|
225
|
+
end
|
197
226
|
end
|
198
227
|
|
199
228
|
def to_metadata_file
|
@@ -8,6 +8,12 @@ class Puppetfile
|
|
8
8
|
attr_accessor :modules, :puppetfile, :data, :base_path, :puppetmodule
|
9
9
|
BUMP_TYPES = %w{patch minor major}
|
10
10
|
|
11
|
+
include ReleaseManager::Git::Utilities
|
12
|
+
include ReleaseManager::Logger
|
13
|
+
include ReleaseManager::VCSManager
|
14
|
+
|
15
|
+
alias_method :path, :base_path
|
16
|
+
|
11
17
|
# @param [String] puppetfile - the path to the puppetfile
|
12
18
|
def initialize(puppetfile = 'Puppetfile')
|
13
19
|
@puppetfile = puppetfile
|
@@ -22,17 +28,21 @@ class Puppetfile
|
|
22
28
|
@base_path ||= File.dirname(puppetfile)
|
23
29
|
end
|
24
30
|
|
25
|
-
def
|
26
|
-
"
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
def commit(message, remote = false)
|
32
|
+
message = "[ReleaseManager] - #{message}"
|
33
|
+
if remote
|
34
|
+
actions = [{
|
35
|
+
action: 'update',
|
36
|
+
file_path: puppetfile.split(repo.workdir).last,
|
37
|
+
content: to_s
|
38
|
+
}]
|
39
|
+
obj = vcs_create_commit(source, 'master', message, actions)
|
40
|
+
obj.id if obj
|
41
|
+
else
|
42
|
+
write_to_file
|
43
|
+
add_file(puppetfile)
|
44
|
+
create_commit(message)
|
45
|
+
end
|
36
46
|
end
|
37
47
|
|
38
48
|
def add_module(name, metadata)
|
@@ -40,8 +50,8 @@ class Puppetfile
|
|
40
50
|
end
|
41
51
|
|
42
52
|
def push(remote, branch, force = false)
|
43
|
-
|
44
|
-
|
53
|
+
push_branch(remote, branch, force)
|
54
|
+
push_tags(remote)
|
45
55
|
end
|
46
56
|
|
47
57
|
def data
|