gub 0.1.5 → 0.2.0
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.
- checksums.yaml +4 -4
- data/gub.gemspec +1 -0
- data/lib/gub.rb +6 -1
- data/lib/gub/cli.rb +77 -29
- data/lib/gub/clients/git.rb +3 -3
- data/lib/gub/clients/github.rb +7 -0
- data/lib/gub/exceptions.rb +1 -0
- data/lib/gub/issue.rb +53 -0
- data/lib/gub/repository.rb +15 -30
- data/lib/gub/version.rb +1 -1
- metadata +16 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63cc87efc78a3425e09f29cd40ee3cef3daa98a3
|
4
|
+
data.tar.gz: 89f6490382d896b46dcf7c534ee39ae253132e7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c0e6e656618166ea72b59b6a941e8ce271709de66829b307a07a16a470a04fa6190648693dc7174ba4d0ba61bedd5144510dcb49e87a55b2c4f8723041f4b6c
|
7
|
+
data.tar.gz: 31e157be199547fbc78c7ec5982c43cca2a7ec217df3bb46bb6802a4c34632ce1b8a50ed5bd19aff37187592462b670be6e05f2f928c051f0bebe59489afc993
|
data/gub.gemspec
CHANGED
data/lib/gub.rb
CHANGED
@@ -5,12 +5,13 @@ require 'gub/version'
|
|
5
5
|
require 'gub/clients/git'
|
6
6
|
require 'gub/clients/github'
|
7
7
|
require 'gub/repository'
|
8
|
+
require 'gub/issue'
|
8
9
|
require 'gub/cli'
|
9
10
|
require 'gub/config'
|
10
11
|
require 'gub/logger'
|
11
12
|
|
12
13
|
module Gub
|
13
|
-
# TODO: Understand
|
14
|
+
# TODO: Understand the following code
|
14
15
|
class << self
|
15
16
|
attr_accessor :debug, :log, :config, :git, :github
|
16
17
|
|
@@ -26,5 +27,9 @@ module Gub
|
|
26
27
|
# Invoke our CLI
|
27
28
|
Gub::CLI.start
|
28
29
|
end
|
30
|
+
|
31
|
+
def current_user
|
32
|
+
@github.user.login
|
33
|
+
end
|
29
34
|
end
|
30
35
|
end
|
data/lib/gub/cli.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'gub/version'
|
2
1
|
require 'thor'
|
3
2
|
require 'terminal-table'
|
4
3
|
require 'highline'
|
@@ -31,22 +30,51 @@ module Gub
|
|
31
30
|
puts table
|
32
31
|
rescue Gub::Unauthorized
|
33
32
|
reauthorize
|
33
|
+
rescue Gub::Disconnected
|
34
|
+
panic 'Unable to connect to Github'
|
35
|
+
end
|
36
|
+
|
37
|
+
desc 'browse', 'Browse current repository'
|
38
|
+
def browse
|
39
|
+
repository = Gub::Repository.new(origin_name)
|
40
|
+
repository.browse
|
34
41
|
end
|
35
42
|
|
36
|
-
desc 'issue [id]', 'Show a Github issue'
|
43
|
+
desc 'issue [id]', 'Show or edit a Github issue'
|
44
|
+
method_option :assign, type: :boolean, aliases: '-i', desc: 'Assign the issue'
|
45
|
+
method_option :comment, type: :string, aliases: '-m', desc: 'Add a comment to the issue'
|
46
|
+
method_option :close, type: :boolean, aliases: '-c', desc: 'Close the issue'
|
47
|
+
method_option :reopen, type: :boolean, aliases: '-r', desc: 'Reopen the issue'
|
37
48
|
def issue(id)
|
38
|
-
repository = Gub::Repository.new
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
49
|
+
repository = Gub::Repository.new(origin_name)
|
50
|
+
if options.comment
|
51
|
+
repository.issue(id).comment(options.comment)
|
52
|
+
elsif options.close
|
53
|
+
repository.issue(id).close
|
54
|
+
elsif options.assign
|
55
|
+
repository.issue(id).assign
|
56
|
+
elsif options.reopen
|
57
|
+
repository.issue(id).reopen
|
58
|
+
else
|
59
|
+
issue = repository.issue(id)
|
60
|
+
rows = []
|
61
|
+
rows << ['Status:', issue.state]
|
62
|
+
rows << ['Milestone:', issue.milestone.title]
|
63
|
+
rows << ['Author:', issue.user.login]
|
64
|
+
rows << ['Assignee:', (issue.assignee.nil? ? '-' : issue.assignee.login)]
|
65
|
+
rows << ['Description:', word_wrap(issue.body, line_width: 70)]
|
66
|
+
comments = []
|
67
|
+
issue.comments.each do |comment|
|
68
|
+
comments << [comment.user.login, "On #{comment.updated_at}: #{comment.body}"]
|
69
|
+
end
|
70
|
+
Gub.log.info "Hint: use 'gub start #{id}' to start working on this issue."
|
71
|
+
puts table rows, ["Issue ##{id}:", issue.title]
|
72
|
+
puts table comments, ['', 'Comments']
|
73
|
+
end
|
48
74
|
rescue Gub::Unauthorized
|
49
75
|
reauthorize
|
76
|
+
rescue Gub::Disconnected
|
77
|
+
panic 'Unable to connect to Github'
|
50
78
|
end
|
51
79
|
|
52
80
|
desc 'issues', 'List Github issues'
|
@@ -54,7 +82,7 @@ module Gub
|
|
54
82
|
method_option :mine, type: :boolean, aliases: '-m', desc: 'Only issues assigned to me'
|
55
83
|
def issues
|
56
84
|
args = {}
|
57
|
-
repository = Gub::Repository.new
|
85
|
+
repository = Gub::Repository.new(origin_name)
|
58
86
|
if options.all || repository.full_name.nil?
|
59
87
|
say "Listing all issues:"
|
60
88
|
issues = Gub.github.user_issues
|
@@ -87,6 +115,8 @@ module Gub
|
|
87
115
|
end
|
88
116
|
rescue Gub::Unauthorized
|
89
117
|
reauthorize
|
118
|
+
rescue Gub::Disconnected
|
119
|
+
panic 'Unable to connect to Github'
|
90
120
|
end
|
91
121
|
|
92
122
|
desc 'start [id]', 'Start working on a Github issue'
|
@@ -94,18 +124,21 @@ module Gub
|
|
94
124
|
if id.nil?
|
95
125
|
panic 'Issue ID required.'
|
96
126
|
else
|
97
|
-
|
98
|
-
|
99
|
-
|
127
|
+
repository = Repository.new(origin_name)
|
128
|
+
issue = repository.issue(id)
|
129
|
+
if repository.branches.include?(issue.branch)
|
130
|
+
Gub.git.checkout(issue.branch)
|
100
131
|
else
|
101
|
-
repository = Repository.new
|
102
|
-
|
103
|
-
|
104
|
-
Gub.git.checkout('-b', branch)
|
132
|
+
repository = Repository.new(origin_name)
|
133
|
+
repository.sync
|
134
|
+
issue.assign
|
135
|
+
Gub.git.checkout('-b', issue.branch)
|
105
136
|
end
|
106
137
|
end
|
107
138
|
rescue Gub::Unauthorized
|
108
139
|
reauthorize
|
140
|
+
rescue Gub::Disconnected
|
141
|
+
panic 'Unable to connect to Github'
|
109
142
|
end
|
110
143
|
|
111
144
|
desc 'finish [id]', 'Finish working on a Github issue'
|
@@ -114,15 +147,18 @@ module Gub
|
|
114
147
|
if id.nil?
|
115
148
|
panic "Unable to guess issue ID from branch name. You might want to specify it explicitly."
|
116
149
|
else
|
117
|
-
repository = Repository.new
|
118
|
-
|
119
|
-
|
120
|
-
Gub.
|
121
|
-
|
150
|
+
repository = Repository.new(origin_name)
|
151
|
+
issue = repository.issue(id)
|
152
|
+
say 'Pushing branch...'
|
153
|
+
Gub.git.push('origin', issue.branch)
|
154
|
+
say "Creating pull-request for issue ##{id}..."
|
155
|
+
issue.request_pull
|
122
156
|
Gub.git.checkout('master')
|
123
157
|
end
|
124
158
|
rescue Gub::Unauthorized
|
125
159
|
reauthorize
|
160
|
+
rescue Gub::Disconnected
|
161
|
+
panic 'Unable to connect to Github'
|
126
162
|
end
|
127
163
|
|
128
164
|
desc 'clone [repo]', 'Clone a Github repository'
|
@@ -136,35 +172,43 @@ module Gub
|
|
136
172
|
Gub.log.info "Cloning from #{url}..."
|
137
173
|
Gub.git.clone(url)
|
138
174
|
`cd #{repo.split('/').last}`
|
139
|
-
repository = Repository.new
|
175
|
+
repository = Gub::Repository.new(origin_name)
|
140
176
|
repository.add_upstream
|
141
177
|
rescue Gub::Unauthorized
|
142
178
|
reauthorize
|
179
|
+
rescue Gub::Disconnected
|
180
|
+
panic 'Unable to connect to Github'
|
143
181
|
end
|
144
182
|
|
145
183
|
desc 'add_upstream', 'Add repo upstream'
|
146
184
|
def add_upstream
|
147
|
-
repository = Repository.new
|
185
|
+
repository = Gub::Repository.new(origin_name)
|
148
186
|
repository.add_upstream
|
149
187
|
rescue Gub::Unauthorized
|
150
188
|
reauthorize
|
189
|
+
rescue Gub::Disconnected
|
190
|
+
panic 'Unable to connect to Github'
|
151
191
|
end
|
152
192
|
|
153
193
|
desc 'sync', 'Synchronize fork with upstream repository'
|
154
194
|
def sync
|
155
195
|
Gub.log.info 'Synchroizing with upstream...'
|
156
|
-
Gub.
|
196
|
+
Gub::Repository.new(origin_name).sync
|
157
197
|
rescue Gub::Unauthorized
|
158
198
|
reauthorize
|
199
|
+
rescue Gub::Disconnected
|
200
|
+
panic 'Unable to connect to Github'
|
159
201
|
end
|
160
202
|
|
161
203
|
desc 'info', 'Show current respository information'
|
162
204
|
def info
|
163
|
-
repo = Gub::Repository.new
|
205
|
+
repo = Gub::Repository.new(origin_name)
|
164
206
|
say "Github repository: #{repo.full_name}"
|
165
207
|
say "Forked from: #{repo.parent}" if repo.parent
|
166
208
|
rescue Gub::Unauthorized
|
167
209
|
reauthorize
|
210
|
+
rescue Gub::Disconnected
|
211
|
+
panic 'Unable to connect to Github'
|
168
212
|
end
|
169
213
|
|
170
214
|
desc 'setup', 'Setup Gub for the first time'
|
@@ -196,6 +240,10 @@ module Gub
|
|
196
240
|
end
|
197
241
|
|
198
242
|
private
|
243
|
+
def origin_name
|
244
|
+
`git remote -v | grep origin | grep fetch | awk '{print $2}' | cut -d ':' -f 2`.to_s
|
245
|
+
end
|
246
|
+
|
199
247
|
def table rows, header = []
|
200
248
|
Terminal::Table.new headings: header, rows: rows
|
201
249
|
end
|
data/lib/gub/clients/git.rb
CHANGED
@@ -4,10 +4,10 @@ module Gub
|
|
4
4
|
class Git
|
5
5
|
attr_accessor :default_options
|
6
6
|
|
7
|
-
def sync
|
7
|
+
def sync remote
|
8
8
|
self.checkout('master')
|
9
|
-
self.fetch(
|
10
|
-
self.merge(
|
9
|
+
self.fetch(remote)
|
10
|
+
self.merge("#{remote}/master")
|
11
11
|
self.push('origin', '--all')
|
12
12
|
end
|
13
13
|
|
data/lib/gub/clients/github.rb
CHANGED
@@ -9,14 +9,21 @@ module Gub
|
|
9
9
|
@connection = Octokit::Client.new(opts)
|
10
10
|
end
|
11
11
|
|
12
|
+
def url
|
13
|
+
'https://github.com/'
|
14
|
+
end
|
15
|
+
|
12
16
|
def user
|
13
17
|
@connection.user
|
14
18
|
end
|
15
19
|
|
16
20
|
def method_missing meth, *args, &block
|
21
|
+
Gub.log.debug "Running command #{meth} with arguments #{args}"
|
17
22
|
@connection.send(meth, *args, &block)
|
18
23
|
rescue Octokit::Unauthorized, Octokit::NotFound
|
19
24
|
raise Gub::Unauthorized
|
25
|
+
rescue Faraday::Error::ConnectionFailed
|
26
|
+
raise Gub::Disconnected
|
20
27
|
end
|
21
28
|
end
|
22
29
|
end
|
data/lib/gub/exceptions.rb
CHANGED
data/lib/gub/issue.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
module Gub
|
2
|
+
class Issue
|
3
|
+
attr_accessor :parent, :id, :info
|
4
|
+
|
5
|
+
|
6
|
+
def self.all parent, params = {}
|
7
|
+
Gub.github.issues(parent params)
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize parent, id
|
11
|
+
self.parent = parent
|
12
|
+
self.id = id
|
13
|
+
self.info = Gub.github.issue(self.parent, self.id)
|
14
|
+
end
|
15
|
+
|
16
|
+
def repository
|
17
|
+
Gub::Repository.new(self.parent)
|
18
|
+
end
|
19
|
+
|
20
|
+
def reopen
|
21
|
+
Gub.github.reopen_issue(self.parent, self.id)
|
22
|
+
end
|
23
|
+
|
24
|
+
def close
|
25
|
+
Gub.github.close_issue(self.parent, self.id)
|
26
|
+
end
|
27
|
+
|
28
|
+
def comment body
|
29
|
+
Gub.github.add_comment(self.parent, self.id, body)
|
30
|
+
end
|
31
|
+
|
32
|
+
def comments
|
33
|
+
Gub.github.issue_comments(self.parent, self.id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def assignee
|
37
|
+
self.info[:user]
|
38
|
+
end
|
39
|
+
|
40
|
+
def assign login = nil
|
41
|
+
assignee = login || Gub.github.user.login
|
42
|
+
Gub.github.update_issue self.parent, self.id, self.info[:title], self.info[:body], { assignee: assignee }
|
43
|
+
end
|
44
|
+
|
45
|
+
def branch
|
46
|
+
"issue-#{self.id}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def request_pull
|
50
|
+
Gub.github.create_pull_request_for_issue(self.parent, 'master', "#{Gub.current_user}:#{self.branch}", self.id)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/gub/repository.rb
CHANGED
@@ -2,12 +2,8 @@ module Gub
|
|
2
2
|
class Repository
|
3
3
|
attr_accessor :full_name, :info
|
4
4
|
|
5
|
-
def initialize full_name
|
6
|
-
|
7
|
-
self.full_name = `git remote -v | grep origin | grep fetch | awk '{print $2}' | cut -d ':' -f 2`.to_s.chop
|
8
|
-
else
|
9
|
-
self.full_name = full_name
|
10
|
-
end
|
5
|
+
def initialize full_name
|
6
|
+
self.full_name = full_name
|
11
7
|
# Strip .git from the name
|
12
8
|
self.full_name = self.full_name.split('.').first
|
13
9
|
if self.full_name.nil? || self.full_name.empty?
|
@@ -15,12 +11,12 @@ module Gub
|
|
15
11
|
exit 1
|
16
12
|
else
|
17
13
|
Gub.log.debug "Loading information for #{self.full_name}"
|
18
|
-
|
14
|
+
self.info = Gub.github.repo(repo: self.full_name)
|
19
15
|
end
|
20
16
|
end
|
21
17
|
|
22
18
|
def name
|
23
|
-
|
19
|
+
self.full_name.split('/').last
|
24
20
|
end
|
25
21
|
|
26
22
|
def has_issues?
|
@@ -34,33 +30,13 @@ module Gub
|
|
34
30
|
issues.flatten!
|
35
31
|
end
|
36
32
|
|
37
|
-
def issue id
|
38
|
-
if self.has_issues?
|
39
|
-
Gub.github.issue(self.full_name, id)
|
40
|
-
else
|
41
|
-
Gub.github.issue(self.parent, id)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def assign_issue id, login = nil
|
46
|
-
issue = self.issue(id)
|
47
|
-
assignee = login || Gub.github.user.login
|
33
|
+
def issue id, action = :fetch, extra_args = nil
|
48
34
|
if self.has_issues?
|
49
35
|
name = self.full_name
|
50
36
|
else
|
51
37
|
name = self.parent
|
52
38
|
end
|
53
|
-
Gub.
|
54
|
-
end
|
55
|
-
|
56
|
-
def issue_pull_request id
|
57
|
-
issue = self.issue(id)
|
58
|
-
if self.has_issues?
|
59
|
-
repo = self.full_name
|
60
|
-
else
|
61
|
-
repo = self.parent
|
62
|
-
end
|
63
|
-
Gub.github.create_pull_request_for_issue(repo, 'master', "#{self.owner}:issue-#{id}", id)
|
39
|
+
Gub::Issue.new(name, id)
|
64
40
|
end
|
65
41
|
|
66
42
|
def owner
|
@@ -82,5 +58,14 @@ module Gub
|
|
82
58
|
def sync
|
83
59
|
Gub.git.sync('upstream')
|
84
60
|
end
|
61
|
+
|
62
|
+
def branches
|
63
|
+
Gub.git.branch()
|
64
|
+
end
|
65
|
+
|
66
|
+
def browse
|
67
|
+
require 'launchy'
|
68
|
+
::Launchy.open("#{Gub.github.url}#{self.full_name}")
|
69
|
+
end
|
85
70
|
end
|
86
71
|
end
|
data/lib/gub/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Omar Abdel-Wahab
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: launchy
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
description: The missing command line tool for Github
|
112
126
|
email:
|
113
127
|
- owahab@gmail.com
|
@@ -131,6 +145,7 @@ files:
|
|
131
145
|
- lib/gub/config.rb
|
132
146
|
- lib/gub/exceptions.rb
|
133
147
|
- lib/gub/extensions.rb
|
148
|
+
- lib/gub/issue.rb
|
134
149
|
- lib/gub/logger.rb
|
135
150
|
- lib/gub/repository.rb
|
136
151
|
- lib/gub/setup.rb
|