gpr 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d6aaeb3e46219acf803f62ee8fed9789232e25f1
4
- data.tar.gz: c13cb934f58327cd44bb16a54aed8a95734a947d
3
+ metadata.gz: 80d2d92c3f8db42725dddeb4d0b9b260afe8a8ba
4
+ data.tar.gz: b0b7c3932b6a09afea0b4225aa69d377f2871c2b
5
5
  SHA512:
6
- metadata.gz: 03bf320b8e4ec2952e6e3893fd5e921826616149d078eef651712b4b8d01983e294c6e4764adddb2e7682b7ff12d3525d661575984734ca9d580368ba6ffb725
7
- data.tar.gz: d3269f2cbd486c71b90bb18a596bb9686187e62a01e5ce93208b8df0408ffc273fdff16e31185f50d2576195794bb03d1193111f59aa406100033e844c0bcce1
6
+ metadata.gz: d0717eec796c4a585f41c2f43c1dd9b248763a63e79657343582a7e4da00bcdb784de28b9aef82e6dfc03eb900f3e7b355e302a7d030684e7b8a69351e0345e4
7
+ data.tar.gz: 105a7e363d6ef9c09fe5a1d30e1790e3dd7274fa0d7302730d30618446c950692551f478e5d17a32f7645e48323fdca090368878a16518739713edce5e7c70c3
data/README.md CHANGED
@@ -12,14 +12,6 @@ For example, all repositories are cloned to `$HOME/.gpr/<host>/<user>/<repositor
12
12
 
13
13
  It is possible to centrally manage of the all repositories.
14
14
 
15
- ## Work with peco
16
-
17
- Gpr provides a list of directories of all registered repositories.
18
-
19
- Therefore, it is powerful when combined with [peco](https://github.com/peco/peco).
20
-
21
- ![with\_peco](https://raw.github.com/wiki/kaihar4/gpr/images/with_peco.gif)
22
-
23
15
  ## Installation
24
16
 
25
17
  ```sh
@@ -32,7 +24,7 @@ $ gem install gpr
32
24
  $ gpr help
33
25
  ```
34
26
 
35
- ### Clone a git repository into Gpr directory
27
+ ### Register a git repository into Gpr directory
36
28
 
37
29
  Just clone a git repository into `$HOME/.gpr/<host>/<user>/<repository>`.
38
30
 
@@ -40,7 +32,7 @@ Just clone a git repository into `$HOME/.gpr/<host>/<user>/<repository>`.
40
32
  $ gpr get <repository url>
41
33
  ```
42
34
 
43
- ### Clone all public repositories of the specified user
35
+ ### Register all public repositories of the specified user
44
36
 
45
37
  You can specify host only `github.com` or `bitbucket.org`.
46
38
 
@@ -62,7 +54,19 @@ $ gpr list --paths
62
54
 
