modulesync 0.9.0 → 0.10.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: aba3647204bfcc8853cafeddbf1e4f1083ceaade7fb1806bd06b36e37d6d593e
4
- data.tar.gz: ce4305980ed768ffd80580c4618c7d921e0c7c6e17b57edc3dae0c10eacbeef6
3
+ metadata.gz: cf47637269ebb272e17ffe11db44344aff0677e8a93fec636d7fcf6ed4d66e01
4
+ data.tar.gz: c2496e33b76a8af894707b6615662f05bcdb4ff73378020238a633b88915f433
5
5
  SHA512:
6
- metadata.gz: 0cfda65f2a020913fa4cd928e22daac9e5c141f7881afaed928b28af846fe86466fff64314e89b04b9d3cb32bf8e4387ec0410e7142215ac5e0412b15c845d62
7
- data.tar.gz: 083fdbb949ce978be0958f3ac2baa8390d38d7221c846b934b5b2e3e49cc60992d662b0afd8322d4efeb3bbec9643faf73b7cba95ba3f91d388953365837494a
6
+ metadata.gz: b9bc5072c017bff505be1f43e4e0bc2630645d0acee00bbb0a8a2d5b23804e4150414c904126570a5418e310ae873073ce207f91887e8f849db5f9cdc61fd680
7
+ data.tar.gz: 45588886c292dd533923614af9ea94d74685743a7b7708b3caeb4cbfbfe0539adafa2f78a8183d0d2384a4cd9d8f0c03535935b99c8278031f487317d36370e3
data/CHANGELOG.md CHANGED
@@ -1,6 +1,13 @@
1
1
  # Changelog
2
2
 
