github-pr 0.0.2

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.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/bin/github-pr +5 -0
  3. data/lib/github-pr.rb +129 -0
  4. metadata +46 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f9aaddbb357cd774244bccf74c7a7475e36441e5
4
+ data.tar.gz: 132b9061387599d88f52c0aba2624482a3a2fdc1
5
+ SHA512:
6
+ metadata.gz: 419b05b119119d3d976f74eb05591cfe72262aa3ded6efc2a81ace57ef683546d7a3c17e0e3ff9eb9484b6705d22286c264d61b8934abe88b807ab5da89f355c
7
+ data.tar.gz: b99f5f812d788b077e55fe9072edd2889749038e4dfbddac2490cb5d5a07a74f8fe1e3cfba7a1a61326f84bcd2529b9295d76c397f3edba6015736f25b88fb32
data/bin/github-pr ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'github-pr'
4
+
5
+ GitHubPr::create
data/lib/github-pr.rb ADDED
@@ -0,0 +1,129 @@
1
+ require 'octokit'
2
+ require 'highline'
3
+ require 'uri'
4
+ require 'pp'
5
+ require 'fileutils'
6
+ require 'optparse'
7
+
8
+
9
+ module GitHubPr
10
+
11
+ def self.github_token(regenerate: regenerate = false)
12
+ token_file_path = File.expand_path '~/.config/gh-pr-token'
13
+
14
+ token_dir = File.dirname(token_file_path)
15
+ unless File.directory?(token_dir)
16
+ FileUtils.mkdir_p(token_dir)
17
+ end
18
+
19
+ if regenerate
20
+ FileUtils.rm(token_file_path)
21
+ end
22
+
23
+ token = nil
24
+ if File.exists? token_file_path
25
+ token = IO.read(token_file_path)
26
+ else
27
+ cli = HighLine.new
28
+
29
+ github_username = cli.ask("GitHub Username: ")
30
+ github_password = cli.ask("GitHub Password(Only one time): ") { |q| q.echo = "*" }
31
+
32
+ client = Octokit::Client.new(:login => github_username, :password => github_password)
33
+
34
+ note = 'CLI uses'
35
+ limit_reached = false
36
+ # trying 9 different notes, if all is failed,
37
+ # then you have to remove some of them
38
+ 9.times do |i|
39
+ begin
40
+ token = client.create_authorization(:scopes => ["repo", "user"], :note => note)[:token]
41
+ break
42
+ rescue Exception => e
43
+ if i == 8
44
+ raise 'Please remove some personal tokens from your github account, you have too many tokens'
45
+ end
46
+ if e.errors[0][:code] != "already_exists" || e.errors[0][:field] != "description"
47
+ raise e
48
+ else
49
+ note = 'CLI uses' + (i + 2).to_s
50
+ end
51
+ end
52
+ end
53
+
54
+ File.open(token_file_path, 'w+') {|file| file.write token}
55
+ end
56
+ return token
57
+ end
58
+
59
+
60
+ def self.create
61
+ options = {}
62
+ OptionParser.new do |opts|
63
+ opts.banner = "Usage: github-pr -b master -f shop-redesign -a hovox"
64
+ opts.separator ""
65
+ opts.separator "Your current directory must be your git directory"
66
+ opts.separator "github-pr -b master -a hovox"
67
+ opts.separator "Will use current branch as feature branch"
68
+ opts.separator ""
69
+ opts.separator "github-pr -a hovox"
70
+ opts.separator "Will use master branch as base branch and current branch as feature branch"
71
+ opts.separator ""
72
+ opts.separator "Command should be run from project's directory"
73
+
74
+
75
+ opts.on("-b", "--base BASE", "Base branch") do |b|
76
+ options[:base] = b
77
+ end
78
+ opts.on("-f", "--feature FEATURE", "Feature branch") do |f|
79
+ options[:feature] = f
80
+ end
81
+ opts.on("-a", "--assign USERNAME", "GitHub user name whom to assign") do |a|
82
+ options[:assign] = a
83
+ end
84
+ opts.on("-t", "--title PULLREQUESTTITLE", "Title of the pull request") do |t|
85
+ options[:title] = t
86
+ end
87
+ end.parse!
88
+
89
+ raise 'You must assign to someone' if options[:assign].nil?
90
+ if options[:base].nil?
91
+ options[:base] = 'master'
92
+ end
93
+
94
+ # https://github.com/user/reponame cutting path user/reponame
95
+ repo_url = `git config --get remote.origin.url`.chomp
96
+ repo = URI::parse(repo_url).path[1..-1]
97
+
98
+ # e.g. * master cutting '* ' from begining
99
+ if options[:feature].nil?
100
+ options[:feature] = `git branch | grep "^*"`.chomp[2..-1]
101
+ end
102
+ if options[:title].nil?
103
+ options[:title] = options[:feature]
104
+ end
105
+
106
+ puts options
107
+
108
+ client = Octokit::Client.new(:access_token => github_token())
109
+ begin
110
+ pull_request = client.create_pull_request(repo,
111
+ options[:base],
112
+ options[:feature],
113
+ options[:title], nil)
114
+ rescue Octokit::Unauthorized => e
115
+ client = Octokit::Client.new(:access_token => github_token(regenerate: true))
116
+ pull_request = client.create_pull_request(repo,
117
+ options[:base],
118
+ options[:feature],
119
+ options[:title], nil)
120
+ end
121
+ client.post("/repos/#{repo}/issues/#{pull_request['number']}/assignees",
122
+ assignees: [options[:assign]])
123
+ end
124
+
125
+ end
126
+
127
+
128
+
129
+
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: github-pr
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Hovhannes Safaryan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-12-10 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Create GitHub pull request and assign from termianl
14
+ email: hovhannes.safaryan@gmail.com
15
+ executables:
16
+ - github-pr
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/github-pr
21
+ - lib/github-pr.rb
22
+ homepage: http://rubygems.org/gems/github-pr
23
+ licenses:
24
+ - MIT
25
+ metadata: {}
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubyforge_project:
42
+ rubygems_version: 2.5.1
43
+ signing_key:
44
+ specification_version: 4
45
+ summary: Pull request with and assign with one command
46
+ test_files: []