gpr 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6fc828306cf6fcbd57901691545268d4fce5fac8
4
- data.tar.gz: c07bf80b3194da4ed975ab34d6713cc1a6b2c54d
3
+ metadata.gz: ccf15fbb208df9bd4a2ebc336f43d9ee47de666f
4
+ data.tar.gz: 7c2257355c1f466e54a15710dd73f218867a9cec
5
5
  SHA512:
6
- metadata.gz: f731f0de4b5dec48f3778c8da6d80edfa9aa7de5ba608616a5ec8d8a2df991e0672915448250767a001405ce5a5df203c8f082ab31870b5e45fd21dee5acd4d6
7
- data.tar.gz: e09dd812a64e122c9fd6fbb3876bb4bf6f1a98ee2665acdd61f798e2b8af275074d404af44fd4b999e4278078b7e5edb96f4d0bbc68f702f474b9819b7c49df1
6
+ metadata.gz: fee681930b621356143e8df951fa3355d2761505082bab2a93b3006cd15236f57b7140eb926138db08fa7ae49fa419fa9530476322e51f50de8632730f589f7d
7
+ data.tar.gz: d222565492c05cf9ede05b325da4cc246119e123c62ebf3b26277466bbacc2ac20e760520edcaedba6ac26b142d8c49021ae51cec40b4f621abfa0abdbfa8480
data/README.md CHANGED
@@ -37,22 +37,6 @@ Just clone a git repository into `$HOME/.gpr/<host>/<user>/<repository>`.
37
37
  $ gpr get <repository url>
38
38
  ```
39
39
 
40
- This is alias of GitHub.
41
-
42
- ```sh
43
- # e.g. gpr get kaihar4/gpr
44
- $ gpr get <user>/<repository>
45
- ```
46
-
47
- ### Register all public repositories of the specified user
48
-
49
- You can specify host only `github.com` or `bitbucket.org`.
50
-
51
- ```sh
52
- # e.g. gpr get github.com/kaihar4
53
- $ gpr get <host>/<user>
54
- ```
55
-
56
40
  ### Show all registered repositories
57
41
 
58
42
  ```sh
@@ -73,7 +57,7 @@ $ gpr select
73
57
 
74
58
  Possible use as this.
75
59
 
