right_branch 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +44 -0
- data/lib/right_branch/commands/change_pull_request_target.rb +34 -8
- data/lib/right_branch/updater.rb +18 -20
- data/lib/right_branch/version.rb +1 -1
- data/spec/commands/change_pull_request_target_spec.rb +16 -0
- data/spec/updater_spec.rb +50 -22
- metadata +22 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4817adc6f712e714088de48667e079a1a0037f17
|
4
|
+
data.tar.gz: 5a908039cc340e39f7fbaa4fe06d2621b898159f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84df2a61749b2cd51a051c67bd9295d82badf0f74eb87a310c429202934f154b54aa8652d64d3b59fd40bfe076ffeeb0d234ae3a63544177a6daa5ad20c66f74
|
7
|
+
data.tar.gz: 155b3ba87282af4cab69549d2e93ba6201d561a0ad479d19b58180b890a95ee5d9ddb16e06e49e9167f6466c5e5104ef13184aeeb9b00bccf92b8577805917cc
|
data/README.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Right Branch
|
2
|
+
|
3
|
+
[![Gem version](http://img.shields.io/gem/v/right_branch.svg)](https://rubygems.org/gems/right_branch)
|
4
|
+
[![Build Status](https://travis-ci.org/DyegoCosta/right_branch.svg?branch=master)](https://travis-ci.org/DyegoCosta/right_branch)
|
5
|
+
|
6
|
+
Currently GitHub does not support switching the target branch of a Pull Request. This tool helps to do that in case a PR is submitted against a wrong branch.
|
7
|
+
|
8
|
+
## Getting started
|
9
|
+
|
10
|
+
Install gem:
|
11
|
+
|
12
|
+
```
|
13
|
+
$ gem install right_branch
|
14
|
+
```
|
15
|
+
|
16
|
+
Usage:
|
17
|
+
|
18
|
+
```
|
19
|
+
$ right_branch [options]
|
20
|
+
-u, --username USERNAME Username
|
21
|
+
-r, --repository REPOSITORY Repository
|
22
|
+
-b, --new-branch NEW_BRANCH New branch
|
23
|
+
-p, --pull-request PULL_REQUEST Pull request
|
24
|
+
-t, --access-token ACCESS_TOKEN Access token
|
25
|
+
--password PASSWORD Password
|
26
|
+
```
|
27
|
+
|
28
|
+
You can also use environment variables to set default configuration values.
|
29
|
+
|
30
|
+
```
|
31
|
+
$ export RIGHT_BRANCH_USERNAME=your_default_username
|
32
|
+
$ export RIGHT_BRANCH_REPOSITORY=your_default_repository
|
33
|
+
$ export RIGHT_BRANCH_ACCESS_TOKEN=your_default_access_token
|
34
|
+
```
|
35
|
+
|
36
|
+
## Acess token
|
37
|
+
|
38
|
+
You can avoid having to type your `username` and `password` by providing an access token
|
39
|
+
generated by GitHub.
|
40
|
+
If you specify it with the `--access-token` option or have it defined
|
41
|
+
as a `RIGHT_BRANCH_ACCESS_TOKEN` envrionment variable, it will be used as you authentication method.
|
42
|
+
You can [create access tokens through your GitHub Account Settings][create-access-token].
|
43
|
+
|
44
|
+
[create-access-token]:https://help.github.com/articles/creating-an-access-token-for-command-line-use
|
@@ -5,7 +5,7 @@ require_relative '../updater'
|
|
5
5
|
|
6
6
|
module RightBranch::Commands
|
7
7
|
class ChangePullRequestTarget
|
8
|
-
REQUIRED_OPTIONS =
|
8
|
+
REQUIRED_OPTIONS = [:repository, :new_branch, :pull_request]
|
9
9
|
|
10
10
|
attr_accessor :stream
|
11
11
|
|
@@ -19,7 +19,13 @@ module RightBranch::Commands
|
|
19
19
|
|
20
20
|
def run!
|
21
21
|
options = build_options
|
22
|
-
|
22
|
+
|
23
|
+
attrs = {
|
24
|
+
credentials: build_credentials(options),
|
25
|
+
repository: options[:repository]
|
26
|
+
}
|
27
|
+
|
28
|
+
updater(attrs).run!(options[:pull_request], options[:new_branch])
|
23
29
|
rescue ::Octokit::Unauthorized
|
24
30
|
abort 'Invalid credentials to update pull request'
|
25
31
|
rescue ::Octokit::UnprocessableEntity
|
@@ -39,25 +45,40 @@ module RightBranch::Commands
|
|
39
45
|
abort missing_key_abort_message(missing, opt_parser)
|
40
46
|
end
|
41
47
|
|
42
|
-
if
|
43
|
-
options[:password] = ask(
|
48
|
+
if prompt_for_password?(options)
|
49
|
+
options[:password] = ask('Enter your password: ') { |q| q.echo = '*' }
|
44
50
|
end
|
45
51
|
|
46
52
|
options
|
47
53
|
end
|
48
54
|
|
55
|
+
def prompt_for_password?(options)
|
56
|
+
String(options[:access_token]).empty? &&
|
57
|
+
String(options[:password]).empty?
|
58
|
+
end
|
59
|
+
|
60
|
+
def build_credentials(options)
|
61
|
+
if options[:access_token].to_s.empty?
|
62
|
+
{ login: options[:username], password: options[:password] }
|
63
|
+
else
|
64
|
+
{ access_token: options[:access_token] }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
49
68
|
def missing_opt_keys(options)
|
50
69
|
missing = REQUIRED_OPTIONS - options.keys
|
51
|
-
|
52
|
-
|
70
|
+
required_blank = options.select do |k, v|
|
71
|
+
REQUIRED_OPTIONS.include?(k) && String(v).empty?
|
72
|
+
end
|
73
|
+
missing += required_blank.keys
|
53
74
|
end
|
54
75
|
|
55
76
|
def missing_key_abort_message(keys, opt_parser)
|
56
77
|
"Missing required options: #{keys.join(', ')}\n\n#{opt_parser}"
|
57
78
|
end
|
58
79
|
|
59
|
-
def updater(
|
60
|
-
RightBranch::Updater.new(
|
80
|
+
def updater(attrs)
|
81
|
+
RightBranch::Updater.new(attrs)
|
61
82
|
end
|
62
83
|
|
63
84
|
def build_opt_parser(options)
|
@@ -80,6 +101,10 @@ module RightBranch::Commands
|
|
80
101
|
options[:pull_request] = v
|
81
102
|
end
|
82
103
|
|
104
|
+
opts.on("-t", "--access-token ACCESS_TOKEN", "Access token") do |v|
|
105
|
+
options[:access_token] = v
|
106
|
+
end
|
107
|
+
|
83
108
|
opts.on("--password PASSWORD", "Password") do |v|
|
84
109
|
options[:password] = v
|
85
110
|
end
|
@@ -89,6 +114,7 @@ module RightBranch::Commands
|
|
89
114
|
def fallback_to_options_from_env(options)
|
90
115
|
options[:username] ||= ENV['RIGHT_BRANCH_USERNAME']
|
91
116
|
options[:repository] ||= ENV['RIGHT_BRANCH_REPOSITORY']
|
117
|
+
options[:access_token] ||= ENV['RIGHT_BRANCH_ACCESS_TOKEN']
|
92
118
|
end
|
93
119
|
end
|
94
120
|
end
|
data/lib/right_branch/updater.rb
CHANGED
@@ -2,34 +2,30 @@ require 'octokit'
|
|
2
2
|
|
3
3
|
module RightBranch
|
4
4
|
class Updater
|
5
|
-
attr_reader :
|
6
|
-
:new_branch, :repository
|
5
|
+
attr_reader :credentials, :repository
|
7
6
|
|
8
7
|
def initialize(options)
|
9
|
-
@
|
10
|
-
@
|
11
|
-
@pull_request = options.fetch(:pull_request)
|
12
|
-
@new_branch = options.fetch(:new_branch)
|
13
|
-
@repository = options.fetch(:repository)
|
8
|
+
@repository = options[:repository]
|
9
|
+
@credentials = options[:credentials]
|
14
10
|
end
|
15
11
|
|
16
|
-
def run!
|
17
|
-
|
18
|
-
|
19
|
-
update_pr(
|
20
|
-
|
12
|
+
def run!(old_pr_number, new_branch)
|
13
|
+
new_pr = resubmit_pr(old_pr_number, new_branch)
|
14
|
+
|
15
|
+
update_pr(old_pr_number, state: 'closed')
|
16
|
+
|
17
|
+
comment_on_issue old_pr_number ,
|
21
18
|
"Reopened against `#{new_branch}` (##{new_pr.number})"
|
22
19
|
end
|
23
20
|
|
24
21
|
private
|
25
22
|
|
26
23
|
def github
|
27
|
-
@github ||= Octokit::Client.new
|
28
|
-
login: username, password: password
|
24
|
+
@github ||= Octokit::Client.new(credentials)
|
29
25
|
end
|
30
26
|
|
31
|
-
def get_pr(
|
32
|
-
github.pull_request(repository,
|
27
|
+
def get_pr(pr_number)
|
28
|
+
github.pull_request(repository, pr_number)
|
33
29
|
end
|
34
30
|
|
35
31
|
def comment_on_issue(number, comment)
|
@@ -40,13 +36,15 @@ module RightBranch
|
|
40
36
|
github.update_pull_request(repository, number, args)
|
41
37
|
end
|
42
38
|
|
43
|
-
def
|
39
|
+
def resubmit_pr(old_pr_number, new_branch)
|
40
|
+
old_pr = get_pr(old_pr_number)
|
41
|
+
|
44
42
|
github.create_pull_request \
|
45
43
|
repository,
|
46
44
|
new_branch,
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
old_pr[:head][:label],
|
46
|
+
old_pr[:title],
|
47
|
+
old_pr[:body]
|
50
48
|
end
|
51
49
|
end
|
52
50
|
end
|
data/lib/right_branch/version.rb
CHANGED
@@ -73,4 +73,20 @@ describe RightBranch::Commands::ChangePullRequestTarget do
|
|
73
73
|
"Missing required options: a, b\n\nwow"
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
describe '#build_credentials' do
|
78
|
+
it 'returns access token if present' do
|
79
|
+
actual = subject.send :build_credentials,
|
80
|
+
access_token: 'omg', username: 'doge', password: 'wow'
|
81
|
+
|
82
|
+
expect(actual).to eq({ access_token: 'omg'})
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'returns username and password if no access token is present' do
|
86
|
+
actual = subject.send :build_credentials,
|
87
|
+
username: 'doge', password: 'wow'
|
88
|
+
|
89
|
+
expect(actual).to eq({ login: 'doge', password: 'wow' })
|
90
|
+
end
|
91
|
+
end
|
76
92
|
end
|
data/spec/updater_spec.rb
CHANGED
@@ -1,34 +1,62 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe RightBranch::Updater do
|
4
|
-
|
5
|
-
|
6
|
-
let(:
|
7
|
-
|
8
|
-
|
9
|
-
new_branch: 'test',
|
10
|
-
username: 'doge',
|
11
|
-
password: 'very_secure',
|
12
|
-
repository: 'foo/bar',
|
13
|
-
}
|
14
|
-
end
|
4
|
+
let(:gh) { double(:github) }
|
5
|
+
let(:repo) { 'doge/wow' }
|
6
|
+
let(:updater) { described_class.new(repository: repo) }
|
7
|
+
|
8
|
+
before { allow(updater).to receive(:github).and_return(gh) }
|
15
9
|
|
16
|
-
describe '#
|
10
|
+
describe '#resubmit_pr' do
|
17
11
|
it 'creats new pull request againts branch' do
|
18
|
-
|
12
|
+
old_pr_number = 1
|
19
13
|
title, body, label, branch = %w(title body label branch)
|
20
|
-
pr = { title: title, body: body, head: { label: label } }
|
21
|
-
|
22
|
-
allow(subject).to receive(:github).and_return(gh)
|
14
|
+
pr = { title: 'title', body: 'body', head: { label: 'label' } }
|
15
|
+
allow(updater).to receive(:get_pr).with(old_pr_number).and_return(pr)
|
23
16
|
|
24
17
|
expect(gh).to receive(:create_pull_request).with \
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
18
|
+
repo, branch, label, title, body
|
19
|
+
|
20
|
+
updater.send(:resubmit_pr, old_pr_number, branch)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#run!' do
|
25
|
+
it 'resubmits old pull request' do
|
26
|
+
old = '1'
|
27
|
+
branch = 'test'
|
28
|
+
allow(updater).to receive(:comment_on_issue)
|
29
|
+
allow(updater).to receive(:update_pr)
|
30
|
+
|
31
|
+
expect(updater).to receive(:resubmit_pr)
|
32
|
+
.with(old, branch).and_return double(number: '2')
|
33
|
+
|
34
|
+
updater.run!(old, branch)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'closes old pr' do
|
38
|
+
old = '1'
|
39
|
+
new_pr = double(:new_pr, number: '2')
|
40
|
+
allow(updater).to receive(:resubmit_pr).and_return new_pr
|
41
|
+
allow(updater).to receive(:comment_on_issue)
|
42
|
+
|
43
|
+
expect(updater).to receive(:update_pr).with \
|
44
|
+
old, state: 'closed'
|
45
|
+
|
46
|
+
updater.run!(old, 'testing')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'comment on old pr with new pr number' do
|
50
|
+
old = '1'
|
51
|
+
new_pr = double(:new_pr, number: '2')
|
52
|
+
allow(updater).to receive(:resubmit_pr).and_return new_pr
|
53
|
+
allow(updater).to receive(:update_pr)
|
54
|
+
|
55
|
+
allow(updater).to receive(:comment_on_issue).with \
|
56
|
+
old, 'Reopened against `testing` (#2)'
|
57
|
+
|
30
58
|
|
31
|
-
|
59
|
+
updater.run!(old, 'testing')
|
32
60
|
end
|
33
61
|
end
|
34
62
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: right_branch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dyego Costa
|
@@ -58,6 +58,26 @@ dependencies:
|
|
58
58
|
- - ">="
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: 3.1.0
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rake
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0.8'
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 0.8.7
|
71
|
+
type: :development
|
72
|
+
prerelease: false
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0.8'
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 0.8.7
|
61
81
|
description: If you submit a Pull Request to a wrong branch on GitHub you can use
|
62
82
|
this gem to change it
|
63
83
|
email: dyego@dyegocosta.com
|
@@ -66,6 +86,7 @@ executables:
|
|
66
86
|
extensions: []
|
67
87
|
extra_rdoc_files: []
|
68
88
|
files:
|
89
|
+
- README.md
|
69
90
|
- bin/right_branch
|
70
91
|
- lib/right_branch.rb
|
71
92
|
- lib/right_branch/commands/change_pull_request_target.rb
|