githelp 0.1.4 → 0.2.1

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.
Files changed (55) hide show
  1. checksums.yaml +5 -5
  2. data/.config/peco/config.json +6 -0
  3. data/00README +8 -0
  4. data/Gemfile +2 -4
  5. data/Makefile +10 -0
  6. data/README.md +9 -122
  7. data/bin/gh +2 -0
  8. data/exe/getghdata +100 -0
  9. data/exe/githelp +42 -67
  10. data/getdata +100 -0
  11. data/githelp +57 -0
  12. metadata +13 -52
  13. data/LICENSE.txt +0 -21
  14. data/Rakefile +0 -10
  15. data/bin/console +0 -14
  16. data/bin/setup +0 -7
  17. data/data.txt +0 -12
  18. data/data/adddelete.rb +0 -10
  19. data/data/afteradd.rb +0 -16
  20. data/data/appear.rb +0 -16
  21. data/data/branch.rb +0 -33
  22. data/data/cat-file.rb +0 -19
  23. data/data/change.rb +0 -95
  24. data/data/checkout.rb +0 -27
  25. data/data/commit.rb +0 -7
  26. data/data/freq.rb +0 -13
  27. data/data/fresh.rb +0 -7
  28. data/data/grep.rb +0 -8
  29. data/data/ignore.rb +0 -11
  30. data/data/log.rb +0 -8
  31. data/data/ls-files.rb +0 -15
  32. data/data/mv.rb +0 -7
  33. data/data/removed.rb +0 -17
  34. data/data/reset.rb +0 -11
  35. data/data/rm.rb +0 -8
  36. data/data/shortlog.rb +0 -13
  37. data/data/show.rb +0 -7
  38. data/data/status.rb +0 -11
  39. data/data/tag.rb +0 -27
  40. data/exe/githelp-changed +0 -9
  41. data/exe/githelp-fileadded +0 -25
  42. data/exe/githelp-unchanged +0 -9
  43. data/githelp.gemspec +0 -28
  44. data/lib/githelp.rb +0 -51
  45. data/lib/githelp/args.rb +0 -17
  46. data/lib/githelp/branches.rb +0 -40
  47. data/lib/githelp/changes.rb +0 -36
  48. data/lib/githelp/files.rb +0 -27
  49. data/lib/githelp/git_check.rb +0 -15
  50. data/lib/githelp/glossary.rb +0 -17
  51. data/lib/githelp/numbers.rb +0 -14
  52. data/lib/githelp/params.rb +0 -17
  53. data/lib/githelp/patterns.rb +0 -20
  54. data/lib/githelp/tags.rb +0 -29
  55. data/lib/githelp/version.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b44761785f5b8f6abed97dd864aea2e911e5f0d5
4
- data.tar.gz: b6c93ae5afa51e4c494889b34972b4c3e4925a91
2
+ SHA256:
3
+ metadata.gz: cd3d9d689ca50ef940e6237b2d1327b3b6b551688eacd89f231d63a3eb83b5c5
4
+ data.tar.gz: 9199227423e521c9aa91affae0bc859a0a4e3a10ed5fe9962577292603d302c5
5
5
  SHA512:
