githelp 0.1.4 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.config/peco/config.json +6 -0
- data/00README +8 -0
- data/Gemfile +2 -4
- data/Makefile +10 -0
- data/README.md +9 -122
- data/bin/gh +2 -0
- data/exe/getghdata +100 -0
- data/exe/githelp +42 -67
- data/getdata +100 -0
- data/githelp +57 -0
- metadata +13 -52
- data/LICENSE.txt +0 -21
- data/Rakefile +0 -10
- data/bin/console +0 -14
- data/bin/setup +0 -7
- data/data.txt +0 -12
- data/data/adddelete.rb +0 -10
- data/data/afteradd.rb +0 -16
- data/data/appear.rb +0 -16
- data/data/branch.rb +0 -33
- data/data/cat-file.rb +0 -19
- data/data/change.rb +0 -95
- data/data/checkout.rb +0 -27
- data/data/commit.rb +0 -7
- data/data/freq.rb +0 -13
- data/data/fresh.rb +0 -7
- data/data/grep.rb +0 -8
- data/data/ignore.rb +0 -11
- data/data/log.rb +0 -8
- data/data/ls-files.rb +0 -15
- data/data/mv.rb +0 -7
- data/data/removed.rb +0 -17
- data/data/reset.rb +0 -11
- data/data/rm.rb +0 -8
- data/data/shortlog.rb +0 -13
- data/data/show.rb +0 -7
- data/data/status.rb +0 -11
- data/data/tag.rb +0 -27
- data/exe/githelp-changed +0 -9
- data/exe/githelp-fileadded +0 -25
- data/exe/githelp-unchanged +0 -9
- data/githelp.gemspec +0 -28
- data/lib/githelp.rb +0 -51
- data/lib/githelp/args.rb +0 -17
- data/lib/githelp/branches.rb +0 -40
- data/lib/githelp/changes.rb +0 -36
- data/lib/githelp/files.rb +0 -27
- data/lib/githelp/git_check.rb +0 -15
- data/lib/githelp/glossary.rb +0 -17
- data/lib/githelp/numbers.rb +0 -14
- data/lib/githelp/params.rb +0 -17
- data/lib/githelp/patterns.rb +0 -20
- data/lib/githelp/tags.rb +0 -29
- data/lib/githelp/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cd3d9d689ca50ef940e6237b2d1327b3b6b551688eacd89f231d63a3eb83b5c5
|
4
|
+
data.tar.gz: 9199227423e521c9aa91affae0bc859a0a4e3a10ed5fe9962577292603d302c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56b47dc7fc76a995d438324ea731abd061fd0145d9a02cf93895414868689409561bd1ea814b18bd4be8b57518470646e73d9fb8cbfdea431a86c373d8820953
|
7
|
+
data.tar.gz: 5d9f7a365fdb10f9f111503a5ef12d386429014ee2b40ad70b0c341847bb91575682c6c7f973f6cd746de474f14cd27928b32bc2724d71b5378aa57a5c106a54
|
data/00README
ADDED
data/Gemfile
CHANGED
data/Makefile
ADDED
data/README.md
CHANGED
@@ -1,125 +1,12 @@
|
|
1
|
-
|
1
|
+
<h1>GitHelp</h1>
|
2
2
|
|
3
|
-
|
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
|
-
|
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
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
|
-
|
3
|
+
include Githelp
|
12
4
|
|
13
|
-
require
|
14
|
-
require
|
5
|
+
require 're_expand'
|
6
|
+
require 'json'
|
15
7
|
|
16
|
-
|
8
|
+
DATAFILE = File.expand_path("~/.githelp")
|
17
9
|
|
18
|
-
|
19
|
-
STDERR.puts "Use 'githelp' in a Git repository."
|
20
|
-
exit
|
21
|
-
end
|
10
|
+
data = JSON.parse(File.read(DATAFILE))
|
22
11
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
12
|
+
#
|
13
|
+
# 関数定義などをeval
|
14
|
+
#
|
15
|
+
data['codes'].each { |code|
|
16
|
+
eval code
|
17
|
+
}
|
28
18
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
elsif
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
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
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
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
|
-
|
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
|