63
55
  ![list\_paths](https://raw.github.com/wiki/kaihar4/gpr/images/list_paths.png)
64
56
 
65
- ### Show contributions of registered repositories
57
+ ### Select a repository using the interactive interface
58
+
59
+ ```sh
60
+ $ gpr select
61
+ ```
62
+
63
+ Possible use as this.
64
+
65
+ ![select](https://raw.github.com/wiki/kaihar4/gpr/images/select.gif)
66
+
67
+ Other benefits is [here](#convenient-aliases).
68
+
69
+ ### Show your contributions of registered repositories
66
70
 
67
71
  Display in graph format.
68
72
 
@@ -109,7 +113,7 @@ $ gpr update
109
113
  ### Fetch all registered repositories
110
114
 
111
115
  ```sh
112
- $ gpr fetch <remote_repo>
116
+ $ gpr fetch <remote repository>
113
117
  ```
114
118
 
115
119
  If you run for short, it means `gpr fetch origin`.
@@ -118,13 +122,15 @@ If you run for short, it means `gpr fetch origin`.
118
122
  $ gpr fetch
119
123
  ```
120
124
 
121
- ## Change the directory to be cloned
125
+ ## Configuration
126
+
127
+ ### Change the directory to be cloned
122
128
 
123
129
  ```sh
124
130
  $ export GPR_ROOT=$HOME/develop
125
131
  ```
126
132
 
127
- ## Install the zsh completion
133
+ ### Install the zsh completion
128
134
 
129
135
  ```sh
130
136
  $ gpr get https://github.com/kaihar4/gpr.git
@@ -132,3 +138,16 @@ $ cd $HOME/.gpr/github.com/kaihar4/gpr
132
138
  $ rake zsh:install
133
139
  $ source ~/.zshrc
134
140
  ```
141
+
142
+ ### Convenient aliases
143
+
144
+ ```sh
145
+ # Change Directory to a directory that you specify
146
+ alias gcd='cd $(gpr select)'
147
+ # Remove a directory that you specify
148
+ alias grm='rm -rf $(gpr select)'
149
+ # Show your contributions of a directory that you specify
150
+ alias gcontrib='gpr contrib $(gpr select)'
151
+ # Fetch a repository of a directory that you specify
152
+ alias gfetch='gpr fetch $(gpr select)'
153
+ ```
data/bin/gpr CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  require 'gpr'
4
4
 
5
- begin
5
+ if FileTest.exist?("#{Gpr::DB_PATH}/gpr.db")
6
6
  Groonga::Database.open("#{Gpr::DB_PATH}/gpr.db")
7
- rescue Groonga::NoSuchFileOrDirectory
7
+ else
8
8
  FileUtils.mkdir_p(Gpr::DB_PATH)
9
9
  Groonga::Context.default_options = { encoding: :utf8 }
10
10
  Groonga::Database.create(path: "#{Gpr::DB_PATH}/gpr.db")
data/gpr.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency 'thor'
22
22
  spec.add_dependency 'rroonga'
23
+ spec.add_dependency 'curses'
23
24
 
24
25
  spec.add_development_dependency 'bundler', '~> 1.6'
25
26
  spec.add_development_dependency 'rake'
data/lib/gpr.rb CHANGED
@@ -5,10 +5,12 @@ require 'find'
5
5
 
6
6
  require 'thor'
7
7
  require 'groonga'
8
+ require 'curses'
8
9
 
9
10
  require 'colorize'
10
11
  require 'table_builder'
11
12
  require 'graph_drawer'
13
+ require 'interactive_filter'
12
14
  require 'gpr/version'
13
15
  require 'gpr/api_helper'
14
16
  require 'gpr/git_helper'
data/lib/gpr/cli.rb CHANGED
@@ -53,28 +53,37 @@ module Gpr
53
53
  end
54
54
  end
55
55
 
56
- desc 'contrib', 'Show contributions of registered repositories'
56
+ desc 'select', 'Select a repository using the interactive interface'
57
+ def select
58
+ repositories = get_repositories
59
+ puts InteractiveFilter.filtering(repositories)
60
+ end
61
+
62
+ desc 'contrib', 'Show your contributions of registered repositories'
57
63
  def contrib(path = nil)
58
- if path.nil?
59
- dates = []
64
+ git_user = File.open("#{ENV['HOME']}/.gitconfig", 'r') do |f|
65
+ body = f.read
66
+ body.match(/name\s+=\s+(.+)/)[1]
67
+ end
68
+ user = git_user || ENV['USER']
60
69
 
70
+ if path.nil?
61
71
  repositories = get_repositories
62
- repositories.each do |repository|
63
- dates.concat(GitHelper.log_by_date(repository))
72
+ dates = repositories.each_with_object([]) do |repository, ary|
73
+ ary.concat(GitHelper.log_by_date(repository, user))
64
74
  end
65
75
 
66
76
  else
67
- dates = GitHelper.log_by_date(path)
77
+ dates = GitHelper.log_by_date(path, user)
68
78
  end
69
79
 
70
80
  first_date = Time.parse(dates.sort.first)
71
81
  diff = ((Time.now - first_date).to_i / 86400) + 1
72
82
 
73
83
  # Initialize a hash
74
- commit_counts = {}
75
- diff.times.with_index do |index|
84
+ commit_counts = diff.times.each_with_object({}) do |index, hash|
76
85
  date = Time.at(first_date + (86400 * index)).strftime('%Y-%m-%d')
77
- commit_counts[date] = 0
86
+ hash[date] = 0
78
87
  end
79
88
 
80
89
  # Count commits
@@ -123,14 +132,22 @@ module Gpr
123
132
  end
124
133
 
125
134
  desc 'fetch', 'Fetch the registered repositories'
126
- def fetch(remote = 'origin', branch = nil)
127
- repositories = get_repositories
128
- repositories.each do |repository|
129
- repo_info = parse_repository(repository)
135
+ def fetch(remote = 'origin', branch = nil, path = nil)
136
+ if path.nil?
137
+ repositories = get_repositories
138
+ repositories.each do |repository|
139
+ repo_info = parse_repository(repository)
140
+
141
+ puts "#{repo_info[:host].color(:yellow)} - #{repo_info[:repository].color(:blue)}"
142
+
143
+ GitHelper.fetch(repository, remote, branch)
144
+ end
145
+ else
146
+ repo_info = parse_repository(path)
130
147
 
131
148
  puts "#{repo_info[:host].color(:yellow)} - #{repo_info[:repository].color(:blue)}"
132
149
 
133
- GitHelper.fetch(repository, remote, branch)
150
+ GitHelper.fetch(path, remote, branch)
134
151
  end
135
152
  end
136
153
 
@@ -39,9 +39,13 @@ module Gpr
39
39
  result
40
40
  end
41
41
 
42
- def log_by_date(path)
42
+ def log_by_date(path, user = nil)
43
43
  Dir.chdir(path)
44
- `git log --date=short --pretty=format:"%cd"`.split("\n")
44
+ if user.nil?
45
+ `git log --date=short --pretty=format:"%cd"`.split("\n")
46
+ else
47
+ `git log --author=#{user} --date=short --pretty=format:"%cd"`.split("\n")
48
+ end
45
49
  end
46
50
  end
47
51
  end
data/lib/gpr/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Gpr
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
data/lib/graph_drawer.rb CHANGED
@@ -2,9 +2,9 @@ require 'graph_drawer/graph.rb'
2
2
  require 'graph_drawer/data.rb'
3
3
 
4
4
  module GraphDrawer
5
- def graph(&block)
5
+ def graph
6
6
  @graph = Graph.new
7
- block.call
7
+ yield
8
8
  @graph.datas_init
9
9
  @graph.to_s
10
10
  end
@@ -23,8 +23,15 @@ module GraphDrawer
23
23
  :blue
24
24
  end
25
25
 
26
- bar = ' ' * @value
27
- "#{@item}|#{bar.bg_color(color)}"
26
+ if @value.zero?
27
+ draw_str = "#{@item}|"
28
+ else
29
+ bar = ' ' * (@value - 1)
30
+ data_label = @value.to_s.color(:black)
31
+ draw_str = "#{@item}|#{(bar + data_label).bg_color(color)}"
32
+ end
33
+
34
+ draw_str
28
35
  end
29
36
  end
30
37
  end
@@ -0,0 +1,25 @@
1
+ require 'interactive_filter/input'
2
+ require 'interactive_filter/interface'
3
+
4
+ module InteractiveFilter
5
+ def self.filtering(repositories)
6
+ name = caller.last.match(/.+\/(.+?)(:|\.)/)[1].capitalize
7
+
8
+ isatty = STDOUT.isatty
9
+
10
+ unless isatty
11
+ stdout_old = STDOUT.dup
12
+ STDOUT.reopen('/dev/tty')
13
+ end
14
+
15
+ ifilter = Interface.new(name, repositories)
16
+ result = ifilter.grep
17
+
18
+ unless isatty
19
+ STDOUT.flush
20
+ STDOUT.reopen(stdout_old)
21
+ end
22
+
23
+ result
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ module InteractiveFilter
2
+ class Input
3
+ attr_accessor :text
4
+
5
+ def initialize(text = '')
6
+ @text = text
7
+ end
8
+
9
+ def <<(text)
10
+ @text << text
11
+ end
12
+
13
+ def backspace!
14
+ @text.chop!
15
+ end
16
+
17
+ def to_s
18
+ @text
19
+ end
20
+
21
+ def to_regex
22
+ /#{@text}/
23
+ rescue
24
+ nil
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,120 @@
1
+ module InteractiveFilter
2
+ class Interface
3
+ def initialize(name, array)
4
+ @prompt = "#{name}> "
5
+ @targets = array
6
+
7
+ @input = Input.new
8
+ @cursor_position = 1
9
+
10
+ Curses.init_screen
11
+ Curses.crmode
12
+ Curses.noecho
13
+ @window = Curses::Window.new(Curses.lines, Curses.cols, 0, 0)
14
+ @window.keypad(true)
15
+
16
+ # Initialize a window
17
+ @outputs = []
18
+ @window.clear
19
+ reset_cursor_position
20
+
21
+ output_line(@prompt)
22
+ output_choises
23
+ reset_cursor_position
24
+ end
25
+
26
+ def grep
27
+ loop do
28
+ key = @window.getch
29
+ keycode = get_keycode(key)
30
+
31
+ if key.class == String
32
+ @input << key
33
+
34
+ # <BS>
35
+ elsif key == 127
36
+ @input.backspace!
37
+
38
+ # <CR>
39
+ elsif keycode == :KEY_CTRL_J
40
+ if @outputs.size >= @cursor_position && @cursor_position >= 1
41
+ break
42
+ else
43
+ next
44
+ end
45
+
46
+ elsif keycode == :KEY_DOWN
47
+ down_cursor_position if @outputs.size > @cursor_position
48
+ next
49
+
50
+ elsif keycode == :KEY_UP
51
+ up_cursor_position if @cursor_position > 1
52
+ next
53
+
54
+ # Ignore other keys
55
+ else
56
+ next
57
+ end
58
+
59
+ # Initialize a window
60
+ @outputs = []
61
+ @window.clear
62
+ reset_cursor_position
63
+
64
+ output_line(@prompt + @input.to_s)
65
+ output_choises
66
+ reset_cursor_position
67
+ end
68
+
69
+ Curses.close_screen
70
+ return @outputs[@cursor_position - 1]
71
+
72
+ # <C-c>
73
+ rescue Interrupt
74
+ Curses.close_screen
75
+ end
76
+
77
+ private
78
+
79
+ def get_keycode(key)
80
+ Curses.constants.select do |name|
81
+ /^KEY/ =~ name && Curses.const_get(name) == key
82
+ end.first
83
+ end
84
+
85
+ def output_choises
86
+ # Filtering
87
+ @targets.each do |target|
88
+ regex = @input.to_regex
89
+
90
+ if !regex.nil? && regex =~ target
91
+ @outputs << target
92
+ end
93
+ end
94
+
95
+ @outputs.each { |output| output_line(output) }
96
+ end
97
+
98
+ def output_line(word)
99
+ @window.setpos(@cursor_position - 1, 0)
100
+ @cursor_position += 1
101
+
102
+ @window << word
103
+ end
104
+
105
+ def up_cursor_position
106
+ @window.setpos(@cursor_position - 1, 0)
107
+ @cursor_position -= 1
108
+ end
109
+
110
+ def down_cursor_position
111
+ @window.setpos(@cursor_position + 1, 0)
112
+ @cursor_position += 1
113
+ end
114
+
115
+ def reset_cursor_position
116
+ @window.setpos(1, 0)
117
+ @cursor_position = 1
118
+ end
119
+ end
120
+ end
data/lib/table_builder.rb CHANGED
@@ -4,15 +4,15 @@ require 'table_builder/column_validator'
4
4
  require 'table_builder/column'
5
5
 
6
6
  module TableBuilder
7
- def table(min_column_size = 10, &block)
7
+ def table(min_column_size = 10)
8
8
  @table = Table.new(min_column_size)
9
- block.call
9
+ yield
10
10
  @table.to_s
11
11
  end
12
12
 
13
- def row(&block)
13
+ def row
14
14
  @row = Row.new
15
- block.call
15
+ yield
16
16
  @table.add(@row)
17
17
  end
18
18
 
data/zsh/gpr.zsh CHANGED
@@ -23,6 +23,8 @@ function _gpr () {
23
23
  '(-)*:: :->null_state' \
24
24
  && ret=0
25
25
  ;;
26
+ (select)
27
+ ;;
26
28
  (contrib)
27
29
  ;;
28
30
  (search)
@@ -54,7 +56,8 @@ __gpr_cmds () {
54
56
  'get:Get a repository'
55
57
  'help:Describe available commands or one specific command'
56
58
  'list:Show all registered repositories'
57
- 'contrib:Show contributions of registered repositories'
59
+ 'select:Select a repository using the interactive interface'
60
+ 'contrib:Show your contributions of registered repositories'
58
61
  'search:Search the specified keyword in registered repositories'
59
62
  'update:Update the database to be used for search'
60
63
  'fetch:Fetch the registered repositories'
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.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - kaihar4
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-25 00:00:00.000000000 Z
11
+ date: 2014-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: curses
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -118,6 +132,9 @@ files:
118
132
  - lib/graph_drawer.rb
119
133
  - lib/graph_drawer/data.rb
120
134
  - lib/graph_drawer/graph.rb
135
+ - lib/interactive_filter.rb
136
+ - lib/interactive_filter/input.rb
137
+ - lib/interactive_filter/interface.rb
121
138
  - lib/table_builder.rb
122
139
  - lib/table_builder/column.rb
123
140
  - lib/table_builder/column_validator.rb