modulesync 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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