modulesync 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +1 -1
- data/CHANGELOG.md +10 -1
- data/README.md +28 -5
- data/lib/modulesync.rb +40 -8
- data/lib/modulesync/cli.rb +5 -0
- data/lib/modulesync/pr/github.rb +9 -3
- data/lib/modulesync/pr/gitlab.rb +5 -3
- data/modulesync.gemspec +1 -1
- data/spec/unit/modulesync_spec.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7fb5357d0ecf1e4f620be302b55c9f1e88779c446021097172866c87a1e57d8f
|
4
|
+
data.tar.gz: be3975ae4dbe2a4e6a32cc5851bc0e9ce8ac8dd0b9560175380f492e43dabe27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 15051bcc97f904d9d886e67abf9e6ea99818410ec3f330f7d67ed9cc86451f322b79861801218f46b534a0f3241f3aa15dc16928360c471c0742e0b8f3c120f7
|
7
|
+
data.tar.gz: d527c5e7eeeccfabdbd5eb328759b826873aea33f12419179a89f84a1499af784788de9ca420eab8cbc5d2d83fdf1a9a8f6bbde1c536b25aca9c35b21c77c40b
|
data/.rubocop_todo.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 2020-07-03 - 1.3.0
|
4
|
+
|
5
|
+
* Expose --managed_modules_conf [#184](https://github.com/voxpupuli/modulesync/pull/184)
|
6
|
+
* Allow absolute path for config files [#183](https://github.com/voxpupuli/modulesync/pull/183)
|
7
|
+
* Add pr_target_branch option [#182](https://github.com/voxpupuli/modulesync/pull/182)
|
8
|
+
* Allow to specify namespace in module_options [#181](https://github.com/voxpupuli/modulesync/pull/181)
|
9
|
+
* Allow to override PR parameters per module [#178](https://github.com/voxpupuli/modulesync/pull/178)
|
10
|
+
* Include the gitlab library (if we interact with gitlab), not github [#179](https://github.com/voxpupuli/modulesync/pull/179)
|
11
|
+
|
3
12
|
## 2020-07-03 - 1.2.0
|
4
13
|
|
5
|
-
Add support for GitLab merge requests (MRs) [#175](https://github.com/voxpupuli/modulesync/pull/175)
|
14
|
+
* Add support for GitLab merge requests (MRs) [#175](https://github.com/voxpupuli/modulesync/pull/175)
|
6
15
|
|
7
16
|
## 2020-05-01 - 1.1.0
|
8
17
|
|
data/README.md
CHANGED
@@ -185,17 +185,38 @@ GitLab automatically with the `--pr` CLI option.
|
|
185
185
|
msync update --pr
|
186
186
|
```
|
187
187
|
|
188
|
-
|
189
|
-
|
188
|
+
In order for GitHub PRs or GitLab MRs to work, you must either provide
|
189
|
+
the `GITHUB_TOKEN` or `GITLAB_TOKEN` environment variables,
|
190
|
+
or set them per repository in `managed_modules.yml`, using the `github` or
|
191
|
+
`gitlab` keys respectively.
|
192
|
+
|
193
|
+
For GitHub Enterprise and self-hosted GitLab instances you also need to set the
|
194
|
+
`GITHUB_BASE_URL` or `GITLAB_BASE_URL` environment variables, or use the
|
195
|
+
`base_url` parameter in `managed_modules.yml`:
|
196
|
+
|
197
|
+
```yaml
|
198
|
+
---
|
199
|
+
repo1:
|
200
|
+
:github:
|
201
|
+
:token: 'EXAMPLE_TOKEN'
|
202
|
+
:base_url: 'https://api.github.com/'
|
203
|
+
|
204
|
+
repo2:
|
205
|
+
:gitlab:
|
206
|
+
:token: 'EXAMPLE_TOKEN'
|
207
|
+
:base_url: 'https://git.example.com/api/v4'
|
208
|
+
```
|
209
|
+
|
210
|
+
Then:
|
190
211
|
|
191
212
|
* Set the PR/MR title with `--pr-title` or in `modulesync.yml` with the
|
192
213
|
`pr_title` attribute.
|
193
214
|
* Assign labels to the PR/MR with `--pr-labels` or in `modulesync.yml` with
|
194
215
|
the `pr_labels` attribute. **NOTE:** `pr_labels` should be a list. When
|
195
216
|
using the `--pr-labels` CLI option, you should use a comma separated list.
|
217
|
+
* Set the target branch with `--pr_target_branch` or in `modulesync.yml` with
|
218
|
+
the `pr_target_branch` attribute.
|
196
219
|
|
197
|
-
For GitHub Enterprise and self-hosted GitLab instances you need to set the
|
198
|
-
`GITHUB_BASE_URL` or `GITLAB_BASE_URL` environment variable in addition.
|
199
220
|
More details for GitHub:
|
200
221
|
|
201
222
|
* Octokit [`api_endpoint`](https://github.com/octokit/octokit.rb#interacting-with-the-githubcom-apis-in-github-enterprise)
|
@@ -255,7 +276,9 @@ msync update -m "Commit message"
|
|
255
276
|
Available parameters for modulesync.yml
|
256
277
|
|
257
278
|
* `git_base` : The default URL to git clone from (Default: 'git@github.com:')
|
258
|
-
* `namespace` : Namespace of the projects to manage (Default: 'puppetlabs')
|
279
|
+
* `namespace` : Namespace of the projects to manage (Default: 'puppetlabs').
|
280
|
+
This value can be overridden in the module name (e.g. 'namespace/mod') or by
|
281
|
+
using the `namespace` key for the module in `managed_modules.yml`.
|
259
282
|
* `branch` : Branch to push to (Default: 'master')
|
260
283
|
* `remote_branch` : Remote branch to push to (Default: Same value as branch)
|
261
284
|
* `message` : Commit message to apply to updated modules.
|
data/lib/modulesync.rb
CHANGED
@@ -105,7 +105,11 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
|
|
105
105
|
end
|
106
106
|
|
107
107
|
def self.manage_module(puppet_module, module_files, module_options, defaults, options)
|
108
|
-
|
108
|
+
default_namespace = options[:namespace]
|
109
|
+
if module_options.is_a?(Hash) && module_options.key?(:namespace)
|
110
|
+
default_namespace = module_options[:namespace]
|
111
|
+
end
|
112
|
+
namespace, module_name = module_name(puppet_module, default_namespace)
|
109
113
|
git_repo = File.join(namespace, module_name)
|
110
114
|
unless options[:offline]
|
111
115
|
Git.pull(options[:git_base], git_repo, options[:branch], options[:project_root], module_options || {})
|
@@ -130,13 +134,22 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
|
|
130
134
|
Git.update_noop(git_repo, options)
|
131
135
|
elsif !options[:offline]
|
132
136
|
pushed = Git.update(git_repo, files_to_manage, options)
|
133
|
-
pushed && options[:pr] &&
|
137
|
+
pushed && options[:pr] && pr(module_options).manage(namespace, module_name, options)
|
134
138
|
end
|
135
139
|
end
|
136
140
|
|
141
|
+
def self.config_path(file, options)
|
142
|
+
return file if Pathname.new(file).absolute?
|
143
|
+
File.join(options[:configs], file)
|
144
|
+
end
|
145
|
+
|
146
|
+
def config_path(file, options)
|
147
|
+
self.class.config_path(file, options)
|
148
|
+
end
|
149
|
+
|
137
150
|
def self.update(options)
|
138
151
|
options = config_defaults.merge(options)
|
139
|
-
defaults = Util.parse_config(
|
152
|
+
defaults = Util.parse_config(config_path(CONF_FILE, options))
|
140
153
|
if options[:pr]
|
141
154
|
unless options[:branch]
|
142
155
|
$stderr.puts 'A branch must be specified with --branch to use --pr!'
|
@@ -146,11 +159,11 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
|
|
146
159
|
@pr = create_pr_manager if options[:pr]
|
147
160
|
end
|
148
161
|
|
149
|
-
local_template_dir =
|
162
|
+
local_template_dir = config_path(MODULE_FILES_DIR, options)
|
150
163
|
local_files = find_template_files(local_template_dir)
|
151
164
|
module_files = relative_names(local_files, local_template_dir)
|
152
165
|
|
153
|
-
managed_modules = self.managed_modules(
|
166
|
+
managed_modules = self.managed_modules(config_path(options[:managed_modules_conf], options),
|
154
167
|
options[:filter],
|
155
168
|
options[:negative_filter])
|
156
169
|
|
@@ -169,6 +182,26 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
|
|
169
182
|
exit 1 if errors && options[:fail_on_warnings]
|
170
183
|
end
|
171
184
|
|
185
|
+
def self.pr(module_options)
|
186
|
+
github_conf = module_options[:github]
|
187
|
+
gitlab_conf = module_options[:gitlab]
|
188
|
+
|
189
|
+
if !github_conf.nil?
|
190
|
+
base_url = github_conf[:base_url] || ENV.fetch('GITHUB_BASE_URL', 'https://api.github.com')
|
191
|
+
require 'modulesync/pr/github'
|
192
|
+
ModuleSync::PR::GitHub.new(github_conf[:token], base_url)
|
193
|
+
elsif !gitlab_conf.nil?
|
194
|
+
base_url = gitlab_conf[:base_url] || ENV.fetch('GITLAB_BASE_URL', 'https://gitlab.com/api/v4')
|
195
|
+
require 'modulesync/pr/gitlab'
|
196
|
+
ModuleSync::PR::GitLab.new(gitlab_conf[:token], base_url)
|
197
|
+
elsif @pr.nil?
|
198
|
+
$stderr.puts 'No GitHub or GitLab token specified for --pr!'
|
199
|
+
raise
|
200
|
+
else
|
201
|
+
@pr
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
172
205
|
def self.create_pr_manager
|
173
206
|
github_token = ENV.fetch('GITHUB_TOKEN', '')
|
174
207
|
gitlab_token = ENV.fetch('GITLAB_TOKEN', '')
|
@@ -177,11 +210,10 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
|
|
177
210
|
require 'modulesync/pr/github'
|
178
211
|
ModuleSync::PR::GitHub.new(github_token, ENV.fetch('GITHUB_BASE_URL', 'https://api.github.com'))
|
179
212
|
elsif !gitlab_token.empty?
|
180
|
-
require 'modulesync/pr/
|
213
|
+
require 'modulesync/pr/gitlab'
|
181
214
|
ModuleSync::PR::GitLab.new(gitlab_token, ENV.fetch('GITLAB_BASE_URL', 'https://gitlab.com/api/v4'))
|
182
215
|
else
|
183
|
-
|
184
|
-
raise
|
216
|
+
warn '--pr specified without environment variables GITHUB_TOKEN or GITLAB_TOKEN'
|
185
217
|
end
|
186
218
|
end
|
187
219
|
end
|
data/lib/modulesync/cli.rb
CHANGED
@@ -67,6 +67,8 @@ module ModuleSync
|
|
67
67
|
:aliases => '-c',
|
68
68
|
:desc => 'The local directory or remote repository to define the list of managed modules,' \
|
69
69
|
' the file templates, and the default values for template variables.'
|
70
|
+
option :managed_modules_conf,
|
71
|
+
:desc => 'The file name to define the list of managed modules'
|
70
72
|
option :remote_branch,
|
71
73
|
:aliases => '-r',
|
72
74
|
:desc => 'Remote branch name to push the changes to. Defaults to the branch name.',
|
@@ -99,6 +101,9 @@ module ModuleSync
|
|
99
101
|
:type => :array,
|
100
102
|
:desc => 'Labels to add to the pull/merge request',
|
101
103
|
:default => CLI.defaults[:pr_labels] || []
|
104
|
+
option :pr_target_branch,
|
105
|
+
:desc => 'Target branch for the pull/merge request',
|
106
|
+
:default => CLI.defaults[:pr_target_branch] || 'master'
|
102
107
|
option :offline,
|
103
108
|
:type => :boolean,
|
104
109
|
:desc => 'Do not run any Git commands. Allows the user to manage Git outside of ModuleSync.',
|
data/lib/modulesync/pr/github.rb
CHANGED
@@ -16,11 +16,17 @@ module ModuleSync
|
|
16
16
|
def manage(namespace, module_name, options)
|
17
17
|
repo_path = File.join(namespace, module_name)
|
18
18
|
head = "#{namespace}:#{options[:branch]}"
|
19
|
+
target_branch = options[:pr_target_branch] || 'master'
|
19
20
|
|
20
|
-
pull_requests = @api.pull_requests(repo_path, :state => 'open', :base =>
|
21
|
+
pull_requests = @api.pull_requests(repo_path, :state => 'open', :base => target_branch, :head => head)
|
21
22
|
if pull_requests.empty?
|
22
|
-
pr = @api.create_pull_request(repo_path,
|
23
|
-
|
23
|
+
pr = @api.create_pull_request(repo_path,
|
24
|
+
target_branch,
|
25
|
+
options[:branch],
|
26
|
+
options[:pr_title],
|
27
|
+
options[:message])
|
28
|
+
$stdout.puts \
|
29
|
+
"Submitted PR '#{options[:pr_title]}' to #{repo_path} - merges #{options[:branch]} into #{target_branch}"
|
24
30
|
else
|
25
31
|
# Skip creating the PR if it exists already.
|
26
32
|
$stdout.puts "Skipped! #{pull_requests.length} PRs found for branch #{options[:branch]}"
|
data/lib/modulesync/pr/gitlab.rb
CHANGED
@@ -17,17 +17,19 @@ module ModuleSync
|
|
17
17
|
repo_path = File.join(namespace, module_name)
|
18
18
|
|
19
19
|
head = "#{namespace}:#{options[:branch]}"
|
20
|
+
target_branch = options[:pr_target_branch] || 'master'
|
20
21
|
merge_requests = @api.merge_requests(repo_path,
|
21
22
|
:state => 'opened',
|
22
23
|
:source_branch => head,
|
23
|
-
:target_branch =>
|
24
|
+
:target_branch => target_branch)
|
24
25
|
if merge_requests.empty?
|
25
26
|
mr_labels = ModuleSync::Util.parse_list(options[:pr_labels])
|
26
27
|
mr = @api.create_merge_request(repo_path, options[:pr_title],
|
27
28
|
:source_branch => options[:branch],
|
28
|
-
:target_branch =>
|
29
|
+
:target_branch => target_branch,
|
29
30
|
:labels => mr_labels)
|
30
|
-
$stdout.puts
|
31
|
+
$stdout.puts \
|
32
|
+
"Submitted MR '#{options[:pr_title]}' to #{repo_path} - merges #{options[:branch]} into #{target_branch}"
|
31
33
|
return if mr_labels.empty?
|
32
34
|
$stdout.puts "Attached the following labels to MR #{mr.iid}: #{mr_labels.join(', ')}"
|
33
35
|
else
|
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 = '1.
|
6
|
+
spec.version = '1.3.0'
|
7
7
|
spec.authors = ['Vox Pupuli']
|
8
8
|
spec.email = ['voxpupuli@groups.io']
|
9
9
|
spec.summary = 'Puppet Module Synchronizer'
|
@@ -12,10 +12,10 @@ describe ModuleSync do
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
context '::
|
15
|
+
context '::pr' do
|
16
16
|
describe "Raise Error" do
|
17
17
|
it 'raises an error when neither GITHUB_TOKEN nor GITLAB_TOKEN are set for PRs' do
|
18
|
-
expect { ModuleSync.
|
18
|
+
expect { ModuleSync.pr({}) }.to raise_error(RuntimeError).and output(/No GitHub or GitLab token specified for --pr/).to_stderr
|
19
19
|
end
|
20
20
|
end
|
21
21
|
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: 1.
|
4
|
+
version: 1.3.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: 2020-07-
|
11
|
+
date: 2020-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aruba
|