modulesync 0.8.2 → 0.9.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9799ba2b483f6370a71e6787b21862cf6aeab0246f1b7896be48175c37564db3
4
- data.tar.gz: fccd8279e58613ac070d05175bce1a9b0f4afc292ffac78c347f343518434bc3
3
+ metadata.gz: aba3647204bfcc8853cafeddbf1e4f1083ceaade7fb1806bd06b36e37d6d593e
4
+ data.tar.gz: ce4305980ed768ffd80580c4618c7d921e0c7c6e17b57edc3dae0c10eacbeef6
5
5
  SHA512:
6
- metadata.gz: f4f4e927a0d4df8a95859c23319cb395f3418ecd0fa4dadc5c9a68209dcc767bc821b71dd2206fa4b6c482a65464940803a2958849cd1a991276342490356351
7
- data.tar.gz: c5cee9698af0bea865f69f5bed772db3a881e339e7a6626c6be70968c02568de8a5899c3dcebc3cfc3620f66fe51a65fa1b6887f2d929ac56bdf66a5dab59a82
6
+ metadata.gz: 0cfda65f2a020913fa4cd928e22daac9e5c141f7881afaed928b28af846fe86466fff64314e89b04b9d3cb32bf8e4387ec0410e7142215ac5e0412b15c845d62
7
+ data.tar.gz: 083fdbb949ce978be0958f3ac2baa8390d38d7221c846b934b5b2e3e49cc60992d662b0afd8322d4efeb3bbec9643faf73b7cba95ba3f91d388953365837494a
@@ -3,9 +3,6 @@ sudo: false
3
3
  language: ruby
4
4
  cache: bundler
5
5
  dist: trusty
6
- before_install:
7
- - gem update --system
8
- - gem install bundler
9
6
  script: 'bundle exec rake test'
10
7
  rvm:
11
8
  - 2.0
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 2018-02-15
4
+
5
+ ## Summary
6
+
7
+ This is an awesome release - Now honors the repo default branch[#142](https://github.com/voxpupuli/modulesync/pull/142)
8
+
9
+ ### Bugfixes
10
+
11
+ * Monkey patch ls_files until ruby-git/ruby-git#320 is resolved
12
+ * Reraise exception rather than exit so we can rescue a derived StandardError when using skip_broken option
13
+
14
+ ### Enhancements
15
+
16
+ * Add new option to produce a failure exit code on warnings
17
+ * Remove hard coding of managed_modules.yml which means that options passed to ModuleSync.update can override the filename
18
+
3
19
  ## 2017-11-03 - 0.8.2
4
20
 
5
21
  ### Summary
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
1
  source ENV['GEM_SOURCE'] || 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ gem 'cucumber', '< 3.0' if RUBY_VERSION < '2.1'
@@ -22,3 +22,26 @@ Given 'a remote module repository' do
22
22
  git_base: file://#{expand_path('.')}/
23
23
  CONFIG
24
24
  end
25
+
26
+ Given /a remote module repository with "(.+?)" as the default branch/ do |branch| # rubocop:disable Lint/AmbiguousRegexpLiteral
27
+ steps %(
28
+ Given a directory named "sources"
29
+ And I run `git clone --mirror https://github.com/maestrodev/puppet-test sources/puppet-test`
30
+ And a file named "managed_modules.yml" with:
31
+ """
32
+ ---
33
+ - puppet-test
34
+ """
35
+ )
36
+ write_file('modulesync.yml', <<-CONFIG)
37
+ ---
38
+ namespace: sources
39
+ git_base: file://#{expand_path('.')}/
40
+ CONFIG
41
+ cd('sources/puppet-test') do
42
+ steps %(
43
+ And I run `git branch -M master #{branch}`
44
+ And I run `git symbolic-ref HEAD refs/heads/#{branch}`
45
+ )
46
+ end
47
+ end
@@ -34,6 +34,32 @@ Feature: update
34
34
  Given I run `cat modules/puppet-test/test`
35
35
  Then the output should contain "aruba"
36
36
 
37
+ Scenario: Using skip_broken option and adding a new file to repo without write access
38
+ Given a file named "managed_modules.yml" with:
39
+ """
40
+ ---
41
+ - puppet-test
42
+ """
43
+ And a file named "modulesync.yml" with:
44
+ """
45
+ ---
46
+ namespace: maestrodev
47
+ git_base: 'git@github.com:'
48
+ """
49
+ And a file named "config_defaults.yml" with:
50
+ """
51
+ ---
52
+ test:
53
+ name: aruba
54
+ """
55
+ And a directory named "moduleroot"
56
+ And a file named "moduleroot/test.erb" with:
57
+ """
58
+ <%= @configs['name'] %>
59
+ """
60
+ When I run `msync update -s -m "Add test"`
61
+ Then the exit status should be 0
62
+
37
63
  Scenario: Adding a new file to repo without write access
38
64
  Given a file named "managed_modules.yml" with:
39
65
  """
@@ -44,7 +70,7 @@ Feature: update
44
70
  """
45
71
  ---
46
72
  namespace: maestrodev
47
- git_base: git@github.com:
73
+ git_base: 'git@github.com:'
48
74
  """
49
75
  And a file named "config_defaults.yml" with:
50
76
  """
@@ -258,6 +284,34 @@ Feature: update
258
284
  When I run `msync update --noop -s`
259
285
  Then the exit status should be 0
260
286
 
287
+ Scenario: Using skip_broken and fail_on_warnings options with invalid files
288
+ Given a file named "managed_modules.yml" with:
289
+ """
290
+ ---
291
+ - puppet-test
292
+ """
293
+ And a file named "modulesync.yml" with:
294
+ """
295
+ ---
296
+ namespace: maestrodev
297
+ git_base: https://github.com/
298
+ """
299
+ And a file named "config_defaults.yml" with:
300
+ """
301
+ ---
302
+ test:
303
+ name: aruba
304
+ """
305
+ And a directory named "moduleroot"
306
+ And a file named "moduleroot/test.erb" with:
307
+ """
308
+ <% @configs.each do |c| -%>
309
+ <%= c['name'] %>
310
+ <% end %>
311
+ """
312
+ When I run `msync update --noop --skip_broken --fail_on_warnings`
313
+ Then the exit status should be 1
314
+
261
315
  Scenario: Modifying an existing file
262
316
  Given a file named "managed_modules.yml" with:
263
317
  """
@@ -831,3 +885,21 @@ Feature: update
831
885
  Then the exit status should be 0
832
886
  Then the output should not contain "error"
833
887
  Then the output should not contain "rejected"
888
+
889
+ Scenario: Repository with a default branch other than master
890
+ Given a mocked git configuration
891
+ And a remote module repository with "develop" as the default branch
892
+ And a file named "config_defaults.yml" with:
893
+ """
894
+ ---
895
+ Gemfile:
896
+ gem_source: https://somehost.com
897
+ """
898
+ And a directory named "moduleroot"
899
+ And a file named "moduleroot/Gemfile.erb" with:
900
+ """
901
+ source '<%= @configs['gem_source'] %>'
902
+ """
903
+ When I run `msync update -m "Update Gemfile"`
904
+ Then the exit status should be 0
905
+ Then the output should contain "Using repository's default branch: develop"
@@ -43,10 +43,10 @@ module ModuleSync
43
43
  local_files.map { |file| file.sub(/#{path}/, '') }
44
44
  end
45
45
 
46
- def self.managed_modules(path, filter, negative_filter)
47
- managed_modules = Util.parse_config(path)
46
+ def self.managed_modules(config_file, filter, negative_filter)
47
+ managed_modules = Util.parse_config(config_file)
48
48
  if managed_modules.empty?
49
- puts "No modules found at #{path}. Check that you specified the right configs directory containing managed_modules.yml."
49
+ puts "No modules found in #{config_file}. Check that you specified the right :configs directory and :managed_modules_conf file."
50
50
  exit
51
51
  end
52
52
  managed_modules.select! { |m| m =~ Regexp.new(filter) } unless filter.nil?
@@ -126,8 +126,9 @@ module ModuleSync
126
126
  local_files = self.local_files(path)
127
127
  module_files = self.module_files(local_files, path)
128
128
 
129
- managed_modules = self.managed_modules("#{options[:configs]}/managed_modules.yml", options[:filter], options[:negative_filter])
129
+ managed_modules = self.managed_modules("#{options[:configs]}/#{options[:managed_modules_conf]}", options[:filter], options[:negative_filter])
130
130
 
131
+ errors = false
131
132
  # managed_modules is either an array or a hash
132
133
  managed_modules.each do |puppet_module, module_options|
133
134
  begin
@@ -135,8 +136,10 @@ module ModuleSync
135
136
  rescue # rubocop:disable Lint/RescueWithoutErrorClass
136
137
  STDERR.puts "Error while updating #{puppet_module}"
137
138
  raise unless options[:skip_broken]
139
+ errors = true
138
140
  puts "Skipping #{puppet_module} as update process failed"
139
141
  end
140
142
  end
143
+ exit 1 if errors && options[:fail_on_warnings]
141
144
  end
142
145
  end
@@ -53,8 +53,8 @@ module ModuleSync
53
53
  :desc => 'A regular expression to skip repositories.'
54
54
  class_option :branch,
55
55
  :aliases => '-b',
56
- :desc => 'Branch name to make the changes in. Defaults to master.',
57
- :default => CLI.defaults[:branch] || 'master'
56
+ :desc => 'Branch name to make the changes in. Defaults to the default branch of the upstream repository, but falls back to "master".',
57
+ :default => CLI.defaults[:branch]
58
58
 
59
59
  desc 'update', 'Update the modules in managed_modules.yml'
60
60
  option :message,
@@ -106,6 +106,11 @@ module ModuleSync
106
106
  option :pre_commit_script,
107
107
  :desc => 'A script to be run before commiting',
108
108
  :default => CLI.defaults[:pre_commit_script]
109
+ option :fail_on_warnings,
110
+ :type => :boolean,
111
+ :aliases => '-F',
112
+ :desc => 'Produce a failure exit code when there are warnings (only has effect when --skip_broken is enabled)',
113
+ :default => false
109
114
 
110
115
  def update
111
116
  config = { :command => 'update' }.merge(options)
@@ -2,7 +2,7 @@ require 'git'
2
2
  require 'puppet_blacksmith'
3
3
 
4
4
  module ModuleSync
5
- module Git
5
+ module Git # rubocop:disable Metrics/ModuleLength
6
6
  include Constants
7
7
 
8
8
  def self.remote_branch_exists?(repo, branch)
@@ -18,7 +18,17 @@ module ModuleSync
18
18
  repo.diff("#{local_branch}..origin/#{remote_branch}").any?
19
19
  end
20
20
 
21
+ def self.default_branch(repo)
22
+ symbolic_ref = repo.branches.find { |b| b.full =~ %r{remotes/origin/HEAD} }
23
+ return unless symbolic_ref
24
+ %r{remotes/origin/HEAD\s+->\s+origin/(?<branch>.+?)$}.match(symbolic_ref.full)[:branch]
25
+ end
26
+
21
27
  def self.switch_branch(repo, branch)
28
+ unless branch
29
+ branch = default_branch(repo)
30
+ puts "Using repository's default branch: #{branch}"
31
+ end
22
32
  return if repo.current_branch == branch
23
33
 
24
34
  if local_branch_exists?(repo, branch)
@@ -95,12 +105,19 @@ module ModuleSync
95
105
  repo.push('origin', tag)
96
106
  end
97
107
 
108
+ def self.checkout_branch(repo, branch)
109
+ selected_branch = branch || repo.current_branch || 'master'
110
+ repo.branch(selected_branch).checkout
111
+ selected_branch
112
+ end
113
+ private_class_method :checkout_branch
114
+
98
115
  # Git add/rm, git commit, git push
99
116
  def self.update(name, files, options)
100
117
  module_root = "#{options[:project_root]}/#{name}"
101
118
  message = options[:message]
102
119
  repo = ::Git.open(module_root)
103
- repo.branch(options[:branch]).checkout
120
+ branch = checkout_branch(repo, options[:branch])
104
121
  files.each do |file|
105
122
  if repo.status.deleted.include?(file)
106
123
  repo.remove(file)
@@ -119,11 +136,11 @@ module ModuleSync
119
136
  end
120
137
  repo.commit(message, opts_commit)
121
138
  if options[:remote_branch]
122
- if remote_branch_differ?(repo, options[:branch], options[:remote_branch])
123
- repo.push('origin', "#{options[:branch]}:#{options[:remote_branch]}", opts_push)
139
+ if remote_branch_differ?(repo, branch, options[:remote_branch])
140
+ repo.push('origin', "#{branch}:#{options[:remote_branch]}", opts_push)
124
141
  end
125
142
  else
126
- repo.push('origin', options[:branch], opts_push)
143
+ repo.push('origin', branch, opts_push)
127
144
  end
128
145
  # Only bump/tag if pushing didn't fail (i.e. there were changes)
129
146
  m = Blacksmith::Modulefile.new("#{module_root}/metadata.json")
@@ -136,7 +153,7 @@ module ModuleSync
136
153
  puts "There were no files to update in #{name}. Not committing."
137
154
  else
138
155
  puts git_error
139
- exit(1)
156
+ raise
140
157
  end
141
158
  end
142
159
  end
@@ -154,7 +171,7 @@ module ModuleSync
154
171
  puts "Using no-op. Files in #{name} may be changed but will not be committed."
155
172
 
156
173
  repo = ::Git.open("#{options[:project_root]}/#{name}")
157
- repo.branch(options[:branch]).checkout
174
+ checkout_branch(repo, options[:branch])
158
175
 
159
176
  puts 'Files changed:'
160
177
  repo.diff('HEAD', '--').each do |diff|
@@ -37,4 +37,19 @@ module Git
37
37
  final.map { |e| [e[0], DiffFile.new(@base, e[1])] }
38
38
  end
39
39
  end
40
+
41
+ class Lib
42
+ # Monkey patch ls_files until https://github.com/ruby-git/ruby-git/pull/320 is resolved
43
+ def ls_files(location=nil)
44
+ location ||= '.'
45
+ hsh = {}
46
+ command_lines('ls-files', ['--stage', location]).each do |line|
47
+ (info, file) = line.split("\t")
48
+ (mode, sha, stage) = info.split
49
+ file = eval(file) if file =~ /^\".*\"$/ # This takes care of quoted strings returned from git
50
+ hsh[file] = {:path => file, :mode_index => mode, :sha_index => sha, :stage => stage}
51
+ end
52
+ hsh
53
+ end
54
+ end
40
55
  end
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = 'modulesync'
6
- spec.version = '0.8.2'
6
+ spec.version = '0.9.0'
7
7
  spec.authors = ['Vox Pupuli']
8
8
  spec.email = ['voxpupuli@groups.io']
9
9
  spec.summary = 'Puppet Module Synchronizer'
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe ModuleSync do
4
+ context '::update' do
5
+ it 'loads the managed modules from the specified :managed_modules_conf' do
6
+ allow(ModuleSync).to receive(:local_files).and_return([])
7
+ allow(ModuleSync::Util).to receive(:parse_config).with('./config_defaults.yml').and_return({})
8
+ expect(ModuleSync).to receive(:managed_modules).with('./test_file.yml', nil, nil).and_return([])
9
+
10
+ options = { managed_modules_conf: 'test_file.yml' }
11
+ ModuleSync.update(options)
12
+ end
13
+ end
14
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modulesync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vox Pupuli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-08 00:00:00.000000000 Z
11
+ date: 2018-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aruba
@@ -159,6 +159,7 @@ files:
159
159
  - modulesync.gemspec
160
160
  - spec/spec_helper.rb
161
161
  - spec/unit/modulesync/settings_spec.rb
162
+ - spec/unit/modulesync_spec.rb
162
163
  homepage: http://github.com/voxpupuli/modulesync
163
164
  licenses:
164
165
  - Apache-2.0
@@ -179,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
180
  version: '0'
180
181
  requirements: []
181
182
  rubyforge_project:
182
- rubygems_version: 2.7.2
183
+ rubygems_version: 2.7.6
183
184
  signing_key:
184
185
  specification_version: 4
185
186
  summary: Puppet Module Synchronizer
@@ -191,3 +192,4 @@ test_files:
191
192
  - features/update.feature
192
193
  - spec/spec_helper.rb
193
194
  - spec/unit/modulesync/settings_spec.rb
195
+ - spec/unit/modulesync_spec.rb