6
- metadata.gz: adea99c99d34a612f79debe607244654dea9cb109a0a4a417b263cde33c40d0d3f63aa892ee5a5e151f94907cd1f9907db163c7d1180dfbdbc2020a468cff2ab
7
- data.tar.gz: d850c7a51e1088e84fce305ba7ea7f1a12c9f4763bffd7a08d436b26659a3a6f6c16a2415e41047d2306532675345ef57b8d8525537a3bb4c3dd1a507fd6d7b4
6
+ metadata.gz: 56b47dc7fc76a995d438324ea731abd061fd0145d9a02cf93895414868689409561bd1ea814b18bd4be8b57518470646e73d9fb8cbfdea431a86c373d8820953
7
+ data.tar.gz: 5d9f7a365fdb10f9f111503a5ef12d386429014ee2b40ad70b0c341847bb91575682c6c7f973f6cd746de474f14cd27928b32bc2724d71b5378aa57a5c106a54
@@ -0,0 +1,6 @@
1
+ {
2
+ "Style": {
3
+ "Selected": ["on_cyan", "black"],
4
+ "Matched": ["blue", "on_blue"]
5
+ }
6
+ }
data/00README ADDED
@@ -0,0 +1,8 @@
1
+ * eval `githelp $* | peco` で実行
2
+ pecoで選択した行を実行する
3
+ ~/bin/gh あたりに置いておく
4
+
5
+ * bin/gh => ~/bin/gh
6
+ .config/peco/config.json => ~/.config/peco/config.json
7
+
8
+
data/Gemfile CHANGED
@@ -1,6 +1,4 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in githelp.gemspec
4
- gemspec
1
+ ruby '2.5.0'
5
2
 
3
+ gem 're_expand'
6
4
 
data/Makefile ADDED
@@ -0,0 +1,10 @@
1
+ data:
2
+ ruby getdata
3
+
4
+ install:
5
+ bundle install
6
+ -mkdir ~/.config
7
+ -mkdir ~/.config/peco
8
+ cp .config/peco/config.json ~/.config/peco/config.json
9
+ -mkdir ~/bin
10
+ cp bin/gh ~/bin/gh
data/README.md CHANGED
@@ -1,125 +1,12 @@
1
- # GitHelp
1
+ <h1>GitHelp</h1>
2
2
 
3
- **Gitのコマンドの使いこなしを支援**
3
+ <ul>
4
+ <li>古いものは<a href="https://github.com/masui/GitHelp_old">こちら</a></li>
5
+ </ul>
4
6
 
5
- ### 概要
7
+ <h2>使いかた</h2>
6
8
 