76
- ![select](https://raw.github.com/wiki/kaihar4/gpr/images/select.gif)
60
+ ![select](http://kaihar4.com/images/github.com/kaihar4/gpr/select.gif)
77
61
 
78
62
  Other benefits is [here](#convenient-aliases).
79
63
 
@@ -85,7 +69,7 @@ Display in graph format.
85
69
  $ gpr contrib
86
70
  ```
87
71
 
88
- ![contrib](https://raw.github.com/wiki/kaihar4/gpr/images/contrib.png)
72
+ ![contrib](http://kaihar4.com/images/github.com/kaihar4/gpr/contrib.png)
89
73
 
90
74
  ### Show the status of all registered repositories
91
75
 
@@ -95,7 +79,7 @@ You can check the status of the registered repositories at a glance.
95
79
  $ gpr status
96
80
  ```
97
81
 
98
- ![status](https://raw.github.com/wiki/kaihar4/gpr/images/status.png)
82
+ ![status](http://kaihar4.com/images/github.com/kaihar4/gpr/status.png)
99
83
 
100
84
  ### Search the specified keyword in registered repositories
101
85
 
@@ -113,13 +97,7 @@ Options:
113
97
  Search the specified keyword in registered repositories
114
98
  ```
115
99
 
116
- ![search](https://raw.github.com/wiki/kaihar4/gpr/images/search.png)
117
-
118
- ### Remove the unregistered directories
119
-
120
- ```sh
121
- $ gpr clean
122
- ```
100
+ ![search](http://kaihar4.com/images/github.com/kaihar4/gpr/search.png)
123
101
 
124
102
  ### Update the database to be used for search
125
103
 
data/bin/gpr CHANGED
@@ -1,31 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'fileutils'
4
-
5
- require 'groonga'
6
-
7
3
  require 'gpr'
8
4
 
9
- if FileTest.exist?("#{Gpr::DB_PATH}/gpr.db")
10
- Groonga::Database.open("#{Gpr::DB_PATH}/gpr.db")
11
- else
12
- FileUtils.mkdir_p(Gpr::DB_PATH)
13
- Groonga::Context.default_options = { encoding: :utf8 }
14
- Groonga::Database.create(path: "#{Gpr::DB_PATH}/gpr.db")
15
- Groonga::Schema.create_table('Files', type: :patricia_trie) do |t|
16
- t.text('filename')
17
- t.text('body')
18
- t.text('host')
19
- t.text('repository')
20
- end
21
- Groonga::Schema.create_table(
22
- 'Terms',
23
- type: :patricia_trie,
24
- normalizer: :NormalizerAuto,
25
- default_tokenizer: 'TokenBigramSplitSymbolAlpha'
26
- ) do |t|
27
- t.index('Files.body')
28
- end
29
- end
30
-
31
- Gpr::CLI.start(ARGV)
5
+ Gpr::Main.start(ARGV)
data/lib/gpr.rb CHANGED
@@ -1,9 +1,7 @@
1
- require 'gpr/version'
2
- require 'gpr/api_helper'
3
- require 'gpr/git_helper'
4
- require 'gpr/cli'
5
-
6
1
  module Gpr
7
2
  APP_PATH = ENV['GPR_ROOT'] || "#{ENV['HOME']}/.gpr"
8
- DB_PATH = "#{APP_PATH}/.database"
3
+
4
+ @@commands = []
9
5
  end
6
+
7
+ require 'gpr/main'
data/lib/gpr/action.rb ADDED
@@ -0,0 +1,18 @@
1
+ module Gpr
2
+ module Action
3
+ def parse_repository(repository_path)
4
+ repo_info = {}
5
+ parsed_path = repository_path.match(/#{::Gpr::APP_PATH}\/(?<host>[^\/]+)\/(?<repository>.+)/)
6
+ repo_info[:host] = parsed_path[:host]
7
+ repo_info[:repository] = parsed_path[:repository]
8
+ repo_info
9
+ end
10
+
11
+ def repository_list
12
+ repositories = Dir.glob("#{::Gpr::APP_PATH}/*/*/*").select do |directory|
13
+ FileTest.directory?(directory)
14
+ end
15
+ repositories.sort
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ module Gpr
2
+ module Actions
3
+ module Contrib
4
+ def detect_git_user
5
+ git_user = File.open("#{ENV['HOME']}/.gitconfig", 'r') do |f|
6
+ body = f.read
7
+ body.match(/name\s+=\s+(?<username>.+)/)[:username]
8
+ end
9
+
10
+ git_user
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,52 @@
1
+ require 'fileutils'
2
+
3
+ require 'groonga'
4
+
5
+ require 'gpr/git_helper'
6
+
7
+ module Gpr
8
+ module Actions
9
+ module Search
10
+ DB_PATH = "#{::Gpr::APP_PATH}/.database"
11
+
12
+ def initialize_groonga
13
+ if FileTest.exist?("#{DB_PATH}/gpr.db")
14
+ Groonga::Database.open("#{DB_PATH}/gpr.db")
15
+ else
16
+ FileUtils.mkdir_p(DB_PATH)
17
+ Groonga::Context.default_options = { encoding: :utf8 }
18
+ Groonga::Database.create(path: "#{DB_PATH}/gpr.db")
19
+ Groonga::Schema.create_table('Files', type: :patricia_trie) do |t|
20
+ t.text('filename')
21
+ t.text('body')
22
+ t.text('host')
23
+ t.text('repository')
24
+ end
25
+ Groonga::Schema.create_table(
26
+ 'Terms',
27
+ type: :patricia_trie,
28
+ normalizer: :NormalizerAuto,
29
+ default_tokenizer: 'TokenBigramSplitSymbolAlpha'
30
+ ) do |t|
31
+ t.index('Files.body')
32
+ end
33
+ end
34
+ end
35
+
36
+ def add_file(path)
37
+ repo_info = parse_repository(path)
38
+
39
+ GitHelper.ls_files(path).each do |file|
40
+ next unless FileTest.file?(file)
41
+ Groonga['Files'].add(
42
+ File.expand_path(file),
43
+ filename: File.basename(file),
44
+ body: File.open(file).read,
45
+ host: repo_info[:host],
46
+ repository: repo_info[:repository]
47
+ )
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,11 @@
1
+ module Gpr
2
+ module Commands
3
+ class Base
4
+ include ::Gpr
5
+
6
+ def self.inherited(child)
7
+ @@commands << child
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,51 @@
1
+ require 'utils_drawer'
2
+
3
+ require 'gpr/git_helper'
4
+ require 'gpr/actions/contrib'
5
+
6
+ module Gpr
7
+ module Commands
8
+ class Contrib < Base
9
+ def initialize(thor)
10
+ thor.class_eval do
11
+ include UtilsDrawer
12
+ include ::Gpr::Actions::Contrib
13
+
14
+ desc 'contrib', 'Show your contributions of registered repositories'
15
+ def contrib(path = nil)
16
+ user = detect_git_user || ENV['USER']
17
+
18
+ if path.nil?
19
+ repositories = repository_list
20
+ dates = repositories.each_with_object([]) { |repository, ary|
21
+ ary << GitHelper.log_by_date(repository, user)
22
+ }.flatten!
23
+ else
24
+ dates = GitHelper.log_by_date(path, user)
25
+ end
26
+
27
+ first_date = Time.parse(dates.sort.first)
28
+ diff = ((Time.now - first_date).to_i / 86400) + 1
29
+
30
+ # Initialize a hash
31
+ commit_counts = diff.times.each_with_object({}) do |index, hash|
32
+ date = Time.at(first_date + (86400 * index)).strftime('%Y-%m-%d')
33
+ hash[date] = 0
34
+ end
35
+
36
+ # Count commits
37
+ dates.each do |date|
38
+ commit_counts[date] += 1 if commit_counts[date]
39
+ end
40
+
41
+ graph do
42
+ commit_counts.sort.each do |date, value|
43
+ data(date, value)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,35 @@
1
+ require 'safe_colorize'
2
+
3
+ require 'gpr/git_helper'
4
+
5
+ module Gpr
6
+ module Commands
7
+ class Fetch < Base
8
+ using SafeColorize
9
+
10
+ def initialize(thor)
11
+ thor.class_eval do
12
+ desc 'fetch', 'Fetch the registered repositories'
13
+ def fetch(remote = 'origin', branch = nil, path = nil)
14
+ if path.nil?
15
+ repositories = repository_list
16
+ repositories.each do |repository|
17
+ repo_info = parse_repository(repository)
18
+
19
+ puts "#{repo_info[:host].color(:yellow)} - #{repo_info[:repository].color(:blue)}"
20
+
21
+ GitHelper.fetch(repository, remote, branch)
22
+ end
23
+ else
24
+ repo_info = parse_repository(path)
25
+
26
+ puts "#{repo_info[:host].color(:yellow)} - #{repo_info[:repository].color(:blue)}"
27
+
28
+ GitHelper.fetch(path, remote, branch)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,27 @@
1
+ require 'safe_colorize'
2
+
3
+ module Gpr
4
+ module Commands
5
+ class Get < Base
6
+ using SafeColorize
7
+
8
+ def initialize(thor)
9
+ thor.class_eval do
10
+ desc 'get', 'Get a repository'
11
+ def get(param)
12
+ host, user, repository =
13
+ param.match(/.+(\/\/|@)(.+)\.git$/)[2].split(/(:|\/)/).delete_if.with_index { |_c, index| index.odd? }
14
+ path = "#{::Gpr::APP_PATH}/#{host}/#{user}/#{repository}"
15
+
16
+ if Dir.exist?(path)
17
+ puts "#{'Warning'.color(:red).style(:underscore)}: #{user}/#{repository} already registered"
18
+ return
19
+ end
20
+
21
+ `git clone #{param} #{path}`
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ require 'safe_colorize'
2
+
3
+ module Gpr
4
+ module Commands
5
+ class List < Base
6
+ using SafeColorize
7
+
8
+ def initialize(thor)
9
+ thor.class_eval do
10
+ desc 'list', 'Show all registered repositories'
11
+ option :paths, type: :boolean, desc: 'Show the paths of all registered repositories'
12
+ def list
13
+ repositories = repository_list
14
+ if options[:paths]
15
+ repositories.each do |repository|
16
+ puts repository
17
+ end
18
+ else
19
+ repositories.each do |repository|
20
+ repo_info = parse_repository(repository)
21
+
22
+ puts "#{repo_info[:host].color(:yellow)} - #{repo_info[:repository].color(:blue)}"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,60 @@
1
+ require 'groonga'
2
+ require 'safe_colorize'
3
+
4
+ require 'gpr/actions/search'
5
+
6
+ module Gpr
7
+ module Commands
8
+ class Search < Base
9
+ using SafeColorize
10
+ include ::Gpr::Actions::Search
11
+
12
+ def initialize(thor)
13
+ initialize_groonga
14
+
15
+ thor.class_eval do
16
+ include ::Gpr::Actions::Search
17
+
18
+ desc 'search', 'Search the specified keyword in registered repositories'
19
+ option :file, type: :string, aliases: '-f', desc: 'Filter by filename'
20
+ option :host, type: :string, aliases: '-h', desc: 'Filter by host'
21
+ option :repository, type: :string, aliases: '-r', desc: 'Filter by repository'
22
+ def search(string)
23
+ result = Groonga['Files'].select do |record|
24
+ record.body =~ string
25
+ end
26
+
27
+ result.each do |record|
28
+ next unless FileTest.exist?(record._key)
29
+
30
+ next if options[:file] && !(record.filename =~ /#{options[:file]}/)
31
+ next if options[:host] && !(record.host == options[:host])
32
+ next if options[:repository] && !(record.repository == options[:repository])
33
+
34
+ relative_path = record._key.sub(/#{::Gpr::APP_PATH}\/#{record.host}\/#{record.repository}\//, '')
35
+ puts "#{record.host.color(:yellow)} - #{record.repository.color(:blue)} : #{relative_path.color(:red)}"
36
+ end
37
+ end
38
+
39
+ desc 'update', 'Update the database to be used for search'
40
+ def update
41
+ puts 'Updating...'
42
+
43
+ Groonga['Files'].truncate
44
+
45
+ # Remove unregistered directories
46
+ Dir.glob("#{::Gpr::APP_PATH}/*/*").each do |path|
47
+ # Unregistered directories returns [".", ".."].
48
+ Dir.rmdir(path) if Dir.entries(path).size == 2
49
+ end
50
+
51
+ repositories = repository_list
52
+ repositories.each do |repository|
53
+ add_file(repository)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,17 @@
1
+ require 'ifilter'
2
+
3
+ module Gpr
4
+ module Commands
5
+ class Select < Base
6
+ def initialize(thor)
7
+ thor.class_eval do
8
+ desc 'select', 'Select a repository using the interactive interface'
9
+ def select
10
+ repositories = repository_list
11
+ puts Ifilter.filtering(repositories)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,38 @@
1
+ require 'utils_drawer'
2
+ require 'safe_colorize'
3
+
4
+ require 'gpr/git_helper'
5
+
6
+ module Gpr
7
+ module Commands
8
+ class Status < Base
9
+ using SafeColorize
10
+
11
+ def initialize(thor)
12
+ thor.class_eval do
13
+ include UtilsDrawer
14
+
15
+ desc 'status', 'Show the status of all registered repositories'
16
+ def status
17
+ repositories = repository_list
18
+ table do
19
+ row do
20
+ column('REPOSITORY NAME'.style(:bold), 25)
21
+ column('BRANCH STATUS'.style(:bold), 45)
22
+ column('DIRECTORY STATUS'.style(:bold), 25)
23
+ end
24
+ repositories.each do |repository|
25
+ status = GitHelper.status(repository)
26
+ row do
27
+ column(repository.match(/.+\/(?<repository>.+\/.+)/)[:repository])
28
+ column(status[:branch])
29
+ column(status[:directory])
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,17 @@
1
+ require 'gpr/version'
2
+
3
+ module Gpr
4
+ module Commands
5
+ class Version < Base
6
+ def initialize(thor)
7
+ thor.class_eval do
8
+ desc 'version', 'Display installed gpr version'
9
+ map '-v' => :version
10
+ def version
11
+ puts "gpr #{::Gpr::VERSION}"
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -5,29 +5,16 @@ module Gpr
5
5
  using SafeColorize
6
6
 
7
7
  class << self
8
- def clone(url, path)
9
- `git clone #{url} #{path}`
10
- end
11
-
12
8
  def ls_files(path)
13
9
  Dir.chdir(path)
14
10
  `git ls-files`.split("\n")
15
11
  end
16
12
 
17
- def fetch(path, remote, branch)
18
- Dir.chdir(path)
19
- if branch.nil?
20
- `git fetch #{remote}`
21
- else
22
- `git fetch #{remote} #{branch}`
23
- end
24
- end
25
-
26
13
  def status(path)
27
14
  Dir.chdir(path)
28
15
  result = {}
29
16
  git_status = `git status -sb`.split("\n")
30
- branch_name = git_status.shift.match(/## (.+)/)[1]
17
+ branch_name = git_status.shift.match(/## (?<branch>.+)/)[:branch]
31
18
  unstaged_changes = []
32
19
  untracked_files = []
33
20
 
@@ -63,6 +50,15 @@ module Gpr
63
50
  `git log --author=#{user} --date=short --pretty=format:"%cd"`.split("\n")
64
51
  end
65
52
  end
53
+
54
+ def fetch(path, remote, branch)
55
+ Dir.chdir(path)
56
+ if branch.nil?
57
+ `git fetch #{remote}`
58
+ else
59
+ `git fetch #{remote} #{branch}`
60
+ end
61
+ end
66
62
  end
67
63
  end
68
64
  end
data/lib/gpr/main.rb ADDED
@@ -0,0 +1,31 @@
1
+ require 'thor'
2
+
3
+ require 'gpr/action'
4
+ require 'gpr/commands/base'
5
+ require 'gpr/commands/get'
6
+ require 'gpr/commands/list'
7
+ require 'gpr/commands/select'
8
+ require 'gpr/commands/search'
9
+ require 'gpr/commands/status'
10
+ require 'gpr/commands/contrib'
11
+ require 'gpr/commands/fetch'
12
+ require 'gpr/commands/version'
13
+
14
+ Bundler.require
15
+
16
+ module Gpr
17
+ class Main < Thor
18
+ include ::Gpr
19
+ include Action
20
+
21
+ def self.start(args)
22
+ self.load_commands
23
+
24
+ super(args)
25
+ end
26
+
27
+ def self.load_commands
28
+ @@commands.map { |command| command.new(self) }
29
+ end
30
+ end
31
+ end
data/lib/gpr/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Gpr
2
- VERSION = '0.1.3'
2
+ VERSION = '0.2.0'
3
3
  end
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.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kaihar4
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-17 00:00:00.000000000 Z
11
+ date: 2015-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -124,9 +124,20 @@ files:
124
124
  - bin/gpr
125
125
  - gpr.gemspec
126
126
  - lib/gpr.rb
127
- - lib/gpr/api_helper.rb
128
- - lib/gpr/cli.rb
127
+ - lib/gpr/action.rb
128
+ - lib/gpr/actions/contrib.rb
129
+ - lib/gpr/actions/search.rb
130
+ - lib/gpr/commands/base.rb
131
+ - lib/gpr/commands/contrib.rb
132
+ - lib/gpr/commands/fetch.rb
133
+ - lib/gpr/commands/get.rb
134
+ - lib/gpr/commands/list.rb
135
+ - lib/gpr/commands/search.rb
136
+ - lib/gpr/commands/select.rb
137
+ - lib/gpr/commands/status.rb
138
+ - lib/gpr/commands/version.rb
129
139
  - lib/gpr/git_helper.rb
140
+ - lib/gpr/main.rb
130
141
  - lib/gpr/version.rb
131
142
  - zsh/gpr.zsh
132
143
  homepage: https://github.com/kaihar4/gpr
@@ -149,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
160
  version: '0'
150
161
  requirements: []
151
162
  rubyforge_project:
152
- rubygems_version: 2.2.2
163
+ rubygems_version: 2.4.5
153
164
  signing_key:
154
165
  specification_version: 4
155
166
  summary: Gitkeeper.
@@ -1,34 +0,0 @@
1
- require 'json'
2
- require 'net/https'
3
-
4
- module Gpr
5
- module APIHelper
6
- class << self
7
- def get_repository_urls(host, user)
8
- case host
9
- when 'github.com'
10
- uri = URI.parse("https://api.github.com/users/#{user}/repos?per_page=100")
11
- JSON.parse(request_https_get(uri).body).map do |repository|
12
- repository['clone_url']
13
- end
14
-
15
- when 'bitbucket.org'
16
- uri = URI.parse("https://api.bitbucket.org/1.0/users/#{user}")
17
- JSON.parse(request_https_get(uri).body)['repositories'].map do |repository|
18
- "https://#{repository['owner']}@bitbucket.org/#{repository['owner']}/#{repository['name']}.git"
19
- end
20
-
21
- else
22
- puts "#{host} is not supported"
23
- exit 0
24
- end
25
- end
26
-
27
- def request_https_get(uri)
28
- https = Net::HTTP.new(uri.host, uri.port)
29
- https.use_ssl = true
30
- https.get(uri.request_uri)
31
- end
32
- end
33
- end
34
- end
data/lib/gpr/cli.rb DELETED
@@ -1,235 +0,0 @@
1
- require 'thor'
2
- require 'groonga'
3
- require 'safe_colorize'
4
- require 'ifilter'
5
- require 'utils_drawer'
6
-
7
- module Gpr
8
- class CLI < Thor
9
- using SafeColorize
10
- include UtilsDrawer
11
-
12
- desc 'get', 'Get a repository'
13
- def get(param)
14
- case param
15
- when /.+(\/\/|@)(.+)\.git$/
16
- host, user, repository =
17
- param.match(/.+(\/\/|@)(.+)\.git$/)[2].split(/(:|\/)/).delete_if.with_index { |_c, index| index.odd? }
18
- path = "#{APP_PATH}/#{host}/#{user}/#{repository}"
19
-
20
- if Dir.exist?(path)
21
- puts "#{user}/#{repository} is already registered."
22
- return
23
- end
24
-
25
- GitHelper.clone(param, path)
26
- add_file(path)
27
-
28
- when /^([^\/]+)\/([^\/]+)$/
29
- parsed_param = param.match(/^([^\/]+)\/([^\/]+)$/)
30
-
31
- # <host>/<user>
32
- if parsed_param[1].include?('.')
33
- host = parsed_param[1]
34
- user = parsed_param[2]
35
-
36
- APIHelper.get_repository_urls(host, user).each do |clone_url|
37
- get(clone_url)
38
- end
39
-
40
- # <user>/<repository>
41
- else
42
- user = parsed_param[1]
43
- repository = parsed_param[2]
44
-
45
- clone_url = "https://github.com/#{user}/#{repository}.git"
46
- get(clone_url)
47
- end
48
- end
49
- end
50
-
51
- desc 'list', 'Show all registered repositories'
52
- option :paths, type: :boolean, desc: 'Show the paths of all registered repositories'
53
- def list
54
- repositories = get_repositories
55
- if options[:paths]
56
- repositories.each do |repository|
57
- puts repository
58
- end
59
-
60
- else
61
- repositories.each do |repository|
62
- repo_info = parse_repository(repository)
63
-
64
- puts "#{repo_info[:host].color(:yellow)} - #{repo_info[:repository].color(:blue)}"
65
- end
66
- end
67
- end
68
-
69
- desc 'select', 'Select a repository using the interactive interface'
70
- def select
71
- repositories = get_repositories
72
- puts Ifilter.filtering(repositories)
73
- end
74
-
75
- desc 'contrib', 'Show your contributions of registered repositories'
76
- def contrib(path = nil)
77
- git_user = File.open("#{ENV['HOME']}/.gitconfig", 'r') do |f|
78
- body = f.read
79
- body.match(/name\s+=\s+(.+)/)[1]
80
- end
81
- user = git_user || ENV['USER']
82
-
83
- if path.nil?
84
- repositories = get_repositories
85
- dates = repositories.each_with_object([]) do |repository, ary|
86
- ary.concat(GitHelper.log_by_date(repository, user))
87
- end
88
-
89
- else
90
- dates = GitHelper.log_by_date(path, user)
91
- end
92
-
93
- first_date = Time.parse(dates.sort.first)
94
- diff = ((Time.now - first_date).to_i / 86400) + 1
95
-
96
- # Initialize a hash
97
- commit_counts = diff.times.each_with_object({}) do |index, hash|
98
- date = Time.at(first_date + (86400 * index)).strftime('%Y-%m-%d')
99
- hash[date] = 0
100
- end
101
-
102
- # Count commits
103
- dates.each do |date|
104
- commit_counts[date] += 1 if commit_counts[date]
105
- end
106
-
107
- graph do
108
- commit_counts.sort.each do |date, value|
109
- data(date, value)
110
- end
111
- end
112
- end
113
-
114
- desc 'search', 'Search the specified keyword in registered repositories'
115
- option :file, type: :string, aliases: '-f', desc: 'Filter by filename'
116
- option :host, type: :string, aliases: '-h', desc: 'Filter by host'
117
- option :repository, type: :string, aliases: '-r', desc: 'Filter by repository'
118
- def search(string)
119
- result = Groonga['Files'].select do |record|
120
- record.body =~ string
121
- end
122
-
123
- result.each do |record|
124
- next unless FileTest.exist?(record._key)
125
-
126
- next unless /#{options[:file]}/ =~ record.filename if options[:file]
127
- next unless options[:host] == record.host if options[:host]
128
- next unless options[:repository] == record.repository if options[:repository]
129
-
130
- relative_path = record._key.sub(/#{APP_PATH}\/#{record.host}\/#{record.repository}\//, '')
131
- puts "#{record.host.color(:yellow)} - #{record.repository.color(:blue)} : #{relative_path.color(:red)}"
132
- end
133
- end
134
-
135
- desc 'clean', 'Remove the unregistered directories'
136
- def clean
137
- puts 'Processing...'
138
-
139
- Dir.glob("#{APP_PATH}/*/*").each do |path|
140
- # Unregistered directories returns [".", ".."].
141
- Dir.rmdir(path) if Dir.entries(path).size == 2
142
- end
143
- end
144
-
145
- desc 'update', 'Update the database to be used for search'
146
- def update
147
- puts 'Updating...'
148
-
149
- Groonga['Files'].truncate
150
-
151
- repositories = get_repositories
152
- repositories.each do |repository|
153
- add_file(repository)
154
- end
155
- end
156
-
157
- desc 'fetch', 'Fetch the registered repositories'
158
- def fetch(remote = 'origin', branch = nil, path = nil)
159
- if path.nil?
160
- repositories = get_repositories
161
- repositories.each do |repository|
162
- repo_info = parse_repository(repository)
163
-
164
- puts "#{repo_info[:host].color(:yellow)} - #{repo_info[:repository].color(:blue)}"
165
-
166
- GitHelper.fetch(repository, remote, branch)
167
- end
168
- else
169
- repo_info = parse_repository(path)
170
-
171
- puts "#{repo_info[:host].color(:yellow)} - #{repo_info[:repository].color(:blue)}"
172
-
173
- GitHelper.fetch(path, remote, branch)
174
- end
175
- end
176
-
177
- desc 'status', 'Show the status of all registered repositories'
178
- def status
179
- repositories = get_repositories
180
- table do
181
- row do
182
- column('REPOSITORY NAME'.style(:bold), 25)
183
- column('BRANCH STATUS'.style(:bold), 45)
184
- column('DIRECTORY STATUS'.style(:bold), 25)
185
- end
186
- repositories.each do |repository|
187
- status = GitHelper.status(repository)
188
- row do
189
- column(repository.match(/.+\/(.+\/.+)/)[1])
190
- column(status[:branch])
191
- column(status[:directory])
192
- end
193
- end
194
- end
195
- end
196
-
197
- desc 'version', 'Display installed gpr version'
198
- map '-v' => :version
199
- def version
200
- puts "gpr #{Gpr::VERSION}"
201
- end
202
-
203
- private
204
-
205
- def parse_repository(repository_path)
206
- repo_info = {}
207
- parsed_path = repository_path.match(/#{APP_PATH}\/([^\/]+)\/(.+)/)
208
- repo_info[:host] = parsed_path[1]
209
- repo_info[:repository] = parsed_path[2]
210
- repo_info
211
- end
212
-
213
- def get_repositories
214
- repositories = Dir.glob("#{APP_PATH}/*/*/*").select do |directory|
215
- FileTest.directory?(directory)
216
- end
217
- repositories.sort
218
- end
219
-
220
- def add_file(path)
221
- repo_info = parse_repository(path)
222
-
223
- GitHelper.ls_files(path).each do |file|
224
- next unless FileTest.file?(file)
225
- Groonga['Files'].add(
226
- File.expand_path(file),
227
- filename: File.basename(file),
228
- body: File.open(file).read,
229
- host: repo_info[:host],
230
- repository: repo_info[:repository]
231
- )
232
- end
233
- end
234
- end
235
- end