gpr 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 +58 -1
- data/lib/colorize.rb +43 -0
- data/lib/gpr.rb +4 -2
- data/lib/gpr/cli.rb +53 -14
- data/lib/gpr/git_helper.rb +43 -0
- data/lib/gpr/version.rb +1 -1
- data/lib/table_builder.rb +23 -0
- data/lib/table_builder/column.rb +16 -0
- data/lib/table_builder/column_validator.rb +9 -0
- data/lib/table_builder/row.rb +13 -0
- data/lib/table_builder/table.rb +81 -0
- data/zsh/gpr.zsh +9 -0
- metadata +10 -5
- data/lib/extends/colorize.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f91a087109c606f02532188032e4f9416afc3340
|
4
|
+
data.tar.gz: a3969ac73df86f4a3dc19a359da39a92321d9bae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d24746135344420454173fd37dd83c9c9671917316d8a83d236b760808491edbdd17cfde358186a03dd8ca012bf0e6f60fb89ea51e2937a69404ea467d4f5d1
|
7
|
+
data.tar.gz: d0c52d99232833be53e494eda4c5a1fe582876edca14895f5ee96cfa42e974676c0704ce5f0d2e0e00bdb8f5114b4611118d7731a9c7d385f0e8fb8970a2035f
|
data/README.md
CHANGED
@@ -44,6 +44,28 @@ $ gpr get <host>/<user>
|
|
44
44
|
|
45
45
|
```sh
|
46
46
|
$ gpr list
|
47
|
+
|
48
|
+
github.com - kaihar4/dotfiles
|
49
|
+
github.com - kaihar4/gpr
|
50
|
+
|
51
|
+
$ gpr list --paths
|
52
|
+
|
53
|
+
/home/kaihara/.gpr/github.com/kaihar4/dotfiles
|
54
|
+
/home/kaihara/.gpr/github.com/kaihar4/gpr
|
55
|
+
```
|
56
|
+
|
57
|
+
### Show the status of all registered repositories
|
58
|
+
|
59
|
+
```sh
|
60
|
+
$ gpr status
|
61
|
+
|
62
|
+
+-----------------+------------------------------------------+---------------------------+
|
63
|
+
| REPOSITORY NAME | BRANCH STATUS | DIRECTORY STATUS |
|
64
|
+
+-----------------+------------------------------------------+---------------------------+
|
65
|
+
| dotfiles | up-to-date with 'origin/master' | Working directory clean |
|
66
|
+
+-----------------+------------------------------------------+---------------------------+
|
67
|
+
| gpr | ahead of 'origin/master' by 1 commit | Exist unstaged changes |
|
68
|
+
+-----------------+------------------------------------------+---------------------------+
|
47
69
|
```
|
48
70
|
|
49
71
|
### Search the specified keyword in registered repositories
|
@@ -63,7 +85,42 @@ Search the specified keyword in registered repositories
|
|
63
85
|
```
|
64
86
|
|
65
87
|
```sh
|
66
|
-
$ gpr search
|
88
|
+
$ gpr search 'net/http'
|
89
|
+
|
90
|
+
github.com - kaihar4/gpr : lib/gpr.rb
|
91
|
+
github.com - kaihar4/kaihar4.com : source/articles/2014-06-29-mechanize-scraping.md
|
92
|
+
|
93
|
+
$ gpr search 'net/http' -f '.rb'
|
94
|
+
|
95
|
+
github.com - kaihar4/gpr : lib/gpr.rb
|
96
|
+
|
97
|
+
$ gpr search 'net/http' -r 'kaihar4/kaihar4.com'
|
98
|
+
|
99
|
+
github.com - kaihar4/kaihar4.com : source/articles/2014-06-29-mechanize-scraping.md
|
100
|
+
```
|
101
|
+
|
102
|
+
### Update the database to be used for search
|
103
|
+
|
104
|
+
```sh
|
105
|
+
$ gpr update
|
106
|
+
```
|
107
|
+
|
108
|
+
### Fetch all registered repositories
|
109
|
+
|
110
|
+
```sh
|
111
|
+
$ gpr fetch remote_repo
|
112
|
+
```
|
113
|
+
|
114
|
+
If you run for short, it means `gpr fetch origin`.
|
115
|
+
|
116
|
+
```sh
|
117
|
+
$ gpr fetch
|
118
|
+
```
|
119
|
+
|
120
|
+
## Change the directory to be cloned
|
121
|
+
|
122
|
+
```sh
|
123
|
+
$ export GPR_ROOT=$HOME/develop
|
67
124
|
```
|
68
125
|
|
69
126
|
## Install the zsh completion
|
data/lib/colorize.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module Colorize
|
2
|
+
refine String do
|
3
|
+
COLORS = {
|
4
|
+
black: 0,
|
5
|
+
red: 1,
|
6
|
+
green: 2,
|
7
|
+
yellow: 3,
|
8
|
+
blue: 4,
|
9
|
+
magenta: 5,
|
10
|
+
cyan: 6,
|
11
|
+
white: 7
|
12
|
+
}
|
13
|
+
|
14
|
+
STYLES = {
|
15
|
+
reset: 0,
|
16
|
+
bold: 1,
|
17
|
+
underscore: 4,
|
18
|
+
blink: 5,
|
19
|
+
reverse: 6,
|
20
|
+
concealed: 7
|
21
|
+
}
|
22
|
+
|
23
|
+
def color(color)
|
24
|
+
to_ansi("3#{COLORS[color]}")
|
25
|
+
end
|
26
|
+
|
27
|
+
def bg_color(color)
|
28
|
+
to_ansi("4#{COLORS[color]}")
|
29
|
+
end
|
30
|
+
|
31
|
+
def style(style)
|
32
|
+
to_ansi(STYLES[style])
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_ansi(code)
|
36
|
+
"\e[#{code.to_i}m#{self}\e[0m"
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_pure
|
40
|
+
gsub(/\x1B\[[0-9]{1,3}[mK]/, '')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/gpr.rb
CHANGED
@@ -6,12 +6,14 @@ require 'find'
|
|
6
6
|
require 'thor'
|
7
7
|
require 'groonga'
|
8
8
|
|
9
|
-
require '
|
9
|
+
require 'colorize'
|
10
|
+
require 'table_builder'
|
10
11
|
require 'gpr/version'
|
11
12
|
require 'gpr/api_helper'
|
13
|
+
require 'gpr/git_helper'
|
12
14
|
require 'gpr/cli'
|
13
15
|
|
14
16
|
module Gpr
|
15
|
-
APP_PATH = "#{ENV['HOME']}/.gpr"
|
17
|
+
APP_PATH = ENV['GPR_ROOT'] || "#{ENV['HOME']}/.gpr"
|
16
18
|
DB_PATH = "#{APP_PATH}/.database"
|
17
19
|
end
|
data/lib/gpr/cli.rb
CHANGED
@@ -1,31 +1,34 @@
|
|
1
1
|
module Gpr
|
2
2
|
class CLI < Thor
|
3
|
+
using Colorize
|
4
|
+
include TableBuilder
|
5
|
+
|
3
6
|
desc 'get', 'Get a repository'
|
4
7
|
def get(param)
|
5
8
|
case param
|
6
9
|
when /.+(\/\/|@)(.+)\.git$/
|
7
10
|
host, user, repository =
|
8
11
|
param.match(/.+(\/\/|@)(.+)\.git$/)[2].split(/(:|\/)/).delete_if.with_index { |_c, index| index.odd? }
|
12
|
+
path = "#{APP_PATH}/#{host}/#{user}/#{repository}"
|
9
13
|
|
10
|
-
if Dir.exist?(
|
14
|
+
if Dir.exist?(path)
|
11
15
|
puts "#{user}/#{repository} is already registered."
|
12
16
|
return
|
13
17
|
end
|
14
18
|
|
15
19
|
puts "#{user}/#{repository} is registering..."
|
16
|
-
unless
|
20
|
+
unless GitHelper.clone(param, path)
|
17
21
|
puts "Failed to clone #{user}/#{repository}."
|
18
22
|
return
|
19
23
|
end
|
20
|
-
add_file(
|
24
|
+
add_file(path)
|
21
25
|
|
22
26
|
when /^([^\/]+)\/([^\/]+)$/
|
23
27
|
parsed_param = param.match(/^([^\/]+)\/([^\/]+)$/)
|
24
28
|
host = parsed_param[1]
|
25
29
|
user = parsed_param[2]
|
26
30
|
|
27
|
-
|
28
|
-
clone_urls.each do |clone_url|
|
31
|
+
APIHelper.get_repository_urls(host, user).each do |clone_url|
|
29
32
|
get(clone_url)
|
30
33
|
end
|
31
34
|
end
|
@@ -42,11 +45,9 @@ module Gpr
|
|
42
45
|
|
43
46
|
else
|
44
47
|
repositories.each do |repository|
|
45
|
-
|
46
|
-
host = parsed_path[1]
|
47
|
-
repository = parsed_path[2]
|
48
|
+
repo_info = parse_repository(repository)
|
48
49
|
|
49
|
-
puts "#{host.color(:yellow)} - #{repository.color(:blue)}"
|
50
|
+
puts "#{repo_info[:host].color(:yellow)} - #{repo_info[:repository].color(:blue)}"
|
50
51
|
end
|
51
52
|
end
|
52
53
|
end
|
@@ -84,6 +85,37 @@ module Gpr
|
|
84
85
|
end
|
85
86
|
end
|
86
87
|
|
88
|
+
desc 'fetch', 'Fetch the registered repositories'
|
89
|
+
def fetch(remote = 'origin', branch = nil)
|
90
|
+
repositories = get_repositories
|
91
|
+
repositories.each do |repository|
|
92
|
+
repo_info = parse_repository(repository)
|
93
|
+
|
94
|
+
puts "#{repo_info[:host].color(:yellow)} - #{repo_info[:repository].color(:blue)}"
|
95
|
+
|
96
|
+
GitHelper.fetch(repository, remote, branch)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
desc 'status', 'Show the status of all registered repositories'
|
101
|
+
def status
|
102
|
+
repositories = get_repositories
|
103
|
+
table do
|
104
|
+
row do
|
105
|
+
column('REPOSITORY NAME'.style(:bold), 15)
|
106
|
+
column('BRANCH STATUS'.style(:bold), 40)
|
107
|
+
column('DIRECTORY STATUS'.style(:bold), 25)
|
108
|
+
end
|
109
|
+
repositories.each do |repository|
|
110
|
+
row do
|
111
|
+
column(repository.match(/.+\/(.+)/)[1])
|
112
|
+
column(GitHelper.status(repository)[:branch])
|
113
|
+
column(GitHelper.status(repository)[:directory])
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
87
119
|
desc 'version', 'Display installed gpr version'
|
88
120
|
map '-v' => :version
|
89
121
|
def version
|
@@ -92,6 +124,14 @@ module Gpr
|
|
92
124
|
|
93
125
|
private
|
94
126
|
|
127
|
+
def parse_repository(repository_path)
|
128
|
+
repo_info = {}
|
129
|
+
parsed_path = repository_path.match(/#{APP_PATH}\/([^\/]+)\/(.+)/)
|
130
|
+
repo_info[:host] = parsed_path[1]
|
131
|
+
repo_info[:repository] = parsed_path[2]
|
132
|
+
repo_info
|
133
|
+
end
|
134
|
+
|
95
135
|
def get_repositories
|
96
136
|
repositories = Dir.glob("#{APP_PATH}/*/*/*").select do |directory|
|
97
137
|
FileTest.directory?(directory)
|
@@ -100,17 +140,16 @@ module Gpr
|
|
100
140
|
end
|
101
141
|
|
102
142
|
def add_file(path)
|
103
|
-
|
143
|
+
repo_info = parse_repository(path)
|
104
144
|
|
105
|
-
|
106
|
-
`git ls-files`.split("\n").each do |file|
|
145
|
+
GitHelper.ls_files(path).each do |file|
|
107
146
|
next unless FileTest.file?(file)
|
108
147
|
Groonga['Files'].add(
|
109
148
|
File.expand_path(file),
|
110
149
|
filename: File.basename(file),
|
111
150
|
body: File.open(file).read,
|
112
|
-
host:
|
113
|
-
repository:
|
151
|
+
host: repo_info[:host],
|
152
|
+
repository: repo_info[:repository]
|
114
153
|
)
|
115
154
|
end
|
116
155
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Gpr
|
2
|
+
module GitHelper
|
3
|
+
class << self
|
4
|
+
def clone(url, path)
|
5
|
+
system("git clone #{url} #{path} >/dev/null 2>&1")
|
6
|
+
end
|
7
|
+
|
8
|
+
def ls_files(path)
|
9
|
+
Dir.chdir(path)
|
10
|
+
`git ls-files`.split("\n")
|
11
|
+
end
|
12
|
+
|
13
|
+
def fetch(path, remote, branch)
|
14
|
+
Dir.chdir(path)
|
15
|
+
if branch.nil?
|
16
|
+
`git fetch #{remote}`
|
17
|
+
else
|
18
|
+
`git fetch #{remote} #{branch}`
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def status(path)
|
23
|
+
Dir.chdir(path)
|
24
|
+
result = {}
|
25
|
+
status = `git status`
|
26
|
+
|
27
|
+
result[:branch] = status.match(/Your branch (is|and) (.+?)(,|\.)/)[2]
|
28
|
+
|
29
|
+
case status
|
30
|
+
when /nothing to commit, working directory clean/
|
31
|
+
result[:directory] = 'Working directory clean'
|
32
|
+
|
33
|
+
when /Changes not staged for commit:/
|
34
|
+
result[:directory] = 'Exist unstaged changes'
|
35
|
+
|
36
|
+
when /Untracked files:/
|
37
|
+
result[:directory] = 'Exist untracked files'
|
38
|
+
end
|
39
|
+
result
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/gpr/version.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'table_builder/table'
|
2
|
+
require 'table_builder/row'
|
3
|
+
require 'table_builder/column_validator'
|
4
|
+
require 'table_builder/column'
|
5
|
+
|
6
|
+
module TableBuilder
|
7
|
+
def table(min_column_size = 10, &block)
|
8
|
+
@table = Table.new(min_column_size)
|
9
|
+
block.call
|
10
|
+
@table.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
def row(&block)
|
14
|
+
@row = Row.new
|
15
|
+
block.call
|
16
|
+
@table.add(@row)
|
17
|
+
end
|
18
|
+
|
19
|
+
def column(text, size = nil)
|
20
|
+
@column = Column.new(text, size)
|
21
|
+
@row.add(@column)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module TableBuilder
|
2
|
+
class Column
|
3
|
+
using Colorize
|
4
|
+
prepend ColumnValidator
|
5
|
+
|
6
|
+
attr_accessor :text
|
7
|
+
|
8
|
+
def initialize(text, size)
|
9
|
+
# Ignore ANSI escape sequences
|
10
|
+
pure_text = text.to_pure
|
11
|
+
|
12
|
+
text += ' ' * (size - pure_text.size) if !size.nil? && size > pure_text.size
|
13
|
+
@text = text
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module TableBuilder
|
2
|
+
class Table
|
3
|
+
using Colorize
|
4
|
+
|
5
|
+
def initialize(min_column_size)
|
6
|
+
@rows = []
|
7
|
+
@header_column_sizes = []
|
8
|
+
@min_column_size = min_column_size
|
9
|
+
end
|
10
|
+
|
11
|
+
def add(row)
|
12
|
+
# Means the header
|
13
|
+
if @rows.size.zero?
|
14
|
+
set_header_column_size(row)
|
15
|
+
|
16
|
+
else
|
17
|
+
if row.columns.size != @header_column_sizes.size
|
18
|
+
fail "Bud number of columns (#{row.columns.size} for #{@header_column_sizes.size})"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
@rows << row
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
puts separate
|
27
|
+
|
28
|
+
@rows.each.with_index do |row, index|
|
29
|
+
puts format_line(row)
|
30
|
+
puts separate if index != @rows.size - 1
|
31
|
+
end
|
32
|
+
|
33
|
+
puts separate
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def set_header_column_size(row)
|
39
|
+
row.columns.each.with_index do |column, index|
|
40
|
+
# Ignore ANSI escape sequences
|
41
|
+
pure_text = column.text.to_pure
|
42
|
+
|
43
|
+
if pure_text.size > @min_column_size
|
44
|
+
@header_column_sizes[index] = pure_text.size
|
45
|
+
else
|
46
|
+
@header_column_sizes[index] = @min_column_size
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def format_line(row)
|
52
|
+
line = '| '
|
53
|
+
|
54
|
+
row.columns.each.with_index do |column, index|
|
55
|
+
# Ignore ANSI escape sequences
|
56
|
+
pure_text = column.text.to_pure
|
57
|
+
|
58
|
+
if pure_text.size < @header_column_sizes[index]
|
59
|
+
line << column.text + ' ' * (@header_column_sizes[index] - pure_text.size)
|
60
|
+
|
61
|
+
elsif pure_text.size > @header_column_sizes[index]
|
62
|
+
line << column.text[0, @header_column_sizes[index] - 3] + '...'
|
63
|
+
|
64
|
+
else
|
65
|
+
line << column.text
|
66
|
+
end
|
67
|
+
|
68
|
+
line << ' | ' if index != row.columns.size - 1
|
69
|
+
end
|
70
|
+
|
71
|
+
line << ' |'
|
72
|
+
end
|
73
|
+
|
74
|
+
def separate
|
75
|
+
left = middle = right = '+'
|
76
|
+
bar = '-'
|
77
|
+
|
78
|
+
left + @header_column_sizes.map { |size| bar * (size + 2) }.join(middle) + right
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/zsh/gpr.zsh
CHANGED
@@ -33,6 +33,12 @@ function _gpr () {
|
|
33
33
|
;;
|
34
34
|
(update)
|
35
35
|
;;
|
36
|
+
(fetch)
|
37
|
+
;;
|
38
|
+
(status)
|
39
|
+
;;
|
40
|
+
(version)
|
41
|
+
;;
|
36
42
|
esac
|
37
43
|
;;
|
38
44
|
esac
|
@@ -48,6 +54,9 @@ __gpr_cmds () {
|
|
48
54
|
'list:Show all registered repositories'
|
49
55
|
'search:Search the specified keyword in registered repositories'
|
50
56
|
'update:Update the database to be used for search'
|
57
|
+
'fetch:Fetch the registered repositories'
|
58
|
+
'status:Show the status of all registered repositories'
|
59
|
+
'version:Display installed gpr version'
|
51
60
|
)
|
52
61
|
|
53
62
|
_describe -t commands Commands _c
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gpr
|
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
|
- kaihar4
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -109,11 +109,17 @@ files:
|
|
109
109
|
- Rakefile
|
110
110
|
- bin/gpr
|
111
111
|
- gpr.gemspec
|
112
|
-
- lib/
|
112
|
+
- lib/colorize.rb
|
113
113
|
- lib/gpr.rb
|
114
114
|
- lib/gpr/api_helper.rb
|
115
115
|
- lib/gpr/cli.rb
|
116
|
+
- lib/gpr/git_helper.rb
|
116
117
|
- lib/gpr/version.rb
|
118
|
+
- lib/table_builder.rb
|
119
|
+
- lib/table_builder/column.rb
|
120
|
+
- lib/table_builder/column_validator.rb
|
121
|
+
- lib/table_builder/row.rb
|
122
|
+
- lib/table_builder/table.rb
|
117
123
|
- zsh/gpr.zsh
|
118
124
|
homepage: https://github.com/kaihar4/gpr
|
119
125
|
licenses:
|
@@ -135,9 +141,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
141
|
version: '0'
|
136
142
|
requirements: []
|
137
143
|
rubyforge_project:
|
138
|
-
rubygems_version: 2.
|
144
|
+
rubygems_version: 2.2.2
|
139
145
|
signing_key:
|
140
146
|
specification_version: 4
|
141
147
|
summary: Simple management of the git repository.
|
142
148
|
test_files: []
|
143
|
-
has_rdoc:
|
data/lib/extends/colorize.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
class String
|
2
|
-
COLORS = {
|
3
|
-
black: 0,
|
4
|
-
red: 1,
|
5
|
-
green: 2,
|
6
|
-
yellow: 3,
|
7
|
-
blue: 4,
|
8
|
-
magenta: 5,
|
9
|
-
cyan: 6,
|
10
|
-
white: 7
|
11
|
-
}
|
12
|
-
|
13
|
-
STYLES = {
|
14
|
-
reset: 0,
|
15
|
-
bold: 1,
|
16
|
-
underscore: 4,
|
17
|
-
blink: 5,
|
18
|
-
reverse: 6,
|
19
|
-
concealed: 7
|
20
|
-
}
|
21
|
-
|
22
|
-
def color(color)
|
23
|
-
to_ansi("3#{COLORS[color]}")
|
24
|
-
end
|
25
|
-
|
26
|
-
def bg_color(color)
|
27
|
-
to_ansi("4#{COLORS[color]}")
|
28
|
-
end
|
29
|
-
|
30
|
-
def style(style)
|
31
|
-
to_ansi(STYLES[style])
|
32
|
-
end
|
33
|
-
|
34
|
-
protected
|
35
|
-
|
36
|
-
def to_ansi(code)
|
37
|
-
"\e[#{code.to_i}m#{self}\e[0m"
|
38
|
-
end
|
39
|
-
end
|