3
- ## 2018-02-15
3
+ ## 2018-12-27 - 0.10.0
4
+
5
+ This is another awesome release!
6
+
7
+ * Add support to submit PRs to GitHub when changes are pushed - [#147](https://github.com/voxpupuli/modulesync/pull/147)
8
+ * Fix "flat files" still mentioned in README - [#151](https://github.com/voxpupuli/modulesync/pull/151)
9
+
10
+ ## 2018-02-15 - 0.9.0
4
11
 
5
12
  ## Summary
6
13
 
data/Gemfile CHANGED
@@ -3,3 +3,4 @@ source ENV['GEM_SOURCE'] || 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  gem 'cucumber', '< 3.0' if RUBY_VERSION < '2.1'
6
+ gem 'octokit', '~> 4.0'
data/README.md CHANGED
@@ -176,6 +176,28 @@ touching the modules, you can deactivate the hook.
176
176
  msync hook deactivate
177
177
  ```
178
178
 
179
+ #### Submitting PRs to GitHub
180
+
181
+ You can have modulesync submit Pull Requests on GitHub automatically with the
182
+ `--pr` CLI option.
183
+
184
+ ```
185
+ msync update --pr
186
+ ```
187
+
188
+ You must set `GITHUB_TOKEN` in your environment for this to work. Other options
189
+ include:
190
+
191
+ * Set the PR title with `--pr-title` or in `modulesync.yml` with the `pr_title`
192
+ attribute.
193
+ * Assign labels to the PR with `--pr-labels` or in `modulesync.yml` with the
194
+ `pr_labels` attribute. **NOTE:** `pr_labels` should be a list. When using
195
+ the `--pr-labels` CLI option, you should use a comma separated list.
196
+
197
+ You can optionally set the `GITHUB_BASE_URL` environment variable to use GitHub
198
+ Enterprise. This is passed to Octokit's [`api_endpoint`](https://github.com/octokit/octokit.rb#interacting-with-the-githubcom-apis-in-github-enterprise)
199
+ configuration option.
200
+
179
201
  ### Using Forks and Non-master branches
180
202
 
181
203
  The default functionality is to run ModuleSync on the puppetlabs modules, but
@@ -215,7 +237,7 @@ probably seems excessive. You can create a file called modulesync.yml in the
215
237
  configuration directory that provides these arguments automatically. This file
216
238
  has a form such as:
217
239
 
218
- ```
240
+ ```yaml
219
241
  ---
220
242
  namespace: mygithubusername
221
243
  branch: modulesyncbranch
@@ -230,26 +252,33 @@ msync update -m "Commit message"
230
252
 
231
253
  Available parameters for modulesync.yml
232
254
 
233
- * git_base : The default URL to git clone from (Default: 'git@github.com:')
234
- * namespace : Namespace of the projects to manage (Default: 'puppetlabs')
235
- * branch : Branch to push to (Default: 'master')
236
- * remote_branch : Remote branch to push to (Default: Same value as branch)
237
- * message : Commit message to apply to updated modules.
238
- * pre_commit_script : A script to be run before commiting (e.g. 'contrib/myfooscript.sh')
255
+ * `git_base` : The default URL to git clone from (Default: 'git@github.com:')
256
+ * `namespace` : Namespace of the projects to manage (Default: 'puppetlabs')
257
+ * `branch` : Branch to push to (Default: 'master')
258
+ * `remote_branch` : Remote branch to push to (Default: Same value as branch)
259
+ * `message` : Commit message to apply to updated modules.
260
+ * `pre_commit_script` : A script to be run before commiting (e.g. 'contrib/myfooscript.sh')
261
+ * `pr_title` : The title to use when submitting PRs to GitHub.
262
+ * `pr_labels` : A list of labels to assign PRs created on GitHub.
239
263
 
240
264
  ##### Example
241
265
 
242
- ###### Github
266
+ ###### GitHub
243
267
 
244
- ```
268
+ ```yaml
245
269
  ---
246
270
  namespace: MySuperOrganization
247
271
  branch: modulesyncbranch
272
+ pr_title: "Updates to module template files via modulesync"
273
+ pr_labels:
274
+ - TOOLING
275
+ - MAINTENANCE
276
+ - MODULESYNC
248
277
  ```
249
278
 
250
- ###### Gitlab
279
+ ###### GitLab
251
280
 
252
- ```
281
+ ```yaml
253
282
  ---
254
283
  git_base: 'user@gitlab.example.com:'
255
284
  namespace: MySuperOrganization
@@ -258,7 +287,7 @@ branch: modulesyncbranch
258
287
 
259
288
  ###### Gerrit
260
289
 
261
- ```
290
+ ```yaml
262
291
  ---
263
292
  namespace: stackforge
264
293
  git_base: ssh://jdoe@review.openstack.org:29418/
@@ -350,11 +379,11 @@ current date, bumped (minor) version, and commit message.
350
379
  If `CHANGELOG.md` is absent in the repository, nothing will happen.
351
380
 
352
381
 
353
- #### Defining templates
382
+ #### Working with templates
354
383
 
355
- As commented, files within moduleroot directory can be flat files or ERB templates. These files have direct access to @configs hash, which gets values from config_defaults.yml file and from the module being processed:
384
+ As mentioned, files in the moduleroot directory must be ERB templates (they must have an .erb extension, or they will be ignored). These files have direct access to @configs hash, which gets values from config_defaults.yml file and from the module being processed:
356
385
 
357
- ```
386
+ ```erb
358
387
  <%= @configs[:git_base] %>
359
388
  <%= @configs[:namespace] %>
360
389
  <%= @configs[:puppet_module] %>
@@ -85,6 +85,16 @@ module ModuleSync
85
85
  :type => :boolean,
86
86
  :desc => 'No-op mode',
87
87
  :default => false
88
+ option :pr,
89
+ :type => :boolean,
90
+ :desc => 'Submit GitHub PR',
91
+ :default => false
92
+ option :pr_title,
93
+ :desc => 'Title of GitHub PR',
94
+ :default => CLI.defaults[:pr_title] || 'Update to module template files'
95
+ option :pr_labels,
96
+ :desc => 'Labels to add to the GitHub PR',
97
+ :default => CLI.defaults[:pr_labels] || []
88
98
  option :offline,
89
99
  :type => :boolean,
90
100
  :desc => 'Do not run any Git commands. Allows the user to manage Git outside of ModuleSync.',
@@ -151,11 +151,14 @@ module ModuleSync
151
151
  rescue ::Git::GitExecuteError => git_error
152
152
  if git_error.message =~ /working (directory|tree) clean/
153
153
  puts "There were no files to update in #{name}. Not committing."
154
+ return false
154
155
  else
155
156
  puts git_error
156
157
  raise
157
158
  end
158
159
  end
160
+
161
+ true
159
162
  end
160
163
 
161
164
  # Needed because of a bug in the git gem that lists ignored files as
@@ -14,5 +14,15 @@ module ModuleSync
14
14
  {}
15
15
  end
16
16
  end
17
+
18
+ def self.parse_list(option_value)
19
+ if option_value.is_a? String
20
+ option_value.split(',')
21
+ elsif option_value.is_a? Array
22
+ option_value
23
+ else
24
+ []
25
+ end
26
+ end
17
27
  end
18
28
  end
data/lib/modulesync.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'fileutils'
2
+ require 'octokit'
2
3
  require 'pathname'
3
4
  require 'modulesync/cli'
4
5
  require 'modulesync/constants'
@@ -9,6 +10,12 @@ require 'modulesync/settings'
9
10
  require 'modulesync/util'
10
11
  require 'monkey_patches'
11
12
 
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
+
12
19
  module ModuleSync
13
20
  include Constants
14
21
 
@@ -89,6 +96,11 @@ module ModuleSync
89
96
  end
90
97
 
91
98
  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]
102
+ end
103
+
92
104
  puts "Syncing #{puppet_module}"
93
105
  namespace, module_name = module_name(puppet_module, options[:namespace])
94
106
  unless options[:offline]
@@ -114,7 +126,27 @@ module ModuleSync
114
126
  if options[:noop]
115
127
  Git.update_noop(module_name, options)
116
128
  elsif !options[:offline]
117
- Git.update(module_name, files_to_manage, options)
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
118
150
  end
119
151
  end
120
152
 
data/modulesync.gemspec CHANGED
@@ -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.9.0'
6
+ spec.version = '0.10.0'
7
7
  spec.authors = ['Vox Pupuli']
8
8
  spec.email = ['voxpupuli@groups.io']
9
9
  spec.summary = 'Puppet Module Synchronizer'
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency 'rubocop', '~> 0.50.0'
25
25
 
26
26
  spec.add_runtime_dependency 'git', '~>1.3'
27
+ spec.add_runtime_dependency 'octokit', '~>4.0'
27
28
  spec.add_runtime_dependency 'puppet-blacksmith', '~>3.0'
28
29
  spec.add_runtime_dependency 'thor'
29
30
  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.9.0
4
+ version: 0.10.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: 2018-02-26 00:00:00.000000000 Z
11
+ date: 2018-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aruba
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: octokit
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '4.0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '4.0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: puppet-blacksmith
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -179,8 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
193
  - !ruby/object:Gem::Version
180
194
  version: '0'
181
195
  requirements: []
182
- rubyforge_project:
183
- rubygems_version: 2.7.6
196
+ rubygems_version: 3.0.1
184
197
  signing_key:
185
198
  specification_version: 4
186
199
  summary: Puppet Module Synchronizer