gub 0.0.14 → 0.0.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/gub +6 -4
- data/gub.gemspec +1 -0
- data/lib/gub/cli.rb +99 -70
- data/lib/gub/clients/git.rb +39 -0
- data/lib/gub/clients/github.rb +12 -2
- data/lib/gub/config.rb +30 -0
- data/lib/gub/extensions.rb +2 -8
- data/lib/gub/logger.rb +33 -0
- data/lib/gub/repository.rb +50 -9
- data/lib/gub/setup.rb +11 -0
- data/lib/gub/version.rb +1 -1
- data/lib/gub.rb +17 -20
- metadata +17 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cf46f045e6d318e334b3089a07dd110040a6c88
|
4
|
+
data.tar.gz: db36b2b231f0b26cc7516c1b36715b72b5b44942
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abe07fd50a43871dc64bcf8d8005af413083beb885417cfd7e2f0d19ef966fbe8ae0e8447a4231f3a3312c4feaaffe03e381d7b56906d09c8a0894d058b4677a
|
7
|
+
data.tar.gz: 8567de1aa0f2540500f6c4e7b86bab3ba8d11abe86c9f48a3ce0c7b4a961a36c65f294bf40023e57639982372d4354cb64215a3cc6feec2a8d017dda6e559c9f
|
data/bin/gub
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
debug = false
|
4
|
+
if ENV.include?('GUB_ENV') && ENV['GUB_ENV'] == 'development'
|
5
|
+
debug = true
|
6
|
+
$:<< File.expand_path("~/Projects/gub/lib/")
|
7
|
+
end
|
4
8
|
|
5
|
-
require 'rubygems'
|
6
9
|
require 'gub'
|
7
|
-
|
8
10
|
# Start our command line interface
|
9
|
-
Gub.start
|
11
|
+
Gub.start(debug)
|
data/gub.gemspec
CHANGED
data/lib/gub/cli.rb
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
require 'gub/version'
|
2
2
|
require 'thor'
|
3
3
|
require 'terminal-table'
|
4
|
+
require 'highline'
|
4
5
|
|
5
6
|
module Gub
|
6
7
|
class CLI < Thor
|
7
|
-
|
8
|
+
include Thor::Actions
|
9
|
+
|
10
|
+
default_task :version
|
8
11
|
|
9
12
|
desc 'publish', 'Publish a local repo to Github'
|
10
13
|
def publish
|
11
|
-
setup
|
12
14
|
end
|
13
15
|
|
14
16
|
desc 'repos', 'List Github repositories'
|
15
17
|
def repos
|
16
|
-
setup
|
17
18
|
rows = []
|
18
19
|
id = 0
|
19
20
|
Gub.github.repos.list.each do |repo|
|
@@ -26,25 +27,43 @@ module Gub
|
|
26
27
|
rows << [id, repo.full_name]
|
27
28
|
end
|
28
29
|
end
|
29
|
-
|
30
|
+
say table rows, ['#', 'Repository']
|
30
31
|
end
|
31
32
|
|
33
|
+
desc 'issue [id]', 'Show a Github issue'
|
34
|
+
def issue(id)
|
35
|
+
repository = Gub::Repository.new
|
36
|
+
issue = repository.issue(id)
|
37
|
+
rows = []
|
38
|
+
rows << ['Status:', issue.state]
|
39
|
+
rows << ['Milestone:', issue.milestone.title]
|
40
|
+
rows << ['Author:', issue.user.login]
|
41
|
+
rows << ['Assignee:', (issue.assignee.nil? ? '-' : issue.assignee.login)]
|
42
|
+
rows << ['Description:', word_wrap(issue.body, line_width: 70)]
|
43
|
+
Gub.log.info "Hint: use 'gub start #{id}' to start working on this issue."
|
44
|
+
say table rows, ["Issue ##{id}:", issue.title]
|
45
|
+
end
|
46
|
+
|
32
47
|
desc 'issues', 'List Github issues'
|
33
|
-
|
48
|
+
method_option :all, type: :boolean, aliases: '-a', desc: 'Issues in all repositories'
|
49
|
+
method_option :mine, type: :boolean, aliases: '-m', desc: 'Only issues assigned to me'
|
34
50
|
def issues
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
51
|
+
args = {}
|
52
|
+
repository = Gub::Repository.new
|
53
|
+
if options.mine
|
54
|
+
args[:assignee] = Gub.github.user.login
|
55
|
+
end
|
56
|
+
if options.all || repository.full_name.nil?
|
57
|
+
Gub.log.info "Listing issues assigned to you:"
|
58
|
+
issues = Gub.github.user_issues
|
39
59
|
else
|
40
|
-
|
41
|
-
|
42
|
-
params[:repo] = parent
|
60
|
+
if repository.has_issues?
|
61
|
+
Gub.log.info "Listing issues for #{repository.full_name}:"
|
43
62
|
else
|
44
|
-
|
63
|
+
Gub.log.info "Issues disabled #{repository.full_name}."
|
64
|
+
Gub.log.info "Listing issues for #{repository.parent}:"
|
45
65
|
end
|
46
|
-
|
47
|
-
issues = Gub.github.issues params
|
66
|
+
issues = repository.issues(args)
|
48
67
|
end
|
49
68
|
unless issues.nil?
|
50
69
|
rows = []
|
@@ -54,99 +73,109 @@ module Gub
|
|
54
73
|
row << issue.title
|
55
74
|
row << issue.user.login
|
56
75
|
row << (issue.assignee.nil? ? '' : issue.assignee.login)
|
76
|
+
row << issue.status
|
57
77
|
rows << row
|
58
78
|
end
|
59
|
-
|
60
|
-
|
61
|
-
|
79
|
+
say table rows, ['ID', 'Title', 'Author', 'Assignee', 'Status']
|
80
|
+
Gub.log.info "Found #{issues.count} issue(s)."
|
81
|
+
Gub.log.info 'Hint: use "gub start" to start working on an issue.'
|
62
82
|
end
|
63
|
-
# rescue Octokit::ClientError
|
64
|
-
# puts 'Issues are disabled for this repository.'
|
65
83
|
end
|
66
84
|
|
67
|
-
desc 'start', 'Start working on a Github issue'
|
85
|
+
desc 'start [id]', 'Start working on a Github issue'
|
68
86
|
def start id
|
69
87
|
if id.nil?
|
70
|
-
|
88
|
+
Gub.log.fatal 'Issue ID required.'
|
89
|
+
exit 1
|
71
90
|
else
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
`git checkout -b issue-#{id}`
|
91
|
+
repository = Repository.new
|
92
|
+
Gub.git.sync
|
93
|
+
repository.assign_issue id
|
94
|
+
Gub.git.checkout('-b', "issue-#{id}")
|
77
95
|
end
|
78
96
|
end
|
79
97
|
|
80
|
-
desc 'finish', 'Finish working on a Github issue'
|
98
|
+
desc 'finish [id]', 'Finish working on a Github issue'
|
81
99
|
def finish id = nil
|
82
|
-
setup
|
83
100
|
id ||= `git rev-parse --abbrev-ref HEAD`.split('-').last.to_s.chop
|
84
101
|
if id.nil?
|
85
|
-
|
102
|
+
Gub.log.fatal "Unable to guess issue ID from branch name. You might want to specify it explicitly."
|
103
|
+
exit 1
|
86
104
|
else
|
87
105
|
issue = Gub.github.issue(repo, id)
|
88
|
-
|
89
|
-
|
90
|
-
|
106
|
+
Gub.log.info 'Pushing branch...'
|
107
|
+
Gub.git.push('origin', "issue-#{id}")
|
108
|
+
Gub.log.info "Creating pull-request for issue ##{id}..."
|
91
109
|
Gub.github.create_pull_request_for_issue(repo, 'master', "#{user_name}:issue-#{id}", id)
|
92
|
-
|
110
|
+
Gub.git.checkout('master')
|
93
111
|
end
|
94
112
|
end
|
95
113
|
|
96
|
-
desc 'clone', 'Clone a Github repository'
|
114
|
+
desc 'clone [repo]', 'Clone a Github repository'
|
115
|
+
method_option :https, type: :boolean, desc: 'Use HTTPs instead of the default SSH'
|
97
116
|
def clone repo
|
98
|
-
|
117
|
+
if options.https
|
118
|
+
url = "https://github.com/#{repo}"
|
119
|
+
else
|
120
|
+
url = "git@github.com:#{repo}"
|
121
|
+
end
|
122
|
+
Gub.log.info "Cloning from #{url}..."
|
123
|
+
Gub.git.clone(url)
|
124
|
+
`cd #{repo.split('/').last}`
|
125
|
+
repository = Repository.new
|
126
|
+
repository.add_upstream
|
127
|
+
end
|
128
|
+
|
129
|
+
desc 'add_upstream', 'Add repo upstream'
|
130
|
+
def add_upstream
|
131
|
+
repository = Repository.new
|
132
|
+
repository.add_upstream
|
99
133
|
end
|
100
134
|
|
101
135
|
desc 'sync', 'Synchronize fork with upstream repository'
|
102
136
|
def sync
|
103
|
-
|
104
|
-
|
105
|
-
`git fetch -q upstream`
|
106
|
-
`git merge -q upstream/master`
|
137
|
+
Gub.log.info 'Synchroizing with upstream...'
|
138
|
+
Gub.git.sync
|
107
139
|
end
|
108
140
|
|
109
141
|
desc 'info', 'Show current respository information'
|
110
142
|
def info
|
111
143
|
repo = Gub::Repository.new
|
112
|
-
|
113
|
-
|
144
|
+
say "Github repository: #{repo.full_name}"
|
145
|
+
say "Forked from: #{repo.parent}" if repo.parent
|
146
|
+
end
|
147
|
+
|
148
|
+
desc 'setup', 'Setup Gub for the first time'
|
149
|
+
def setup
|
150
|
+
unless Gub.config.data && Gub.config.data.has_key?('token')
|
151
|
+
hl = HighLine.new
|
152
|
+
username = hl.ask 'Github username: '
|
153
|
+
password = hl.ask('Github password (we will not store this): ') { |q| q.echo = "*" }
|
154
|
+
gh = Gub::Github.new(login: username, password: password)
|
155
|
+
token = gh.create_authorization(scopes: [:user, :repo, :gist], note: 'Gub').token
|
156
|
+
Gub.config.add('token', token)
|
157
|
+
end
|
114
158
|
end
|
115
159
|
|
116
160
|
desc 'version', 'Show Gub version'
|
117
161
|
def version
|
118
|
-
|
162
|
+
say Gub::VERSION
|
119
163
|
end
|
120
164
|
|
121
165
|
|
122
166
|
private
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
if parent
|
135
|
-
name = parent
|
136
|
-
else
|
137
|
-
name = repo_full_name
|
138
|
-
end
|
139
|
-
name
|
140
|
-
end
|
141
|
-
def repo_full_name
|
142
|
-
`git remote -v | grep origin | grep fetch | awk '{print $2}' | cut -d ':' -f 2`.to_s.chop
|
143
|
-
end
|
144
|
-
def repo_name
|
145
|
-
repo_full_name.split('/').last
|
146
|
-
end
|
147
|
-
def user_name
|
148
|
-
repo_full_name.split('/').first
|
167
|
+
def table rows, header = []
|
168
|
+
Terminal::Table.new :headings => header, :rows => rows
|
169
|
+
end
|
170
|
+
|
171
|
+
# Source: https://github.com/rails/rails/actionpack/lib/action_view/helpers/text_helper.rb
|
172
|
+
def word_wrap(text, options = {})
|
173
|
+
line_width = options.fetch(:line_width, 80)
|
174
|
+
unless text.nil?
|
175
|
+
text.split("\n").collect do |line|
|
176
|
+
line.length > line_width ? line.gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip : line
|
177
|
+
end * "\n"
|
149
178
|
end
|
150
|
-
|
179
|
+
end
|
151
180
|
end
|
152
181
|
end
|
data/lib/gub/clients/git.rb
CHANGED
@@ -1,4 +1,43 @@
|
|
1
1
|
module Gub
|
2
2
|
class Git
|
3
|
+
attr_accessor :default_options
|
4
|
+
|
5
|
+
def sync
|
6
|
+
self.checkout('master')
|
7
|
+
self.fetch('upstream')
|
8
|
+
self.merge('upstream/master')
|
9
|
+
self.push('origin', '--all')
|
10
|
+
end
|
11
|
+
|
12
|
+
def remotes
|
13
|
+
`git remote -v | grep fetch | awk '{print $2}' | cut -d ':' -f 2`.split("\n").split(' ').map(&:chop)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Due to clone being a Ruby magic method, we have to override it
|
17
|
+
def clone repo, *args
|
18
|
+
self.run('clone', repo, *args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def method_missing meth, *args, &block
|
22
|
+
self.run(meth, *args)
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def run command, *args
|
27
|
+
command = command.to_s
|
28
|
+
default_options = []
|
29
|
+
default_options << '-q'
|
30
|
+
cmd = []
|
31
|
+
cmd << 'git'
|
32
|
+
cmd << command
|
33
|
+
arguments = args
|
34
|
+
unless ['clone', 'remote', 'checkout'].include?(command)
|
35
|
+
arguments = arguments.zip(default_options).flatten!
|
36
|
+
end
|
37
|
+
cmd << arguments.join(' ').to_s
|
38
|
+
cmd_line = cmd.join(' ')
|
39
|
+
Gub.log.debug "Running git command: #{cmd_line}"
|
40
|
+
`#{cmd_line}`
|
41
|
+
end
|
3
42
|
end
|
4
43
|
end
|
data/lib/gub/clients/github.rb
CHANGED
@@ -2,8 +2,18 @@ require 'octokit'
|
|
2
2
|
|
3
3
|
module Gub
|
4
4
|
class Github
|
5
|
-
|
6
|
-
|
5
|
+
attr_accessor :connection
|
6
|
+
|
7
|
+
def initialize opts
|
8
|
+
@connection = Octokit::Client.new(opts)
|
9
|
+
end
|
10
|
+
|
11
|
+
def user
|
12
|
+
@connection.user
|
13
|
+
end
|
14
|
+
|
15
|
+
def method_missing meth, *args, &block
|
16
|
+
@connection.send(meth, *args, &block)
|
7
17
|
end
|
8
18
|
end
|
9
19
|
end
|
data/lib/gub/config.rb
CHANGED
@@ -1,6 +1,36 @@
|
|
1
1
|
module Gub
|
2
2
|
class Config
|
3
|
+
attr_accessor :data
|
4
|
+
|
5
|
+
def rc
|
6
|
+
File.expand_path("~/.gubrc")
|
7
|
+
end
|
8
|
+
|
3
9
|
def initialize
|
10
|
+
read
|
11
|
+
end
|
12
|
+
|
13
|
+
def add key, value
|
14
|
+
self.data ||= {}
|
15
|
+
self.data[key] = value
|
16
|
+
self.write
|
17
|
+
end
|
18
|
+
|
19
|
+
def read
|
20
|
+
if File.exists?(self.rc)
|
21
|
+
self.data = YAML.load_file(self.rc)
|
22
|
+
else
|
23
|
+
self.data = {}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def write
|
28
|
+
puts data.inspect
|
29
|
+
File.open(self.rc, 'w') { |f| YAML.dump(self.data, f) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def method_missing meth, *args, &block
|
33
|
+
self.data[meth.to_s] if self.data && self.data.has_key?(meth.to_s)
|
4
34
|
end
|
5
35
|
end
|
6
36
|
end
|
data/lib/gub/extensions.rb
CHANGED
data/lib/gub/logger.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Gub
|
4
|
+
class Logger
|
5
|
+
attr_accessor :log
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
self.log = ::Logger.new(STDOUT)
|
9
|
+
if Gub.debug
|
10
|
+
self.log.level = ::Logger::DEBUG
|
11
|
+
else
|
12
|
+
self.log.level = ::Logger::INFO
|
13
|
+
end
|
14
|
+
self.log.formatter = proc do |severity, datetime, progname, msg|
|
15
|
+
if ['INFO'].include?(severity)
|
16
|
+
"#{msg}\n"
|
17
|
+
elsif ['FATAL'].include?(severity)
|
18
|
+
"#{severity}: #{msg}\n"
|
19
|
+
else
|
20
|
+
"#{severity} #{progname} #{datetime}: #{msg}\n"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def start_debugging
|
26
|
+
end
|
27
|
+
|
28
|
+
def method_missing meth, *args, &block
|
29
|
+
self.log.send(meth, *args, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
data/lib/gub/repository.rb
CHANGED
@@ -1,33 +1,74 @@
|
|
1
1
|
module Gub
|
2
2
|
class Repository
|
3
|
-
attr_accessor :full_name, :
|
3
|
+
attr_accessor :full_name, :info
|
4
4
|
|
5
5
|
def initialize full_name = nil
|
6
6
|
if full_name.nil?
|
7
|
-
|
7
|
+
self.full_name = `git remote -v | grep origin | grep fetch | awk '{print $2}' | cut -d ':' -f 2`.to_s.chop
|
8
8
|
else
|
9
|
-
|
9
|
+
self.full_name = full_name
|
10
10
|
end
|
11
|
-
if
|
12
|
-
|
11
|
+
if self.full_name.nil? || self.full_name.empty?
|
12
|
+
Gub.log.fatal 'Unable to find repo name'
|
13
|
+
exit 1
|
13
14
|
else
|
14
|
-
|
15
|
+
Gub.log.debug "Loading information for #{self.full_name}"
|
16
|
+
@info = Gub.github.repo(repo: self.full_name)
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
18
|
-
def
|
19
|
-
|
20
|
+
def name
|
21
|
+
@full_name.split('/').last
|
22
|
+
end
|
23
|
+
|
24
|
+
def has_issues?
|
25
|
+
self.info.has_issues
|
26
|
+
end
|
27
|
+
|
28
|
+
def issues params = {}
|
29
|
+
issues = []
|
30
|
+
issues << Gub.github.issues(self.full_name, params) if self.has_issues?
|
31
|
+
issues << Gub.github.issues(self.parent, params)
|
32
|
+
issues.flatten!
|
33
|
+
end
|
34
|
+
|
35
|
+
def issue id
|
36
|
+
if self.has_issues?
|
37
|
+
Gub.github.issue(self.full_name, id)
|
38
|
+
else
|
39
|
+
Gub.github.issue(self.parent, id)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def assign_issue id, login = nil
|
44
|
+
issue = self.issue(id)
|
45
|
+
assignee = login || Gub.github.user.login
|
46
|
+
if self.has_issues?
|
47
|
+
name = self.full_name
|
48
|
+
else
|
49
|
+
name = self.parent
|
50
|
+
end
|
51
|
+
Gub.github.update_issue name, issue.number, issue.title, issue.body, { assignee: assignee }
|
20
52
|
end
|
21
53
|
|
22
54
|
def owner
|
23
55
|
@full_name.split('/').first
|
24
56
|
end
|
25
57
|
|
58
|
+
def add_upstream
|
59
|
+
Gub.git.remote('add', 'upstream', "https://github.com/#{self.parent}")
|
60
|
+
end
|
61
|
+
|
26
62
|
def is_fork?
|
63
|
+
self.info.fork
|
27
64
|
end
|
28
65
|
|
29
66
|
def parent
|
30
|
-
|
67
|
+
self.info.parent.full_name if self.info.parent
|
68
|
+
end
|
69
|
+
|
70
|
+
def sync
|
71
|
+
Gub.git.sync('upstream')
|
31
72
|
end
|
32
73
|
end
|
33
74
|
end
|
data/lib/gub/setup.rb
ADDED
data/lib/gub/version.rb
CHANGED
data/lib/gub.rb
CHANGED
@@ -6,28 +6,25 @@ require 'gub/clients/git'
|
|
6
6
|
require 'gub/clients/github'
|
7
7
|
require 'gub/repository'
|
8
8
|
require 'gub/cli'
|
9
|
+
require 'gub/config'
|
10
|
+
require 'gub/logger'
|
9
11
|
|
10
12
|
module Gub
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
13
|
+
# TODO: Understand this
|
14
|
+
class << self
|
15
|
+
attr_accessor :debug, :log, :config, :git, :github
|
16
|
+
|
17
|
+
def start debug
|
18
|
+
@debug = debug
|
19
|
+
# Initialize log first
|
20
|
+
@log = Gub::Logger.new
|
21
|
+
# Now load the congiuration
|
22
|
+
@config = Gub::Config.new
|
23
|
+
# The rest of stuff
|
24
|
+
@git = Gub::Git.new
|
25
|
+
@github = Gub::Github.new(access_token: self.config.token)
|
26
|
+
# Invoke our CLI
|
27
|
+
Gub::CLI.start
|
23
28
|
end
|
24
|
-
# @@git = Gub::Git.new
|
25
|
-
Gub::CLI.start
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.github
|
29
|
-
Gub::Github.new(@@config['token'])
|
30
29
|
end
|
31
|
-
|
32
|
-
|
33
30
|
end
|
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.0.
|
4
|
+
version: 0.0.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Omar Abdel-Wahab
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: highline
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
description: 'Warning: Heavily Under Development, Still in early alpha'
|
98
112
|
email:
|
99
113
|
- owahab@gmail.com
|
@@ -116,7 +130,9 @@ files:
|
|
116
130
|
- lib/gub/clients/github.rb
|
117
131
|
- lib/gub/config.rb
|
118
132
|
- lib/gub/extensions.rb
|
133
|
+
- lib/gub/logger.rb
|
119
134
|
- lib/gub/repository.rb
|
135
|
+
- lib/gub/setup.rb
|
120
136
|
- lib/gub/version.rb
|
121
137
|
homepage: ''
|
122
138
|
licenses:
|