modulesync 0.10.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -19,3 +19,28 @@ Cucumber::Rake::Task.new do |t|
19
19
  end
20
20
 
21
21
  task :test => %i[clean spec cucumber rubocop]
22
+ task :default => %i[test]
23
+
24
+ begin
25
+ require 'github_changelog_generator/task'
26
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
27
+ config.header = "# Changelog\n\nAll notable changes to this project will be documented in this file."
28
+ config.exclude_labels = %w[duplicate question invalid wontfix wont-fix modulesync skip-changelog]
29
+ config.user = 'voxpupuli'
30
+ config.project = 'modulesync'
31
+ config.future_release = Gem::Specification.load("#{config.project}.gemspec").version
32
+ end
33
+
34
+ # Workaround for https://github.com/github-changelog-generator/github-changelog-generator/issues/715
35
+ require 'rbconfig'
36
+ if RbConfig::CONFIG['host_os'] =~ /linux/
37
+ task :changelog do
38
+ puts 'Fixing line endings...'
39
+ changelog_file = File.join(__dir__, 'CHANGELOG.md')
40
+ changelog_txt = File.read(changelog_file)
41
+ new_contents = changelog_txt.gsub(/\r\n/, "\n")
42
+ File.open(changelog_file, 'w') { |file| file.puts new_contents }
43
+ end
44
+ end
45
+ rescue LoadError
46
+ end
@@ -23,7 +23,7 @@ Given 'a remote module repository' do
23
23
  CONFIG
24
24
  end
25
25
 