7
- Gitのような複雑なシステムは使い方がわからなくて苦労する。
8
- ある程度使い方を知っている場合でも
9
- あまり標準的でない操作は難しい。
10
- たとえば以下のような場合は
11
- どういうコマンドを使えばいいだろうか?
12
-
13
- * README.mdは3日前からどう変わった?
14
- * 3日前のREADME.mdを見たい
15
- * package.jsonからcoffeeという名前が消えたのはいつ?
16
- * ここ1週間ぐらい変更されてないファイルは?
17
- * 最近最も大量に修正したファイルはどれだっけ?
18
-
19
- 複雑なシステムにはヘルプやマニュアルが用意されているのが普通だし、
20
- FAQや逆引き辞典が用意されていることもあるし、
21
- 答がWebでみつかることもあるが、
22
- うまく検索できないことも多いし、
23
- やり方がわかった場合でも
24
- キーワードやパラメタを指定して実行しなおす必要があるので手間がかかる。
25
- ***このような問題を[ExpandHelp](http://www.interaction-ipsj.org/archives/paper2012/data/Interaction2012/oral/data/pdf/12INT012.pdf)で解決する。***
26
-
27
- ### 利用例
28
-
29
- Gitに関連するタスクのキーワードやパラメタを指定すると
30
- 候補のリストが表示され、選択すると実行される。
31
-
32
- * ```README``` ```8``` ```比較``` のような引数を指定して```githelp```コマンドを起動すると以下のような候補リストが提示される
33
-
34
- ```
35
- $ githelp README 8 比較
36
- [0] 「README.md」ファイルを8分前のものと比較する
37
- % git diff HEAD "@{8 minutes ago}" README.md
38
- [1] 「README.md」ファイルを8時間前のものと比較する
39
- % git diff HEAD "@{8 hours ago}" README.md
40
- [2] 「README.md」ファイルを8日前のものと比較する
41
- % git diff HEAD "@{8 days ago}" README.md
42
- $
43
- ```
44
-
45
- * ```-x``` オプションで```2```のような数字を指定すると実行できる
46
-
47
-
48
- ```
49
- $ githelp README 8 比較 -x2
50
- diff --git a/README.md b/README.md
51
- index 862f185..34c8907 100644
52
- --- a/README.md
53
- +++ b/README.md
54
- @@ -1,90 +1,3 @@
55
- # GitHelp
56
-
57
- -**Gitのコマンドの使いこなしを支援する**
58
- -
59
- -### 解決したい問題
60
- ...
61
- ```
62
-
63
- * ```-i``` オプションを指定すると対話的に選択できる
64
-
65
- ### インストール
66
-
67
- ```
68
- % gem install githelp
69
- ```
70
-
71
- ### 実装
72
-
73
- * [re_expand](https://github.com/masui/expand_ruby)
74
- という正規表現展開ライブラリを利用
75
- * [```data```](https://github.com/masui/GitHelp/tree/master/data)ディレクトリの下に**問題パタン**と**解決コマンド**を並べたものを用意しておく
76
-
77
- ```
78
- [
79
- "「(#{files.join('|')})」ファイルを(#{numbers.join('|')})分前の(もの|バージョン)と比較する",
80
- 'git diff HEAD "@{#{$2} minutes ago}" #{$1}'
81
- ],
82
- ```
83
-
84
- * ファイル名にマッチする引数(e.g. ```README```)や
85
- 数字にマッチする引数(e.g. ```8```)が指定されると1行目の記述にマッチすることになる
86
- * ワンライナーでは難しい場合は [```exe```](https://github.com/masui/GitHelp/tree/master/exe) の下にヘルパーコマンドを用意する (e.g. [```exe/githelp-changed```](https://github.com/masui/GitHelp/tree/master/exe/githelp-changed) )
87
-
88
- ### 解説
89
-
90
- * ExpandHelp方式とは、
91
- 様々なタスクの説明と実際の操作を組にして記述しておき、
92
- ユーザが与えたキーワードやパラメタにマッチするものを
93
- リストして実行可能にするというものである。
94
- * いろんなクエリに対応できるようにするため説明は正規表現で記述しておく。
95
- たとえばシステムの時刻をセットする機能の説明は```(時計|時刻|時間)を((設定|セット)する|あわせる)```
96
- のような正規表現で記述しておくことにより、```時刻をセットする``` ```時間をあわせる```
97
- などのクエリにマッチするようにする。
98
- * 「README.mdを消す方法」はマニュアルには書いてない。
99
- 「ファイルを消す方法」しか書いてない。
100
- ファイルを消す方法を知った後で「README.md」を指定して実行する必要がある。
101
- * そういえば先日「らくらくホン」画面上の鬱陶しい「羊」を消す方法が全くわからなかったのだが、あれは「マチキャラ」と呼ばれるものなので「マチキャラ」を消すという操作が必要だった。「羊 消す」とか「消す」とかで消せるべきだろう。githelpでは ```$ githelp 削除``` と入力すれば削除関連で何ができるのかわかる。
102
- * ヘルプといえば人工知能的なアプローチの方がトレンドかもしれないが、
103
- 本方式だと
104
- 自分が何をやりたいのかはっきりわかってない場合でも使えるし、
105
- 正しいセンテンスを正確に入力したり発声したりする必要がないから楽だと思う。
106
- 予測入力に近いといえるかもしれない。
107
- * **Gitは単なる適用例であり、広い範囲で使いたいと思っている。**
108
-
109
-
110
- ### お願い
111
-
112
- * [データ](https://github.com/masui/GitHelp/tree/master/data)が全然足りないので、足すべきデータを教えて下さい。
113
- issueでもプルリクでも@masuiへのツイートでもいいです。
114
-
115
- ### 注意
116
-
117
- * Gitリポジトリのディレクトリで実行して下さい
118
- * [re_expand](https://github.com/masui/expand_ruby)の実装が富豪的なので大きなリポジトリだと不具合があるかもしれません
119
-
120
- ### 関連システム
121
-
122
- * [AnyCode](http://dl.acm.org/citation.cfm?id=2814295)
123
-
124
- * 自然言語キーワードからJavaスニペットを検索する
125
- * ```copy fileA fileB``` みたいなキーワードから ```FileUtil.copyFile(new File(fileA), new File(fileB))``` みたいなコード候補を生成する
9
+ <ul>
10
+ <li><code>% githelp キーワード</code></li>
11
+ <li><code>gh</code>を使うのがおすすめ (<code>peco</code>が必要)</li>
12
+ </ul>
data/bin/gh ADDED
@@ -0,0 +1,2 @@
1
+ #!/bin/bash
2
+ eval `githelp $* | peco`
data/exe/getghdata ADDED
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- ruby -*-
3
+
4
+ require 'net/https'
5
+ require 'json'
6
+ require 'uri'
7
+ require 'cgi'
8
+ require 'json'
9
+
10
+ class GitHelp
11
+ DATAFILE = File.expand_path("~/.githelp")
12
+
13
+ def initialize
14
+ @pagedata = {}
15
+ end
16
+
17
+ # ページタイトルのリストを取得
18
+ def gettitles
19
+ uri = URI.parse("https://scrapbox.io/api/pages/GitHelp")
20
+ http = Net::HTTP.new(uri.host, uri.port)
21
+ http.use_ssl = true
22
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
23
+ req = Net::HTTP::Get.new(uri.path)
24
+ res = http.request(req)
25
+ JSON.parse(res.body)['pages'].collect { |page|
26
+ page['title']
27
+ }
28
+ end
29
+
30
+ # それぞれのページに対して処理
31
+ def getpage(title)
32
+ puts title
33
+ uri = URI.parse("https://scrapbox.io/api/pages/GitHelp/#{URI.encode(title).gsub(/\//,'%2f')}/text") # a/b みたいなタイトルのとき困る
34
+ http = Net::HTTP.new(uri.host, uri.port)
35
+ http.use_ssl = true
36
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
37
+ req = Net::HTTP::Get.new(uri.path)
38
+ res = http.request(req)
39
+ text = res.body
40
+ text.force_encoding("utf-8")
41
+ # puts text
42
+ # @pagedata[title] = CGI.unescape(text).split(/\n/)
43
+ @pagedata[title] = text.split(/\n/)
44
+ end
45
+
46
+ def process
47
+ #
48
+ # ページデータ取得
49
+ #
50
+ gettitles.each { |title|
51
+ getpage title
52
+ }
53
+
54
+ dumpdata = {}
55
+ dumpdata['codes'] = []
56
+ dumpdata['defs'] = []
57
+
58
+ #
59
+ # 関数/定数を評価"
60
+ #
61
+ puts "-----------------関数/定数を取得"
62
+ @pagedata.each { |title,pagedata|
63
+ puts title
64
+ pagedata. each { |line|
65
+ if line =~ /code:(.*)\.rb$/ then
66
+ puts "==========="
67
+ uri = URI.parse("https://scrapbox.io/api/code/GitHelp/#{URI.encode(title)}/#{$1}.rb")
68
+ http = Net::HTTP.new(uri.host, uri.port)
69
+ http.use_ssl = true
70
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
71
+ req = Net::HTTP::Get.new(uri.path)
72
+ res = http.request(req)
73
+ # puts CGI.unescape(res.body)
74
+ text = res.body
75
+ text.force_encoding('utf-8')
76
+ dumpdata['codes'] << text
77
+ end
78
+ }
79
+ }
80
+ puts "-----------------GitHelpデータを検出"
81
+ @pagedata.each { |title,pagedata|
82
+ puts "...#{title}"
83
+ pagedata.each { |line|
84
+ puts line
85
+ if line =~ /^\s*[\$\%]/
86
+ puts line
87
+ line.force_encoding("utf-8")
88
+ dumpdata['defs'] << line
89
+ end
90
+ }
91
+ }
92
+
93
+ File.open(DATAFILE,"w"){ |f|
94
+ f.puts dumpdata.to_json
95
+ }
96
+ end
97
+ end
98
+
99
+ githelp = GitHelp.new
100
+ githelp.process
data/exe/githelp CHANGED
@@ -1,79 +1,54 @@
1
1
  #!/usr/bin/env ruby
2
- # coding: utf-8
3
- #
4
- # GitHelp: ExpandHelpでGitを使いこなす
5
- #
6
- # % githelp # usage
7
- # % githelp README 8時間 比較 # マッチする候補を表示
8
- # % githelp -i README 8時間 比較 # マッチする候補を表示して選択
9
- #
10
2
 
11
- # 追加すべきデータはdata.txtに書く
3
+ include Githelp
12
4
 
13
- require "githelp"
14
- require "bundler/setup"
5
+ require 're_expand'
6
+ require 'json'
15
7
 
16
- include Githelp
8
+ DATAFILE = File.expand_path("~/.githelp")
17
9
 
18
- unless git_check
19
- STDERR.puts "Use 'githelp' in a Git repository."
20
- exit
21
- end
10
+ data = JSON.parse(File.read(DATAFILE))
22
11
 
23
- progpath = $0
24
- if File.symlink?(progpath)
25
- progpath = File.readlink(progpath)
26
- end
27
- progdir = "#{File.dirname(progpath)}"
12
+ #
13
+ # 関数定義などをeval
14
+ #
15
+ data['codes'].each { |code|
16
+ eval code
17
+ }
28
18
 
29
- opt_i = false
30
- opt_x = nil
31
- i = 0
32
- ARGV.dup.each { |arg|
33
- if arg == "-i"
34
- opt_i = true
35
- ARGV.delete_at(i)
36
- elsif opt_x == ''
37
- opt_x = arg.to_i
38
- ARGV.delete_at(i)
39
- elsif arg =~ /^-x(\d*)/
40
- if $1.to_s != ''
41
- opt_x = $1.to_i
42
- else
43
- opt_x = ''
44
- end
45
- ARGV.delete_at(i)
46
- else
47
- i += 1
19
+ g = ExpandRuby::Generator.new # re_expandのジェネレータ
20
+
21
+ #
22
+ # GitHelpエントリ
23
+ #
24
+ lines = []
25
+
26
+ data['defs'].each { |line|
27
+ if line =~ /^\s*\$\s*(.*)$/ # $....
28
+ lines << $1
29
+ elsif line =~ /^\s*\%\s*(.*)$/ # %....
30
+ cmd = $1
31
+ lines.each { |l|
32
+ desc = eval('"' + l + '"')
33
+ g.add desc.force_encoding('utf-8'), cmd.force_encoding('utf-8')
34
+ }
35
+ lines = []
48
36
  end
49
37
  }
50
38
 
51
- list = githelp(" #{args.join(' ')} ")
52
- if opt_x then
53
- cmd = list[opt_x][1]
54
- STDERR.puts cmd
55
- system "PATH=$PATH:#{progdir}/bin; (#{cmd})"
56
- exit
57
- else
58
- IO.popen("more","w"){ |f|
59
- list.each_with_index { |entry,ind|
60
- f.puts "[#{ind}] #{entry[0]}"
61
- f.puts " % " + entry[1]
62
- }
63
- }
64
- end
39
+ res = g.generate " #{args.join(' ')} "
65
40
 
66
- if opt_i then
67
- if list.length > 0 then
68
- print "実行するコマンドの番号を入力して下さい > "
69
- s = STDIN.readline
70
- if s =~ /[0-9]/ then
71
- i = s.to_i
72
- if i >= 0 && i < list.length then
73
- cmd = list[i][1]
74
- STDERR.puts cmd
75
- system "PATH=$PATH:#{progdir}/bin; (#{cmd})"
76
- end
77
- end
41
+ listed = {}
42
+ list = res[0].find_all { |a| # 0 ambig
43
+ if listed[a[1]]
44
+ false
45
+ else
46
+ listed[a[1]] = true
78
47
  end
79
- end
48
+ }
49
+
50
+ list.each_with_index { |entry,ind|
51
+ puts "#[#{ind}] #{entry[0]}"
52
+ puts " #{entry[1]}"
53
+ }
54
+
data/getdata ADDED
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- ruby -*-
3
+
4
+ require 'net/https'
5
+ require 'json'
6
+ require 'uri'
7
+ require 'cgi'
8
+ require 'json'
9
+
10
+ class GitHelp
11
+ DATAFILE = File.expand_path("~/.githelp")
12
+
13
+ def initialize
14
+ @pagedata = {}
15
+ end
16
+
17
+ # ページタイトルのリストを取得
18
+ def gettitles
19
+ uri = URI.parse("https://scrapbox.io/api/pages/GitHelp")
20
+ http = Net::HTTP.new(uri.host, uri.port)
21
+ http.use_ssl = true
22
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
23
+ req = Net::HTTP::Get.new(uri.path)
24
+ res = http.request(req)
25
+ JSON.parse(res.body)['pages'].collect { |page|
26
+ page['title']
27
+ }
28
+ end
29
+
30
+ # それぞれのページに対して処理
31
+ def getpage(title)
32
+ puts title
33
+ uri = URI.parse("https://scrapbox.io/api/pages/GitHelp/#{URI.encode(title).gsub(/\//,'%2f')}/text") # a/b みたいなタイトルのとき困る
34
+ http = Net::HTTP.new(uri.host, uri.port)
35
+ http.use_ssl = true
36
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
37
+ req = Net::HTTP::Get.new(uri.path)
38
+ res = http.request(req)
39
+ text = res.body
40
+ text.force_encoding("utf-8")
41
+ # puts text
42
+ # @pagedata[title] = CGI.unescape(text).split(/\n/)
43
+ @pagedata[title] = text.split(/\n/)
44
+ end
45
+
46
+ def process
47
+ #
48
+ # ページデータ取得
49
+ #
50
+ gettitles.each { |title|
51
+ getpage title
52
+ }
53
+
54
+ dumpdata = {}
55
+ dumpdata['codes'] = []
56
+ dumpdata['defs'] = []
57
+
58
+ #
59
+ # 関数/定数を評価"
60
+ #
61
+ puts "-----------------関数/定数を取得"
62
+ @pagedata.each { |title,pagedata|
63
+ puts title
64
+ pagedata. each { |line|
65
+ if line =~ /code:(.*)\.rb$/ then
66
+ puts "==========="
67
+ uri = URI.parse("https://scrapbox.io/api/code/GitHelp/#{URI.encode(title)}/#{$1}.rb")
68
+ http = Net::HTTP.new(uri.host, uri.port)
69
+ http.use_ssl = true
70
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
71
+ req = Net::HTTP::Get.new(uri.path)
72
+ res = http.request(req)
73
+ # puts CGI.unescape(res.body)
74
+ text = res.body
75
+ text.force_encoding('utf-8')
76
+ dumpdata['codes'] << text
77
+ end
78
+ }
79
+ }
80
+ puts "-----------------GitHelpデータを検出"
81
+ @pagedata.each { |title,pagedata|
82
+ puts "...#{title}"
83
+ pagedata.each { |line|
84
+ puts line
85
+ if line =~ /^\s*[\$\%]/
86
+ puts line
87
+ line.force_encoding("utf-8")
88
+ dumpdata['defs'] << line
89
+ end
90
+ }
91
+ }
92
+
93
+ File.open(DATAFILE,"w"){ |f|
94
+ f.puts dumpdata.to_json
95
+ }
96
+ end
97
+ end
98
+
99
+ githelp = GitHelp.new
100
+ githelp.process