modulesync 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +8 -3
- data/CHANGELOG.md +4 -0
- data/README.md +17 -15
- data/lib/modulesync.rb +25 -42
- data/lib/modulesync/cli.rb +3 -3
- data/lib/modulesync/pr/github.rb +41 -0
- data/lib/modulesync/pr/gitlab.rb +40 -0
- data/modulesync.gemspec +2 -1
- data/spec/unit/modulesync/pr/github_spec.rb +49 -0
- data/spec/unit/modulesync/pr/gitlab_spec.rb +81 -0
- data/spec/unit/modulesync_spec.rb +5 -52
- metadata +23 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2442835e7b5da17cc633790e9e4a2a3fe38c0a1b4d3fbd75ee8f60b6948ddc75
|
4
|
+
data.tar.gz: 0f0c8f284f95824e469759582db8188b37c8c8d7247f463dc9877e973887fcac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 521392847ed7f191f9ef9bb6a0c26d80fb7c557b882f092bec29834311af6c10a2e0bd5db2d1be162996fbfbcccfd5f9ac1063268b6480aa95c867802e9b48b3
|
7
|
+
data.tar.gz: b3ddc00ba28e2d5043cb0e24d3448c35ca84f3d42a4263de4efa8513f7c38d02ca2324289a2b15d2a5c84435a3329de76acccfae8da2da6f1df31d60553cdc77
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 2020-07-03 - 1.2.0
|
4
|
+
|
5
|
+
Add support for GitLab merge requests (MRs) [#175](https://github.com/voxpupuli/modulesync/pull/175)
|
6
|
+
|
3
7
|
## 2020-05-01 - 1.1.0
|
4
8
|
|
5
9
|
This release provides metadata in the ERB template scope which makes it easy to read files from inside the module. A possible application is reading metadata.json and generating CI configs based on that.
|
data/README.md
CHANGED
@@ -176,27 +176,29 @@ touching the modules, you can deactivate the hook.
|
|
176
176
|
msync hook deactivate
|
177
177
|
```
|
178
178
|
|
179
|
-
#### Submitting PRs to GitHub
|
179
|
+
#### Submitting PRs/MRs to GitHub or GitLab
|
180
180
|
|
181
|
-
You can have modulesync submit Pull Requests on GitHub
|
182
|
-
`--pr` CLI option.
|
181
|
+
You can have modulesync submit Pull Requests on GitHub or Merge Requests on
|
182
|
+
GitLab automatically with the `--pr` CLI option.
|
183
183
|
|
184
184
|
```
|
185
185
|
msync update --pr
|
186
186
|
```
|
187
187
|
|
188
|
-
You must set `GITHUB_TOKEN`
|
189
|
-
|
188
|
+
You must set the `GITHUB_TOKEN` or `GITLAB_TOKEN` environment variable
|
189
|
+
for GitHub PRs or GitLab MRs to work. Additional options:
|
190
190
|
|
191
|
-
* Set the PR title with `--pr-title` or in `modulesync.yml` with the
|
192
|
-
attribute.
|
193
|
-
* Assign labels to the PR with `--pr-labels` or in `modulesync.yml` with
|
194
|
-
`pr_labels` attribute. **NOTE:** `pr_labels` should be a list. When
|
195
|
-
the `--pr-labels` CLI option, you should use a comma separated list.
|
191
|
+
* Set the PR/MR title with `--pr-title` or in `modulesync.yml` with the
|
192
|
+
`pr_title` attribute.
|
193
|
+
* Assign labels to the PR/MR with `--pr-labels` or in `modulesync.yml` with
|
194
|
+
the `pr_labels` attribute. **NOTE:** `pr_labels` should be a list. When
|
195
|
+
using the `--pr-labels` CLI option, you should use a comma separated list.
|
196
196
|
|
197
|
-
|
198
|
-
|
199
|
-
|
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
|
+
More details for GitHub:
|
200
|
+
|
201
|
+
* Octokit [`api_endpoint`](https://github.com/octokit/octokit.rb#interacting-with-the-githubcom-apis-in-github-enterprise)
|
200
202
|
|
201
203
|
### Using Forks and Non-master branches
|
202
204
|
|
@@ -258,8 +260,8 @@ Available parameters for modulesync.yml
|
|
258
260
|
* `remote_branch` : Remote branch to push to (Default: Same value as branch)
|
259
261
|
* `message` : Commit message to apply to updated modules.
|
260
262
|
* `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.
|
263
|
+
* `pr_title` : The title to use when submitting PRs/MRs to GitHub or GitLab.
|
264
|
+
* `pr_labels` : A list of labels to assign PRs/MRs created on GitHub or GitLab.
|
263
265
|
|
264
266
|
##### Example
|
265
267
|
|
data/lib/modulesync.rb
CHANGED
@@ -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,12 +9,6 @@ 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
12
|
module ModuleSync # rubocop:disable Metrics/ModuleLength
|
20
13
|
include Constants
|
21
14
|
|
@@ -136,48 +129,22 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
|
|
136
129
|
if options[:noop]
|
137
130
|
Git.update_noop(git_repo, options)
|
138
131
|
elsif !options[:offline]
|
139
|
-
# Git.update() returns a boolean: true if files were pushed, false if not.
|
140
132
|
pushed = Git.update(git_repo, files_to_manage, options)
|
141
|
-
|
142
|
-
|
143
|
-
manage_pr(namespace, module_name, options)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
def self.manage_pr(namespace, module_name, options)
|
148
|
-
if options[:pr] && GITHUB_TOKEN.empty?
|
149
|
-
$stderr.puts 'Environment variable GITHUB_TOKEN must be set to use --pr!'
|
150
|
-
raise unless options[:skip_broken]
|
151
|
-
end
|
152
|
-
|
153
|
-
# We only do GitHub PR work if the GITHUB_TOKEN variable is set in the environment.
|
154
|
-
repo_path = File.join(namespace, module_name)
|
155
|
-
github = Octokit::Client.new(:access_token => GITHUB_TOKEN)
|
156
|
-
|
157
|
-
# Skip creating the PR if it exists already.
|
158
|
-
head = "#{namespace}:#{options[:branch]}"
|
159
|
-
pull_requests = github.pull_requests(repo_path, :state => 'open', :base => 'master', :head => head)
|
160
|
-
if pull_requests.empty?
|
161
|
-
pr = github.create_pull_request(repo_path, 'master', options[:branch], options[:pr_title], options[:message])
|
162
|
-
$stdout.puts "Submitted PR '#{options[:pr_title]}' to #{repo_path} - merges #{options[:branch]} into master"
|
163
|
-
else
|
164
|
-
$stdout.puts "Skipped! #{pull_requests.length} PRs found for branch #{options[:branch]}"
|
133
|
+
pushed && options[:pr] && @pr.manage(namespace, module_name, options)
|
165
134
|
end
|
166
|
-
|
167
|
-
# PR labels can either be a list in the YAML file or they can pass in a comma
|
168
|
-
# separated list via the command line argument.
|
169
|
-
pr_labels = Util.parse_list(options[:pr_labels])
|
170
|
-
|
171
|
-
# We only assign labels to the PR if we've discovered a list > 1. The labels MUST
|
172
|
-
# already exist. We DO NOT create missing labels.
|
173
|
-
return if pr_labels.empty?
|
174
|
-
$stdout.puts "Attaching the following labels to PR #{pr['number']}: #{pr_labels.join(', ')}"
|
175
|
-
github.add_labels_to_an_issue(repo_path, pr['number'], pr_labels)
|
176
135
|
end
|
177
136
|
|
178
137
|
def self.update(options)
|
179
138
|
options = config_defaults.merge(options)
|
180
139
|
defaults = Util.parse_config(File.join(options[:configs], CONF_FILE))
|
140
|
+
if options[:pr]
|
141
|
+
unless options[:branch]
|
142
|
+
$stderr.puts 'A branch must be specified with --branch to use --pr!'
|
143
|
+
raise
|
144
|
+
end
|
145
|
+
|
146
|
+
@pr = create_pr_manager if options[:pr]
|
147
|
+
end
|
181
148
|
|
182
149
|
local_template_dir = File.join(options[:configs], MODULE_FILES_DIR)
|
183
150
|
local_files = find_template_files(local_template_dir)
|
@@ -201,4 +168,20 @@ module ModuleSync # rubocop:disable Metrics/ModuleLength
|
|
201
168
|
end
|
202
169
|
exit 1 if errors && options[:fail_on_warnings]
|
203
170
|
end
|
171
|
+
|
172
|
+
def self.create_pr_manager
|
173
|
+
github_token = ENV.fetch('GITHUB_TOKEN', '')
|
174
|
+
gitlab_token = ENV.fetch('GITLAB_TOKEN', '')
|
175
|
+
|
176
|
+
if !github_token.empty?
|
177
|
+
require 'modulesync/pr/github'
|
178
|
+
ModuleSync::PR::GitHub.new(github_token, ENV.fetch('GITHUB_BASE_URL', 'https://api.github.com'))
|
179
|
+
elsif !gitlab_token.empty?
|
180
|
+
require 'modulesync/pr/github'
|
181
|
+
ModuleSync::PR::GitLab.new(gitlab_token, ENV.fetch('GITLAB_BASE_URL', 'https://gitlab.com/api/v4'))
|
182
|
+
else
|
183
|
+
$stderr.puts 'Environment variables GITHUB_TOKEN or GITLAB_TOKEN must be set to use --pr!'
|
184
|
+
raise
|
185
|
+
end
|
186
|
+
end
|
204
187
|
end
|
data/lib/modulesync/cli.rb
CHANGED
@@ -90,14 +90,14 @@ module ModuleSync
|
|
90
90
|
:default => false
|
91
91
|
option :pr,
|
92
92
|
:type => :boolean,
|
93
|
-
:desc => 'Submit
|
93
|
+
:desc => 'Submit pull/merge request',
|
94
94
|
:default => false
|
95
95
|
option :pr_title,
|
96
|
-
:desc => 'Title of
|
96
|
+
:desc => 'Title of pull/merge request',
|
97
97
|
:default => CLI.defaults[:pr_title] || 'Update to module template files'
|
98
98
|
option :pr_labels,
|
99
99
|
:type => :array,
|
100
|
-
:desc => 'Labels to add to the
|
100
|
+
:desc => 'Labels to add to the pull/merge request',
|
101
101
|
:default => CLI.defaults[:pr_labels] || []
|
102
102
|
option :offline,
|
103
103
|
:type => :boolean,
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'octokit'
|
2
|
+
require 'modulesync/util'
|
3
|
+
|
4
|
+
module ModuleSync
|
5
|
+
module PR
|
6
|
+
# GitHub creates and manages pull requests on github.com or GitHub
|
7
|
+
# Enterprise installations.
|
8
|
+
class GitHub
|
9
|
+
def initialize(token, endpoint)
|
10
|
+
Octokit.configure do |c|
|
11
|
+
c.api_endpoint = endpoint
|
12
|
+
end
|
13
|
+
@api = Octokit::Client.new(:access_token => token)
|
14
|
+
end
|
15
|
+
|
16
|
+
def manage(namespace, module_name, options)
|
17
|
+
repo_path = File.join(namespace, module_name)
|
18
|
+
head = "#{namespace}:#{options[:branch]}"
|
19
|
+
|
20
|
+
pull_requests = @api.pull_requests(repo_path, :state => 'open', :base => 'master', :head => head)
|
21
|
+
if pull_requests.empty?
|
22
|
+
pr = @api.create_pull_request(repo_path, 'master', options[:branch], options[:pr_title], options[:message])
|
23
|
+
$stdout.puts "Submitted PR '#{options[:pr_title]}' to #{repo_path} - merges #{options[:branch]} into master"
|
24
|
+
else
|
25
|
+
# Skip creating the PR if it exists already.
|
26
|
+
$stdout.puts "Skipped! #{pull_requests.length} PRs found for branch #{options[:branch]}"
|
27
|
+
end
|
28
|
+
|
29
|
+
# PR labels can either be a list in the YAML file or they can pass in a comma
|
30
|
+
# separated list via the command line argument.
|
31
|
+
pr_labels = ModuleSync::Util.parse_list(options[:pr_labels])
|
32
|
+
|
33
|
+
# We only assign labels to the PR if we've discovered a list > 1. The labels MUST
|
34
|
+
# already exist. We DO NOT create missing labels.
|
35
|
+
return if pr_labels.empty?
|
36
|
+
$stdout.puts "Attaching the following labels to PR #{pr['number']}: #{pr_labels.join(', ')}"
|
37
|
+
@api.add_labels_to_an_issue(repo_path, pr['number'], pr_labels)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'gitlab'
|
2
|
+
require 'modulesync/util'
|
3
|
+
|
4
|
+
module ModuleSync
|
5
|
+
module PR
|
6
|
+
# GitLab creates and manages merge requests on gitlab.com or private GitLab
|
7
|
+
# installations.
|
8
|
+
class GitLab
|
9
|
+
def initialize(token, endpoint)
|
10
|
+
@api = Gitlab::Client.new(
|
11
|
+
:endpoint => endpoint,
|
12
|
+
:private_token => token
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def manage(namespace, module_name, options)
|
17
|
+
repo_path = File.join(namespace, module_name)
|
18
|
+
|
19
|
+
head = "#{namespace}:#{options[:branch]}"
|
20
|
+
merge_requests = @api.merge_requests(repo_path,
|
21
|
+
:state => 'opened',
|
22
|
+
:source_branch => head,
|
23
|
+
:target_branch => 'master')
|
24
|
+
if merge_requests.empty?
|
25
|
+
mr_labels = ModuleSync::Util.parse_list(options[:pr_labels])
|
26
|
+
mr = @api.create_merge_request(repo_path, options[:pr_title],
|
27
|
+
:source_branch => options[:branch],
|
28
|
+
:target_branch => 'master',
|
29
|
+
:labels => mr_labels)
|
30
|
+
$stdout.puts "Submitted MR '#{options[:pr_title]}' to #{repo_path} - merges #{options[:branch]} into master"
|
31
|
+
return if mr_labels.empty?
|
32
|
+
$stdout.puts "Attached the following labels to MR #{mr.iid}: #{mr_labels.join(', ')}"
|
33
|
+
else
|
34
|
+
# Skip creating the MR if it exists already.
|
35
|
+
$stdout.puts "Skipped! #{merge_requests.length} MRs found for branch #{options[:branch]}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
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.2.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 'gitlab', '~>4.0'
|
27
28
|
spec.add_runtime_dependency 'octokit', '~>4.0'
|
28
29
|
spec.add_runtime_dependency 'puppet-blacksmith', '~>3.0'
|
29
30
|
spec.add_runtime_dependency 'thor'
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'modulesync/pr/github'
|
3
|
+
|
4
|
+
describe ModuleSync::PR::GitHub do
|
5
|
+
context '::manage' do
|
6
|
+
before(:each) do
|
7
|
+
@git_repo = 'test/modulesync'
|
8
|
+
@namespace, @repo_name = @git_repo.split('/')
|
9
|
+
@options = {
|
10
|
+
:pr => true,
|
11
|
+
:pr_title => 'Test PR is submitted',
|
12
|
+
:branch => 'test',
|
13
|
+
:message => 'Hello world',
|
14
|
+
:pr_auto_merge => false,
|
15
|
+
}
|
16
|
+
|
17
|
+
@client = double()
|
18
|
+
allow(Octokit::Client).to receive(:new).and_return(@client)
|
19
|
+
@it = ModuleSync::PR::GitHub.new('test', 'https://api.github.com')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'submits PR when --pr is set' do
|
23
|
+
allow(@client).to receive(:pull_requests).with(@git_repo, :state => 'open', :base => 'master', :head => "#{@namespace}:#{@options[:branch]}").and_return([])
|
24
|
+
expect(@client).to receive(:create_pull_request).with(@git_repo, 'master', @options[:branch], @options[:pr_title], @options[:message]).and_return({"html_url" => "http://example.com/pulls/22"})
|
25
|
+
expect { @it.manage(@namespace, @repo_name, @options) }.to output(/Submitted PR/).to_stdout
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'skips submitting PR if one has already been issued' do
|
29
|
+
pr = {
|
30
|
+
"title" => "Test title",
|
31
|
+
"html_url" => "https://example.com/pulls/44",
|
32
|
+
"number" => "44"
|
33
|
+
}
|
34
|
+
|
35
|
+
expect(@client).to receive(:pull_requests).with(@git_repo, :state => 'open', :base => 'master', :head => "#{@namespace}:#{@options[:branch]}").and_return([pr])
|
36
|
+
expect { @it.manage(@namespace, @repo_name, @options) }.to output(/Skipped! 1 PRs found for branch test/).to_stdout
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'adds labels to PR when --pr-labels is set' do
|
40
|
+
@options[:pr_labels] = "HELLO,WORLD"
|
41
|
+
|
42
|
+
allow(@client).to receive(:create_pull_request).and_return({"html_url" => "http://example.com/pulls/22", "number" => "44"})
|
43
|
+
allow(@client).to receive(:pull_requests).with(@git_repo, :state => 'open', :base => 'master', :head => "#{@namespace}:#{@options[:branch]}").and_return([])
|
44
|
+
|
45
|
+
expect(@client).to receive(:add_labels_to_an_issue).with(@git_repo, "44", ["HELLO", "WORLD"])
|
46
|
+
expect { @it.manage(@namespace, @repo_name, @options) }.to output(/Attaching the following labels to PR 44: HELLO, WORLD/).to_stdout
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'modulesync/pr/gitlab'
|
3
|
+
|
4
|
+
describe ModuleSync::PR::GitLab do
|
5
|
+
context '::manage' do
|
6
|
+
before(:each) do
|
7
|
+
@git_repo = 'test/modulesync'
|
8
|
+
@namespace, @repo_name = @git_repo.split('/')
|
9
|
+
@options = {
|
10
|
+
:pr => true,
|
11
|
+
:pr_title => 'Test PR is submitted',
|
12
|
+
:branch => 'test',
|
13
|
+
:message => 'Hello world',
|
14
|
+
:pr_auto_merge => false,
|
15
|
+
}
|
16
|
+
|
17
|
+
@client = double()
|
18
|
+
allow(Gitlab::Client).to receive(:new).and_return(@client)
|
19
|
+
@it = ModuleSync::PR::GitLab.new('test', 'https://gitlab.com/api/v4')
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'submits MR when --pr is set' do
|
23
|
+
allow(@client).to receive(:merge_requests)
|
24
|
+
.with(@git_repo,
|
25
|
+
:state => 'opened',
|
26
|
+
:source_branch => "#{@namespace}:#{@options[:branch]}",
|
27
|
+
:target_branch => 'master',
|
28
|
+
).and_return([])
|
29
|
+
|
30
|
+
expect(@client).to receive(:create_merge_request)
|
31
|
+
.with(@git_repo,
|
32
|
+
@options[:pr_title],
|
33
|
+
:labels => [],
|
34
|
+
:source_branch => @options[:branch],
|
35
|
+
:target_branch => 'master',
|
36
|
+
).and_return({"html_url" => "http://example.com/pulls/22"})
|
37
|
+
|
38
|
+
expect { @it.manage(@namespace, @repo_name, @options) }.to output(/Submitted MR/).to_stdout
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'skips submitting MR if one has already been issued' do
|
42
|
+
mr = {
|
43
|
+
"title" => "Test title",
|
44
|
+
"html_url" => "https://example.com/pulls/44",
|
45
|
+
"iid" => "44"
|
46
|
+
}
|
47
|
+
|
48
|
+
expect(@client).to receive(:merge_requests)
|
49
|
+
.with(@git_repo,
|
50
|
+
:state => 'opened',
|
51
|
+
:source_branch => "#{@namespace}:#{@options[:branch]}",
|
52
|
+
:target_branch => 'master',
|
53
|
+
).and_return([mr])
|
54
|
+
|
55
|
+
expect { @it.manage(@namespace, @repo_name, @options) }.to output(/Skipped! 1 MRs found for branch test/).to_stdout
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'adds labels to MR when --pr-labels is set' do
|
59
|
+
@options[:pr_labels] = "HELLO,WORLD"
|
60
|
+
mr = double()
|
61
|
+
allow(mr).to receive(:iid).and_return("42")
|
62
|
+
|
63
|
+
expect(@client).to receive(:create_merge_request)
|
64
|
+
.with(@git_repo,
|
65
|
+
@options[:pr_title],
|
66
|
+
:labels => ["HELLO", "WORLD"],
|
67
|
+
:source_branch => @options[:branch],
|
68
|
+
:target_branch => 'master',
|
69
|
+
).and_return(mr)
|
70
|
+
|
71
|
+
allow(@client).to receive(:merge_requests)
|
72
|
+
.with(@git_repo,
|
73
|
+
:state => 'opened',
|
74
|
+
:source_branch => "#{@namespace}:#{@options[:branch]}",
|
75
|
+
:target_branch => 'master',
|
76
|
+
).and_return([])
|
77
|
+
|
78
|
+
expect { @it.manage(@namespace, @repo_name, @options) }.to output(/Attached the following labels to MR 42: HELLO, WORLD/).to_stdout
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -12,58 +12,11 @@ describe ModuleSync do
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
context '::
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
@options = {
|
21
|
-
:pr => true,
|
22
|
-
:pr_title => 'Test PR is submitted',
|
23
|
-
:branch => 'test',
|
24
|
-
:message => 'Hello world',
|
25
|
-
:pr_auto_merge => false,
|
26
|
-
}
|
27
|
-
|
28
|
-
@client = double()
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'rasies an error when GITHUB_TOKEN not set for PRs' do
|
32
|
-
stub_const('GITHUB_TOKEN', '')
|
33
|
-
options = {:pr => true, :skip_broken => false}
|
34
|
-
|
35
|
-
expect { ModuleSync.manage_pr(@namespace, @repo_name, options) }.to raise_error(RuntimeError).and output(/GITHUB_TOKEN/).to_stderr
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'submits PR when --pr is set' do
|
39
|
-
allow(Octokit::Client).to receive(:new).and_return(@client)
|
40
|
-
allow(@client).to receive(:pull_requests).with(@git_repo, :state => 'open', :base => 'master', :head => "#{@namespace}:#{@options[:branch]}").and_return([])
|
41
|
-
expect(@client).to receive(:create_pull_request).with(@git_repo, 'master', @options[:branch], @options[:pr_title], @options[:message]).and_return({"html_url" => "http://example.com/pulls/22"})
|
42
|
-
expect { ModuleSync.manage_pr(@namespace, @repo_name, @options) }.to output(/Submitted PR/).to_stdout
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'skips submitting PR if one has already been issued' do
|
46
|
-
allow(Octokit::Client).to receive(:new).and_return(@client)
|
47
|
-
|
48
|
-
pr = {
|
49
|
-
"title" => "Test title",
|
50
|
-
"html_url" => "https://example.com/pulls/44",
|
51
|
-
"number" => "44"
|
52
|
-
}
|
53
|
-
|
54
|
-
expect(@client).to receive(:pull_requests).with(@git_repo, :state => 'open', :base => 'master', :head => "#{@namespace}:#{@options[:branch]}").and_return([pr])
|
55
|
-
expect { ModuleSync.manage_pr(@namespace, @repo_name, @options) }.to output(/Skipped! 1 PRs found for branch test/).to_stdout
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'adds labels to PR when --pr-labels is set' do
|
59
|
-
@options[:pr_labels] = "HELLO,WORLD"
|
60
|
-
|
61
|
-
allow(Octokit::Client).to receive(:new).and_return(@client)
|
62
|
-
allow(@client).to receive(:create_pull_request).and_return({"html_url" => "http://example.com/pulls/22", "number" => "44"})
|
63
|
-
allow(@client).to receive(:pull_requests).with(@git_repo, :state => 'open', :base => 'master', :head => "#{@namespace}:#{@options[:branch]}").and_return([])
|
64
|
-
|
65
|
-
expect(@client).to receive(:add_labels_to_an_issue).with(@git_repo, "44", ["HELLO", "WORLD"])
|
66
|
-
expect { ModuleSync.manage_pr(@namespace, @repo_name, @options) }.to output(/Attaching the following labels to PR 44: HELLO, WORLD/).to_stdout
|
15
|
+
context '::create_pr_manager' do
|
16
|
+
describe "Raise Error" do
|
17
|
+
it 'raises an error when neither GITHUB_TOKEN nor GITLAB_TOKEN are set for PRs' do
|
18
|
+
expect { ModuleSync.create_pr_manager() }.to raise_error(RuntimeError).and output(/GITHUB_TOKEN/).to_stderr
|
19
|
+
end
|
67
20
|
end
|
68
21
|
end
|
69
22
|
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.2.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-
|
11
|
+
date: 2020-07-03 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: gitlab
|
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: octokit
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -166,12 +180,16 @@ files:
|
|
166
180
|
- lib/modulesync/constants.rb
|
167
181
|
- lib/modulesync/git.rb
|
168
182
|
- lib/modulesync/hook.rb
|
183
|
+
- lib/modulesync/pr/github.rb
|
184
|
+
- lib/modulesync/pr/gitlab.rb
|
169
185
|
- lib/modulesync/renderer.rb
|
170
186
|
- lib/modulesync/settings.rb
|
171
187
|
- lib/modulesync/util.rb
|
172
188
|
- lib/monkey_patches.rb
|
173
189
|
- modulesync.gemspec
|
174
190
|
- spec/spec_helper.rb
|
191
|
+
- spec/unit/modulesync/pr/github_spec.rb
|
192
|
+
- spec/unit/modulesync/pr/gitlab_spec.rb
|
175
193
|
- spec/unit/modulesync/settings_spec.rb
|
176
194
|
- spec/unit/modulesync_spec.rb
|
177
195
|
homepage: http://github.com/voxpupuli/modulesync
|
@@ -193,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
193
211
|
- !ruby/object:Gem::Version
|
194
212
|
version: '0'
|
195
213
|
requirements: []
|
196
|
-
rubygems_version: 3.1.
|
214
|
+
rubygems_version: 3.1.4
|
197
215
|
signing_key:
|
198
216
|
specification_version: 4
|
199
217
|
summary: Puppet Module Synchronizer
|
@@ -204,5 +222,7 @@ test_files:
|
|
204
222
|
- features/support/env.rb
|
205
223
|
- features/update.feature
|
206
224
|
- spec/spec_helper.rb
|
225
|
+
- spec/unit/modulesync/pr/github_spec.rb
|
226
|
+
- spec/unit/modulesync/pr/gitlab_spec.rb
|
207
227
|
- spec/unit/modulesync/settings_spec.rb
|
208
228
|
- spec/unit/modulesync_spec.rb
|