26
- Given /a remote module repository with "(.+?)" as the default branch/ do |branch| # rubocop:disable Lint/AmbiguousRegexpLiteral
26
+ Given Regexp.new(/a remote module repository with "(.+?)" as the default branch/) do |branch|
27
27
  steps %(
28
28
  Given a directory named "sources"
29
29
  And I run `git clone --mirror https://github.com/maestrodev/puppet-test sources/puppet-test`
@@ -31,7 +31,7 @@ Feature: update
31
31
  Files added:
32
32
  test
33
33
  """
34
- Given I run `cat modules/puppet-test/test`
34
+ Given I run `cat modules/maestrodev/puppet-test/test`
35
35
  Then the output should contain "aruba"
36
36
 
37
37
  Scenario: Using skip_broken option and adding a new file to repo without write access
@@ -113,14 +113,14 @@ Feature: update
113
113
  Then the exit status should be 0
114
114
  And the output should match:
115
115
  """
116
- Warning: using './moduleroot//test' as template without '.erb' suffix
116
+ Warning: using './moduleroot/test' as template without '.erb' suffix
117
117
  """
118
118
  And the output should match:
119
119
  """
120
120
  Files added:
121
121
  test
122
122
  """
123
- Given I run `cat modules/puppet-test/test`
123
+ Given I run `cat modules/maestrodev/puppet-test/test`
124
124
  Then the output should contain "aruba"
125
125
 
126
126
  Scenario: Adding a new file using global values
@@ -153,7 +153,7 @@ Feature: update
153
153
  Files added:
154
154
  test
155
155
  """
156
- Given I run `cat modules/puppet-test/test`
156
+ Given I run `cat modules/maestrodev/puppet-test/test`
157
157
  Then the output should contain "aruba"
158
158
 
159
159
  Scenario: Adding a new file overriding global values
@@ -189,7 +189,7 @@ Feature: update
189
189
  Files added:
190
190
  test
191
191
  """
192
- Given I run `cat modules/puppet-test/test`
192
+ Given I run `cat modules/maestrodev/puppet-test/test`
193
193
  Then the output should contain "aruba"
194
194
 
195
195
  Scenario: Adding a new file ignoring global values
@@ -225,7 +225,7 @@ Feature: update
225
225
  Files added:
226
226
  test
227
227
  """
228
- Given I run `cat modules/puppet-test/test`
228
+ Given I run `cat modules/maestrodev/puppet-test/test`
229
229
  Then the output should contain "aruba"
230
230
 
231
231
  Scenario: Adding a file that ERB can't parse
@@ -342,7 +342,7 @@ Feature: update
342
342
  Files changed:
343
343
  +diff --git a/Gemfile b/Gemfile
344
344
  """
345
- Given I run `cat modules/puppet-test/Gemfile`
345
+ Given I run `cat modules/maestrodev/puppet-test/Gemfile`
346
346
  Then the output should contain:
347
347
  """
348
348
  source 'https://somehost.com'
@@ -405,7 +405,7 @@ Feature: update
405
405
  Not managing Gemfile in puppet-test
406
406
  """
407
407
  And the exit status should be 0
408
- Given I run `cat modules/puppet-test/Gemfile`
408
+ Given I run `cat modules/maestrodev/puppet-test/Gemfile`
409
409
  Then the output should contain:
410
410
  """
411
411
  source 'https://rubygems.org'
@@ -488,8 +488,8 @@ Feature: update
488
488
  """
489
489
  some spec_helper fud
490
490
  """
491
- And a directory named "modules/puppetlabs-apache/spec"
492
- And a file named "modules/puppetlabs-apache/spec/spec_helper.rb" with:
491
+ And a directory named "modules/puppetlabs/puppetlabs-apache/spec"
492
+ And a file named "modules/puppetlabs/puppetlabs-apache/spec/spec_helper.rb" with:
493
493
  """
494
494
  This is a fake spec_helper!
495
495
  """
@@ -499,7 +499,7 @@ Feature: update
499
499
  Not managing spec/spec_helper.rb in puppetlabs-apache
500
500
  """
501
501
  And the exit status should be 0
502
- Given I run `cat modules/puppetlabs-apache/spec/spec_helper.rb`
502
+ Given I run `cat modules/puppetlabs/puppetlabs-apache/spec/spec_helper.rb`
503
503
  Then the output should contain:
504
504
  """
505
505
  This is a fake spec_helper!
@@ -538,7 +538,7 @@ Feature: update
538
538
  Files added:
539
539
  spec/spec_helper.rb
540
540
  """
541
- Given I run `cat modules/puppet-test/spec/spec_helper.rb`
541
+ Given I run `cat modules/maestrodev/puppet-test/spec/spec_helper.rb`
542
542
  Then the output should contain:
543
543
  """
544
544
  require 'puppetlabs_spec_helper/module_helper'
@@ -577,7 +577,7 @@ Feature: update
577
577
  Given a file named "managed_modules.yml" with:
578
578
  """
579
579
  ---
580
- - puppet-test
580
+ - maestrodev/puppet-test
581
581
  """
582
582
  And a file named "modulesync.yml" with:
583
583
  """
@@ -597,8 +597,8 @@ Feature: update
597
597
  require '<%= required %>'
598
598
  <% end %>
599
599
  """
600
- Given I run `git init modules/puppet-test`
601
- Given a file named "modules/puppet-test/.git/config" with:
600
+ Given I run `git init modules/maestrodev/puppet-test`
601
+ Given a file named "modules/maestrodev/puppet-test/.git/config" with:
602
602
  """
603
603
  [core]
604
604
  repositoryformatversion = 0
@@ -667,7 +667,7 @@ Feature: update
667
667
  Files added:
668
668
  test
669
669
  """
670
- Given I run `cat modules/puppet-test/test`
670
+ Given I run `cat modules/maestrodev/puppet-test/test`
671
671
  Then the output should contain "aruba"
672
672
 
673
673
  Scenario: When specifying configurations in managed_modules.yml and using a filter
@@ -702,9 +702,9 @@ Feature: update
702
702
  Files added:
703
703
  test
704
704
  """
705
- Given I run `cat modules/puppet-test/test`
705
+ Given I run `cat modules/maestrodev/puppet-test/test`
706
706
  Then the output should contain "aruba"
707
- And a directory named "modules/puppet-blacksmith" should not exist
707
+ And a directory named "modules/maestrodev/puppet-blacksmith" should not exist
708
708
 
709
709
  Scenario: When specifying configurations in managed_modules.yml and using a negative filter
710
710
  Given a file named "managed_modules.yml" with:
@@ -738,15 +738,15 @@ Feature: update
738
738
  Files added:
739
739
  test
740
740
  """
741
- Given I run `cat modules/puppet-test/test`
741
+ Given I run `cat modules/maestrodev/puppet-test/test`
742
742
  Then the output should contain "aruba"
743
- And a directory named "modules/puppet-blacksmith" should not exist
743
+ And a directory named "modules/maestrodev/puppet-blacksmith" should not exist
744
744
 
745
745
  Scenario: Updating a module with a .sync.yml file
746
746
  Given a file named "managed_modules.yml" with:
747
747
  """
748
748
  ---
749
- - puppet-test
749
+ - maestrodev/puppet-test
750
750
  """
751
751
  And a file named "modulesync.yml" with:
752
752
  """
@@ -756,6 +756,9 @@ Feature: update
756
756
  And a file named "config_defaults.yml" with:
757
757
  """
758
758
  ---
759
+ :global:
760
+ global-default: some-default
761
+ global-to-overwrite: to-be-overwritten
759
762
  spec/spec_helper.rb:
760
763
  require:
761
764
  - puppetlabs_spec_helper/module_helper
@@ -766,8 +769,14 @@ Feature: update
766
769
  require '<%= required %>'
767
770
  <% end %>
768
771
  """
769
- Given I run `git init modules/puppet-test`
770
- Given a file named "modules/puppet-test/.git/config" with:
772
+ And a file named "moduleroot/global-test.md.erb" with:
773
+ """
774
+ <%= @configs['global-default'] %>
775
+ <%= @configs['global-to-overwrite'] %>
776
+ <%= @configs['module-default'] %>
777
+ """
778
+ Given I run `git init modules/maestrodev/puppet-test`
779
+ Given a file named "modules/maestrodev/puppet-test/.git/config" with:
771
780
  """
772
781
  [core]
773
782
  repositoryformatversion = 0
@@ -780,9 +789,12 @@ Feature: update
780
789
  url = https://github.com/maestrodev/puppet-test.git
781
790
  fetch = +refs/heads/*:refs/remotes/origin/*
782
791
  """
783
- Given a file named "modules/puppet-test/.sync.yml" with:
792
+ Given a file named "modules/maestrodev/puppet-test/.sync.yml" with:
784
793
  """
785
794
  ---
795
+ :global:
796
+ global-to-overwrite: it-is-overwritten
797
+ module-default: some-value
786
798
  spec/spec_helper.rb:
787
799
  unmanaged: true
788
800
  """
@@ -792,6 +804,13 @@ Feature: update
792
804
  """
793
805
  Not managing spec/spec_helper.rb in puppet-test
794
806
  """
807
+ Given I run `cat modules/maestrodev/puppet-test/global-test.md`
808
+ Then the output should match:
809
+ """
810
+ some-default
811
+ it-is-overwritten
812
+ some-value
813
+ """
795
814
 
796
815
  Scenario: Module with custom namespace
797
816
  Given a file named "managed_modules.yml" with:
@@ -824,9 +843,9 @@ Feature: update
824
843
  Files added:
825
844
  test
826
845
  """
827
- Given I run `cat modules/puppet-test/.git/config`
846
+ Given I run `cat modules/maestrodev/puppet-test/.git/config`
828
847
  Then the output should contain "url = https://github.com/maestrodev/puppet-test.git"
829
- Given I run `cat modules/puppet-lib-file_concat/.git/config`
848
+ Given I run `cat modules/electrical/puppet-lib-file_concat/.git/config`
830
849
  Then the output should contain "url = https://github.com/electrical/puppet-lib-file_concat.git"
831
850
 
832
851
  Scenario: Modifying an existing file with values exposed by the module
@@ -858,7 +877,7 @@ Feature: update
858
877
  Files changed:
859
878
  +diff --git a/README.md b/README.md
860
879
  """
861
- Given I run `cat modules/puppet-test/README.md`
880
+ Given I run `cat modules/maestrodev/puppet-test/README.md`
862
881
  Then the output should contain:
863
882
  """
864
883
  echo 'https://github.com/maestrodev'
@@ -886,6 +905,28 @@ Feature: update
886
905
  Then the output should not contain "error"
887
906
  Then the output should not contain "rejected"
888
907
 
908
+ Scenario: Creating a GitHub PR with an update
909
+ Given a mocked git configuration
910
+ And a remote module repository
911
+ And a directory named "moduleroot"
912
+ And I set the environment variables to:
913
+ | variable | value |
914
+ | GITHUB_TOKEN | foobar |
915
+ When I run `msync update --noop --branch managed_update --pr`
916
+ Then the output should contain "Would submit PR "
917
+ And the exit status should be 0
918
+
919
+ Scenario: Creating a GitLab MR with an update
920
+ Given a mocked git configuration
921
+ And a remote module repository
922
+ And a directory named "moduleroot"
923
+ And I set the environment variables to:
924
+ | variable | value |
925
+ | GITLAB_TOKEN | foobar |
926
+ When I run `msync update --noop --branch managed_update --pr`
927
+ Then the output should contain "Would submit MR "
928
+ And the exit status should be 0
929
+
889
930
  Scenario: Repository with a default branch other than master
890
931
  Given a mocked git configuration
891
932
  And a remote module repository with "develop" as the default branch
@@ -903,3 +944,36 @@ Feature: update
903
944
  When I run `msync update -m "Update Gemfile"`
904
945
  Then the exit status should be 0
905
946
  Then the output should contain "Using repository's default branch: develop"
947
+
948
+ Scenario: Adding a new file from a template using meta data
949
+ And a file named "config_defaults.yml" with:
950
+ """
951
+ ---
952
+ """
953
+ Given a file named "managed_modules.yml" with:
954
+ """
955
+ ---
956
+ - puppet-test
957
+ """
958
+ And a file named "modulesync.yml" with:
959
+ """
960
+ ---
961
+ namespace: maestrodev
962
+ git_base: https://github.com/
963
+ """
964
+ And a directory named "moduleroot"
965
+ And a file named "moduleroot/test.erb" with:
966
+ """
967
+ module: <%= @metadata[:module_name] %>
968
+ target: <%= @metadata[:target_file] %>
969
+ workdir: <%= @metadata[:workdir] %>
970
+ """
971
+ When I run `msync update --noop`
972
+ Then the exit status should be 0
973
+ Given I run `cat modules/maestrodev/puppet-test/test`
974
+ Then the output should contain:
975
+ """
976
+ module: puppet-test
977
+ target: modules/maestrodev/puppet-test/test
978
+ workdir: modules/maestrodev/puppet-test
979
+ """
@@ -1,5 +1,4 @@
1
1
  require 'fileutils'
2
- require 'octokit'
3
2
  require 'pathname'
4
3
  require 'modulesync/cli'
5
4
  require 'modulesync/constants'
@@ -10,13 +9,7 @@ require 'modulesync/settings'
10
9
  require 'modulesync/util'
11
10
  require 'monkey_patches'
12
11
 
13
- GITHUB_TOKEN = ENV.fetch('GITHUB_TOKEN', '')
14
-
15
- Octokit.configure do |c|
16
- c.api_endpoint = ENV.fetch('GITHUB_BASE_URL', 'https://api.github.com')
17
- end
18
-
19
- module ModuleSync
12
+ module ModuleSync # rubocop:disable Metrics/ModuleLength
20
13
  include Constants
21
14
 
22
15
  def self.config_defaults
@@ -29,31 +22,39 @@ module ModuleSync
29
22
  end
30
23
 
31
24
  def self.local_file(config_path, file)
32
- "#{config_path}/#{MODULE_FILES_DIR}/#{file}"
25
+ File.join(config_path, MODULE_FILES_DIR, file)
33
26
  end
34
27
 
35
- def self.module_file(project_root, puppet_module, file)
36
- "#{project_root}/#{puppet_module}/#{file}"
28
+ def self.module_file(project_root, namespace, puppet_module, *parts)
29
+ File.join(project_root, namespace, puppet_module, *parts)
37
30
  end
38
31
 
39
- def self.local_files(path)
40
- if File.exist?(path)
41
- # only select *.erb files, and strip the extension. This way all the code will only have to handle bare paths, except when reading the actual ERB text
42
- local_files = Find.find(path).find_all { |p| p =~ /.erb$/ && !File.directory?(p) }.collect { |p| p.chomp('.erb') }.to_a
32
+ # List all template files.
33
+ #
34
+ # Only select *.erb files, and strip the extension. This way all the code will only have to handle bare paths,
35
+ # except when reading the actual ERB text
36
+ def self.find_template_files(local_template_dir)
37
+ if File.exist?(local_template_dir)
38
+ Find.find(local_template_dir).find_all { |p| p =~ /.erb$/ && !File.directory?(p) }
39
+ .collect { |p| p.chomp('.erb') }
40
+ .to_a
43
41
  else
44
- puts "#{path} does not exist. Check that you are working in your module configs directory or that you have passed in the correct directory with -c."
42
+ $stdout.puts "#{local_template_dir} does not exist." \
43
+ ' Check that you are working in your module configs directory or' \
44
+ ' that you have passed in the correct directory with -c.'
45
45
  exit
46
46
  end
47
47
  end
48
48
 
49
- def self.module_files(local_files, path)
50
- local_files.map { |file| file.sub(/#{path}/, '') }
49
+ def self.relative_names(file_list, path)
50
+ file_list.map { |file| file.sub(/#{path}/, '') }
51
51
  end
52
52
 
53
53
  def self.managed_modules(config_file, filter, negative_filter)
54
54
  managed_modules = Util.parse_config(config_file)
55
55
  if managed_modules.empty?
56
- puts "No modules found in #{config_file}. Check that you specified the right :configs directory and :managed_modules_conf file."
56
+ $stdout.puts "No modules found in #{config_file}." \
57
+ ' Check that you specified the right :configs directory and :managed_modules_conf file.'
57
58
  exit
58
59
  end
59
60
  managed_modules.select! { |m| m =~ Regexp.new(filter) } unless filter.nil?
@@ -78,100 +79,144 @@ module ModuleSync
78
79
  end
79
80
 
80
81
  def self.manage_file(filename, settings, options)
82
+ namespace = settings.additional_settings[:namespace]
81
83
  module_name = settings.additional_settings[:puppet_module]
82
84
  configs = settings.build_file_configs(filename)
85
+ target_file = module_file(options[:project_root], namespace, module_name, filename)
83
86
  if configs['delete']
84
- Renderer.remove(module_file(options[:project_root], module_name, filename))
87
+ Renderer.remove(target_file)
85
88
  else
86
89
  templatename = local_file(options[:configs], filename)
87
90
  begin
88
91
  erb = Renderer.build(templatename)
89
- template = Renderer.render(erb, configs)
90
- Renderer.sync(template, module_file(options[:project_root], module_name, filename))
92
+ # Meta data passed to the template as @metadata[:name]
93
+ metadata = {
94
+ :module_name => module_name,
95
+ :workdir => module_file(options[:project_root], namespace, module_name),
96
+ :target_file => target_file,
97
+ }
98
+ template = Renderer.render(erb, configs, metadata)
99
+ Renderer.sync(template, target_file)
91
100
  rescue # rubocop:disable Lint/RescueWithoutErrorClass
92
- STDERR.puts "Error while rendering #{filename}"
101
+ $stderr.puts "Error while rendering #{filename}"
93
102
  raise
94
103
  end
95
104
  end
96
105
  end
97
106
 
98
107
  def self.manage_module(puppet_module, module_files, module_options, defaults, options)
99
- if options[:pr] && !GITHUB_TOKEN
100
- STDERR.puts 'Environment variable GITHUB_TOKEN must be set to use --pr!'
101
- raise unless options[:skip_broken]
108
+ default_namespace = options[:namespace]
109
+ if module_options.is_a?(Hash) && module_options.key?(:namespace)
110
+ default_namespace = module_options[:namespace]
102
111
  end
103
-
104
- puts "Syncing #{puppet_module}"
105
- namespace, module_name = module_name(puppet_module, options[:namespace])
112
+ namespace, module_name = module_name(puppet_module, default_namespace)
113
+ git_repo = File.join(namespace, module_name)
106
114
  unless options[:offline]
107
- git_base = options[:git_base]
108
- git_uri = "#{git_base}#{namespace}"
109
- Git.pull(git_uri, module_name, options[:branch], options[:project_root], module_options || {})
115
+ Git.pull(options[:git_base], git_repo, options[:branch], options[:project_root], module_options || {})
110
116
  end
111
- module_configs = Util.parse_config("#{options[:project_root]}/#{module_name}/#{MODULE_CONF_FILE}")
117
+
118
+ module_configs = Util.parse_config(module_file(options[:project_root], namespace, module_name, MODULE_CONF_FILE))
112
119
  settings = Settings.new(defaults[GLOBAL_DEFAULTS_KEY] || {},
113
120
  defaults,
114
121
  module_configs[GLOBAL_DEFAULTS_KEY] || {},
115
122
  module_configs,
116
123
  :puppet_module => module_name,
117
- :git_base => git_base,
124
+ :git_base => options[:git_base],
118
125
  :namespace => namespace)
119
126
  settings.unmanaged_files(module_files).each do |filename|
120
- puts "Not managing #{filename} in #{module_name}"
127
+ $stdout.puts "Not managing #{filename} in #{module_name}"
121
128
  end
122
129
 
123
130
  files_to_manage = settings.managed_files(module_files)
124
131
  files_to_manage.each { |filename| manage_file(filename, settings, options) }
125
132
 
126
133
  if options[:noop]
127
- Git.update_noop(module_name, options)
134
+ Git.update_noop(git_repo, options)
135
+ options[:pr] && pr(module_options).manage(namespace, module_name, options)
128
136
  elsif !options[:offline]
129
- # Git.update() returns a boolean: true if files were pushed, false if not.
130
- pushed = Git.update(module_name, files_to_manage, options)
131
- return nil unless pushed && options[:pr]
132
-
133
- # We only do GitHub PR work if the GITHUB_TOKEN variable is set in the environment.
134
- repo_path = "#{namespace}/#{module_name}"
135
- puts "Submitting PR '#{options[:pr_title]}' on GitHub to #{repo_path} - merges #{options[:branch]} into master"
136
- github = Octokit::Client.new(:access_token => GITHUB_TOKEN)
137
- pr = github.create_pull_request(repo_path, 'master', options[:branch], options[:pr_title], options[:message])
138
- puts "PR created at #{pr['html_url']}"
139
-
140
- # PR labels can either be a list in the YAML file or they can pass in a comma
141
- # separated list via the command line argument.
142
- pr_labels = Util.parse_list(options[:pr_labels])
143
-
144
- # We only assign labels to the PR if we've discovered a list > 1. The labels MUST
145
- # already exist. We DO NOT create missing labels.
146
- unless pr_labels.empty?
147
- puts "Attaching the following labels to PR #{pr['number']}: #{pr_labels.join(', ')}"
148
- github.add_labels_to_an_issue(repo_path, pr['number'], pr_labels)
149
- end
137
+ pushed = Git.update(git_repo, files_to_manage, options)
138
+ pushed && options[:pr] && pr(module_options).manage(namespace, module_name, options)
150
139
  end
151
140
  end
152
141
 
142
+ def self.config_path(file, options)
143
+ return file if Pathname.new(file).absolute?
144
+ File.join(options[:configs], file)
145
+ end
146
+
147
+ def config_path(file, options)
148
+ self.class.config_path(file, options)
149
+ end
150
+
153
151
  def self.update(options)
154
152
  options = config_defaults.merge(options)
155
- defaults = Util.parse_config("#{options[:configs]}/#{CONF_FILE}")
153
+ defaults = Util.parse_config(config_path(CONF_FILE, options))
154
+ if options[:pr]
155
+ unless options[:branch]
156
+ $stderr.puts 'A branch must be specified with --branch to use --pr!'
157
+ raise
158
+ end
156
159
 
157
- path = "#{options[:configs]}/#{MODULE_FILES_DIR}"
158
- local_files = self.local_files(path)
159
- module_files = self.module_files(local_files, path)
160
+ @pr = create_pr_manager if options[:pr]
161
+ end
162
+
163
+ local_template_dir = config_path(MODULE_FILES_DIR, options)
164
+ local_files = find_template_files(local_template_dir)
165
+ module_files = relative_names(local_files, local_template_dir)
160
166
 
161
- managed_modules = self.managed_modules("#{options[:configs]}/#{options[:managed_modules_conf]}", options[:filter], options[:negative_filter])
167
+ managed_modules = self.managed_modules(config_path(options[:managed_modules_conf], options),
168
+ options[:filter],
169
+ options[:negative_filter])
162
170
 
163
171
  errors = false
164
172
  # managed_modules is either an array or a hash
165
173
  managed_modules.each do |puppet_module, module_options|
166
174
  begin
167
- manage_module(puppet_module, module_files, module_options, defaults, options)
175
+ mod_options = module_options.nil? ? nil : Util.symbolize_keys(module_options)
176
+ manage_module(puppet_module, module_files, mod_options, defaults, options)
168
177
  rescue # rubocop:disable Lint/RescueWithoutErrorClass
169
- STDERR.puts "Error while updating #{puppet_module}"
178
+ $stderr.puts "Error while updating #{puppet_module}"
170
179
  raise unless options[:skip_broken]
171
180
  errors = true
172
- puts "Skipping #{puppet_module} as update process failed"
181
+ $stdout.puts "Skipping #{puppet_module} as update process failed"
173
182
  end
174
183
  end
175
184
  exit 1 if errors && options[:fail_on_warnings]
176
185
  end
186
+
187
+ def self.pr(module_options)
188
+ module_options ||= {}
189
+ github_conf = module_options[:github]
190
+ gitlab_conf = module_options[:gitlab]
191
+
192
+ if !github_conf.nil?
193
+ base_url = github_conf[:base_url] || ENV.fetch('GITHUB_BASE_URL', 'https://api.github.com')
194
+ require 'modulesync/pr/github'
195
+ ModuleSync::PR::GitHub.new(github_conf[:token], base_url)
196
+ elsif !gitlab_conf.nil?
197
+ base_url = gitlab_conf[:base_url] || ENV.fetch('GITLAB_BASE_URL', 'https://gitlab.com/api/v4')
198
+ require 'modulesync/pr/gitlab'
199
+ ModuleSync::PR::GitLab.new(gitlab_conf[:token], base_url)
200
+ elsif @pr.nil?
201
+ $stderr.puts 'No GitHub or GitLab token specified for --pr!'
202
+ raise
203
+ else
204
+ @pr
205
+ end
206
+ end
207
+
208
+ def self.create_pr_manager
209
+ github_token = ENV.fetch('GITHUB_TOKEN', '')
210
+ gitlab_token = ENV.fetch('GITLAB_TOKEN', '')
211
+
212
+ if !github_token.empty?
213
+ require 'modulesync/pr/github'
214
+ ModuleSync::PR::GitHub.new(github_token, ENV.fetch('GITHUB_BASE_URL', 'https://api.github.com'))
215
+ elsif !gitlab_token.empty?
216
+ require 'modulesync/pr/gitlab'
217
+ ModuleSync::PR::GitLab.new(gitlab_token, ENV.fetch('GITLAB_BASE_URL', 'https://gitlab.com/api/v4'))
218
+ else
219
+ warn '--pr specified without environment variables GITHUB_TOKEN or GITLAB_TOKEN'
220
+ end
221
+ end
177
222
  end