git-graph 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +6 -0
- data/Rakefile +6 -0
- data/Readme.md +51 -0
- data/bin/git-graph +108 -0
- data/gem-public_cert.pem +20 -0
- data/git-graph.gemspec +16 -0
- data/lib/git/graph.rb +6 -0
- data/lib/git/graph/version.rb +5 -0
- data/spec/git/graph_spec.rb +106 -0
- data/spec/spec_helper.rb +1 -0
- metadata +106 -0
- metadata.gz.sig +2 -0
data.tar.gz.sig
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/Readme.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
Make graphs from your git history
|
2
|
+
|
3
|
+
Install
|
4
|
+
=======
|
5
|
+
|
6
|
+
gem install git-graph
|
7
|
+
|
8
|
+
Usage
|
9
|
+
=====
|
10
|
+
|
11
|
+
```Bash
|
12
|
+
# number of lines in the readme as csv
|
13
|
+
git-graph --interval day --output csv "cat Readme.md | wc -l"
|
14
|
+
2013-02-01,24
|
15
|
+
2013-01-31,24
|
16
|
+
2013-01-31,22
|
17
|
+
...
|
18
|
+
```
|
19
|
+
|
20
|
+
```Bash
|
21
|
+
# number of lines in the readme as line-chart (via google charts)
|
22
|
+
git-graph --interval year --output chart "cat Gemfile.lock | grep DEPENDENCIES -A 999 | wc -l"
|
23
|
+
```
|
24
|
+
![Chart](http://chart.apis.google.com/chart?chs=600x500&cht=lc&chxt=x,y&chxl=0:|2010-03-10|2013-03-09|1:|0|97&chd=s:Aos9&chdl=value&chtt=git-graph)
|
25
|
+
|
26
|
+
```Bash
|
27
|
+
# number of gems the project depends on
|
28
|
+
git-graph --interval year --output chart "cat Gemfile.lock | grep DEPENDENCIES -A 999 | wc -l"
|
29
|
+
|
30
|
+
# number of lines of code
|
31
|
+
git-graph --interval year --output chart "find . -name '*.rb' | xargs wc -l | tail -1"
|
32
|
+
|
33
|
+
# application startup time
|
34
|
+
git-graph --interval year --bundle --output chart '(time -p bundle exec rails runner) 2>&1 | grep real | tail -1 | cut -d " " -f 2'
|
35
|
+
```
|
36
|
+
|
37
|
+
If the script fails the previous output is assumed.
|
38
|
+
|
39
|
+
TODO
|
40
|
+
====
|
41
|
+
- interval month -> first of every month ?
|
42
|
+
- interval year -> same day on every year (leap-year adjustment)
|
43
|
+
- refactor into a class
|
44
|
+
- [spark](https://github.com/topfunky/sparklines) chart ?
|
45
|
+
|
46
|
+
Author
|
47
|
+
======
|
48
|
+
[Michael Grosser](http://grosser.it)<br/>
|
49
|
+
michael@grosser.it<br/>
|
50
|
+
License: MIT<br/>
|
51
|
+
[![Build Status](https://travis-ci.org/grosser/git_graph.png)](https://travis-ci.org/grosser/git_graph)
|
data/bin/git-graph
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
|
4
|
+
require 'git/graph'
|
5
|
+
require 'time'
|
6
|
+
|
7
|
+
options = {}
|
8
|
+
OptionParser.new do |opts|
|
9
|
+
opts.banner = <<BANNER
|
10
|
+
Make graphs from your git history.
|
11
|
+
|
12
|
+
Usage:
|
13
|
+
git-graph --interval day --output csv "cat Readme.md | wc -l"
|
14
|
+
|
15
|
+
Options:
|
16
|
+
BANNER
|
17
|
+
opts.on("-s", "--start DATA", "Start date (default: today)") { |date| options[:start] = Time.parse(date) }
|
18
|
+
opts.on("-e", "--end DATA", "End date (default: time of first commit)") { |date| options[:end] = Time.parse(date) }
|
19
|
+
opts.on("-o", "--output FORMAT", "Output format - csv|chart") { |format| options[:format] = format }
|
20
|
+
opts.on("-i", "--interval INTERVAL", "Interval of git history - year|week|day)") { |interval| options[:interval] = interval }
|
21
|
+
opts.on("-b", "--bundle", "Bundle before running command") { options[:bundle] = true }
|
22
|
+
opts.on("-h", "--help","Show this.") { puts opts; exit }
|
23
|
+
opts.on('-v', '--version','Show Version'){ puts Git::Graph::VERSION; exit}
|
24
|
+
end.parse!
|
25
|
+
|
26
|
+
raise "Give me 1 command" if ARGV.size != 1
|
27
|
+
|
28
|
+
def run(cmd)
|
29
|
+
all = ""
|
30
|
+
$stderr.puts cmd
|
31
|
+
IO.popen(cmd) do |pipe|
|
32
|
+
while str = pipe.gets
|
33
|
+
all << str
|
34
|
+
$stderr.puts str
|
35
|
+
end
|
36
|
+
end
|
37
|
+
[$?.success?, all]
|
38
|
+
end
|
39
|
+
|
40
|
+
def run!(command)
|
41
|
+
result = run(command)
|
42
|
+
raise "Command failed #{command}" unless result.first
|
43
|
+
result
|
44
|
+
end
|
45
|
+
|
46
|
+
def without_bundler(&block)
|
47
|
+
if defined?(Bundler)
|
48
|
+
Bundler.with_clean_env(&block)
|
49
|
+
else
|
50
|
+
yield
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
start = (options[:start] || Time.now)
|
55
|
+
finish = (options[:end] || Time.at(run!("git log --reverse --format='%at' | head -1").last.to_i))
|
56
|
+
current = start
|
57
|
+
raise "Backwards" if start < finish
|
58
|
+
|
59
|
+
data = {}
|
60
|
+
|
61
|
+
DAY = 24*60*60
|
62
|
+
INTERVALS = {
|
63
|
+
"day" => DAY,
|
64
|
+
"week" => 7 * DAY,
|
65
|
+
"year" => 365 * DAY
|
66
|
+
}
|
67
|
+
|
68
|
+
interval = INTERVALS[options[:interval] || "year"]
|
69
|
+
|
70
|
+
while current > finish
|
71
|
+
date = current.strftime("%Y-%m-%d")
|
72
|
+
command = [
|
73
|
+
"git checkout `git rev-list -n 1 --before='#{date}' master`",
|
74
|
+
("bundle check || bundle" if options[:bundle]),
|
75
|
+
ARGV.first
|
76
|
+
].compact
|
77
|
+
success, output = without_bundler { run(command.map { |c| "(#{c})" }.join(" && ")) }
|
78
|
+
data[date] = if success
|
79
|
+
value = output.split("\n").last.strip
|
80
|
+
value =~ /^\d+\.\d+$/ ? value.to_f : value.to_i
|
81
|
+
else
|
82
|
+
data.values.last || 0
|
83
|
+
end
|
84
|
+
current -= interval
|
85
|
+
end
|
86
|
+
|
87
|
+
case options[:format]
|
88
|
+
when nil, "csv"
|
89
|
+
puts "Date,value"
|
90
|
+
data.map do |date, value|
|
91
|
+
puts "#{date},#{value}"
|
92
|
+
end
|
93
|
+
when "chart"
|
94
|
+
require "google_chart"
|
95
|
+
title = "git-graph"
|
96
|
+
dates = data.keys.reverse
|
97
|
+
values = data.values.reverse
|
98
|
+
url = GoogleChart::LineChart.new('600x500', title, false) do |line|
|
99
|
+
line.data("value", values)
|
100
|
+
line.axis :x, :labels => [dates.first, dates.last]
|
101
|
+
line.axis :y, :labels => ['0', values.max]
|
102
|
+
end.to_url
|
103
|
+
puts url
|
104
|
+
else
|
105
|
+
raise "Format #{options[:format]} unknonw"
|
106
|
+
end
|
107
|
+
|
108
|
+
run("git checkout master")
|
data/gem-public_cert.pem
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDMjCCAhqgAwIBAgIBADANBgkqhkiG9w0BAQUFADA/MRAwDgYDVQQDDAdtaWNo
|
3
|
+
YWVsMRcwFQYKCZImiZPyLGQBGRYHZ3Jvc3NlcjESMBAGCgmSJomT8ixkARkWAml0
|
4
|
+
MB4XDTEzMDIwMzE4MTMxMVoXDTE0MDIwMzE4MTMxMVowPzEQMA4GA1UEAwwHbWlj
|
5
|
+
aGFlbDEXMBUGCgmSJomT8ixkARkWB2dyb3NzZXIxEjAQBgoJkiaJk/IsZAEZFgJp
|
6
|
+
dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMorXo/hgbUq97+kII9H
|
7
|
+
MsQcLdC/7wQ1ZP2OshVHPkeP0qH8MBHGg6eYisOX2ubNagF9YTCZWnhrdKrwpLOO
|
8
|
+
cPLaZbjUjljJ3cQR3B8Yn1veV5IhG86QseTBjymzJWsLpqJ1UZGpfB9tXcsFtuxO
|
9
|
+
6vHvcIHdzvc/OUkICttLbH+1qb6rsHUceqh+JrH4GrsJ5H4hAfIdyS2XMK7YRKbh
|
10
|
+
h+IBu6dFWJJByzFsYmV1PDXln3UBmgAt65cmCu4qPfThioCGDzbSJrGDGLmw/pFX
|
11
|
+
FPpVCm1zgYSb1v6Qnf3cgXa2f2wYGm17+zAVyIDpwryFru9yF/jJxE38z/DRsd9R
|
12
|
+
/88CAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQUsiNnXHtKeMYYcr4yJVmQ
|
13
|
+
WONL+IwwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQAlyN7kKo/NQCQ0
|
14
|
+
AOzZLZ3WAePvStkCFIJ53tsv5Kyo4pMAllv+BgPzzBt7qi605mFSL6zBd9uLou+W
|
15
|
+
Co3s48p1dy7CjjAfVQdmVNHF3MwXtfC2OEyvSQPi4xKR8iba8wa3xp9LVo1PuLpw
|
16
|
+
/6DsrChWw74HfsJN6qJOK684hJeT8lBYAUfiC3wD0owoPSg+XtyAAddisR+KV5Y1
|
17
|
+
NmVHuLtQcNTZy+gRht3ahJRMuC6QyLmkTsf+6MaenwAMkAgHdswGsJztOnNnBa3F
|
18
|
+
y0kCSWmK6D+x/SbfS6r7Ke07MRqziJdB9GuE1+0cIRuFh8EQ+LN6HXCKM5pon/GU
|
19
|
+
ycwMXfl0
|
20
|
+
-----END CERTIFICATE-----
|
data/git-graph.gemspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
2
|
+
name = "git-graph"
|
3
|
+
require "#{name.gsub("-","/")}/version"
|
4
|
+
|
5
|
+
Gem::Specification.new name, Git::Graph::VERSION do |s|
|
6
|
+
s.summary = "Make graphs from your git history"
|
7
|
+
s.authors = ["Michael Grosser"]
|
8
|
+
s.email = "michael@grosser.it"
|
9
|
+
s.homepage = "http://github.com/grosser/#{name}"
|
10
|
+
s.files = `git ls-files`.split("\n")
|
11
|
+
s.license = "MIT"
|
12
|
+
s.signing_key = File.expand_path("~/.ssh/gem-private_key.pem")
|
13
|
+
s.cert_chain = ["gem-public_cert.pem"]
|
14
|
+
s.executables = ["git-graph"]
|
15
|
+
s.add_runtime_dependency "gchartrb"
|
16
|
+
end
|
data/lib/git/graph.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "tmpdir"
|
3
|
+
|
4
|
+
describe Git::Graph do
|
5
|
+
it "has a VERSION" do
|
6
|
+
Git::Graph::VERSION.should =~ /^[\.\da-z]+$/
|
7
|
+
end
|
8
|
+
|
9
|
+
context "CLI" do
|
10
|
+
def run(command, options={})
|
11
|
+
result = `#{command}`
|
12
|
+
raise "FAILED #{command}\n#{result}" if $?.success? == !!options[:fail]
|
13
|
+
result
|
14
|
+
end
|
15
|
+
|
16
|
+
def graph(command)
|
17
|
+
run "ruby #{Bundler.root.join("bin/git-graph")} #{command}"
|
18
|
+
end
|
19
|
+
|
20
|
+
before :all do
|
21
|
+
run("rm -rf #{Bundler.root.join("tmp/parallel")}")
|
22
|
+
run("cd #{Bundler.root.join("tmp")} && git clone git@github.com:grosser/parallel.git 2>&1")
|
23
|
+
end
|
24
|
+
|
25
|
+
around do |example|
|
26
|
+
Dir.chdir(Bundler.root.join("tmp/parallel")) do
|
27
|
+
run("git co master 2>&1")
|
28
|
+
example.call
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it "shows help" do
|
33
|
+
graph("--help").should include("-i, --interval INTERVAL")
|
34
|
+
end
|
35
|
+
|
36
|
+
it "shows version" do
|
37
|
+
graph("--version").should include(Git::Graph::VERSION)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "graphs years in csv without any arguments" do
|
41
|
+
result = graph("'cat lib/parallel.rb | wc -l' 2>/dev/null")
|
42
|
+
result.should include("2012-")
|
43
|
+
result.should include("2011-")
|
44
|
+
end
|
45
|
+
|
46
|
+
it "graphs years in csv" do
|
47
|
+
result = graph("--start 2013-01-01 'cat lib/parallel.rb | wc -l' 2>/dev/null")
|
48
|
+
result.should == <<-EXPECTED.gsub(/^\s+/, "")
|
49
|
+
Date,value
|
50
|
+
2013-01-01,331
|
51
|
+
2012-01-02,280
|
52
|
+
2011-01-02,258
|
53
|
+
2010-01-02,116
|
54
|
+
EXPECTED
|
55
|
+
end
|
56
|
+
|
57
|
+
it "graphs weeks in csv" do
|
58
|
+
result = graph("--start 2013-01-01 --end 2012-10-01 --interval week 'cat lib/parallel.rb | wc -l' 2>/dev/null")
|
59
|
+
result.should == <<-EXPECTED.gsub(/^\s+/, "")
|
60
|
+
Date,value
|
61
|
+
2013-01-01,331
|
62
|
+
2012-12-25,331
|
63
|
+
2012-12-18,331
|
64
|
+
2012-12-11,310
|
65
|
+
2012-12-04,310
|
66
|
+
2012-11-27,310
|
67
|
+
2012-11-20,301
|
68
|
+
2012-11-13,296
|
69
|
+
2012-11-06,296
|
70
|
+
2012-10-30,296
|
71
|
+
2012-10-23,296
|
72
|
+
2012-10-16,296
|
73
|
+
2012-10-09,296
|
74
|
+
2012-10-02,289
|
75
|
+
EXPECTED
|
76
|
+
end
|
77
|
+
|
78
|
+
it "fills in missing values with the last value" do
|
79
|
+
# this file is not present pre 2011 -> error
|
80
|
+
result = graph("--start 2013-01-01 'wc -l lib/parallel/version.rb' 2>/dev/null")
|
81
|
+
result.should == <<-EXPECTED.gsub(/^\s+/, "")
|
82
|
+
Date,value
|
83
|
+
2013-01-01,3
|
84
|
+
2012-01-02,3
|
85
|
+
2011-01-02,3
|
86
|
+
2010-01-02,3
|
87
|
+
EXPECTED
|
88
|
+
end
|
89
|
+
|
90
|
+
it "generates a chart" do
|
91
|
+
result = graph("--start 2013-01-01 --output chart 'cat lib/parallel.rb | wc -l' 2>/dev/null")
|
92
|
+
result.should include("http://chart.apis.google.com/chart?")
|
93
|
+
result.should include("")
|
94
|
+
end
|
95
|
+
|
96
|
+
it "returns to original commit after run" do
|
97
|
+
graph("--start 2013-01-01 'cat lib/parallel.rb | wc -l' 2>/dev/null")
|
98
|
+
run("git branch | grep '*'").should == "* master\n"
|
99
|
+
end
|
100
|
+
|
101
|
+
it "can bundle" do
|
102
|
+
result = graph(%Q{--bundle --start 2013-01-01 '(time -p bundle exec ruby -e "sleep 0.1") 2>&1 | grep real | cut -d " " -f 2' 2>&1})
|
103
|
+
result.should =~ /2013-01-01,\d\.\d+.*2012-01-02,\d\.\d+.*2011-01-02,\d\.\d+.*2010-01-02,\d\.\d+/m
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "git/graph"
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: git-graph
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michael Grosser
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain:
|
12
|
+
- !binary |-
|
13
|
+
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNakNDQWhxZ0F3SUJB
|
14
|
+
Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREEvTVJBd0RnWURWUVFEREFkdGFX
|
15
|
+
Tm8KWVdWc01SY3dGUVlLQ1pJbWlaUHlMR1FCR1JZSFozSnZjM05sY2pFU01C
|
16
|
+
QUdDZ21TSm9tVDhpeGtBUmtXQW1sMApNQjRYRFRFek1ESXdNekU0TVRNeE1W
|
17
|
+
b1hEVEUwTURJd016RTRNVE14TVZvd1B6RVFNQTRHQTFVRUF3d0hiV2xqCmFH
|
18
|
+
RmxiREVYTUJVR0NnbVNKb21UOGl4a0FSa1dCMmR5YjNOelpYSXhFakFRQmdv
|
19
|
+
SmtpYUprL0lzWkFFWkZnSnAKZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFB
|
20
|
+
RGdnRVBBRENDQVFvQ2dnRUJBTW9yWG8vaGdiVXE5NytrSUk5SApNc1FjTGRD
|
21
|
+
Lzd3UTFaUDJPc2hWSFBrZVAwcUg4TUJIR2c2ZVlpc09YMnViTmFnRjlZVENa
|
22
|
+
V25ocmRLcndwTE9PCmNQTGFaYmpVamxqSjNjUVIzQjhZbjF2ZVY1SWhHODZR
|
23
|
+
c2VUQmp5bXpKV3NMcHFKMVVaR3BmQjl0WGNzRnR1eE8KNnZIdmNJSGR6dmMv
|
24
|
+
T1VrSUN0dExiSCsxcWI2cnNIVWNlcWgrSnJINEdyc0o1SDRoQWZJZHlTMlhN
|
25
|
+
SzdZUktiaApoK0lCdTZkRldKSkJ5ekZzWW1WMVBEWGxuM1VCbWdBdDY1Y21D
|
26
|
+
dTRxUGZUaGlvQ0dEemJTSnJHREdMbXcvcEZYCkZQcFZDbTF6Z1lTYjF2NlFu
|
27
|
+
ZjNjZ1hhMmYyd1lHbTE3K3pBVnlJRHB3cnlGcnU5eUYvakp4RTM4ei9EUnNk
|
28
|
+
OVIKLzg4Q0F3RUFBYU01TURjd0NRWURWUjBUQkFJd0FEQWRCZ05WSFE0RUZn
|
29
|
+
UVVzaU5uWEh0S2VNWVljcjR5SlZtUQpXT05MK0l3d0N3WURWUjBQQkFRREFn
|
30
|
+
U3dNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFseU43a0tvL05RQ1EwCkFP
|
31
|
+
elpMWjNXQWVQdlN0a0NGSUo1M3RzdjVLeW80cE1BbGx2K0JnUHp6QnQ3cWk2
|
32
|
+
MDVtRlNMNnpCZDl1TG91K1cKQ28zczQ4cDFkeTdDampBZlZRZG1WTkhGM013
|
33
|
+
WHRmQzJPRXl2U1FQaTR4S1I4aWJhOHdhM3hwOUxWbzFQdUxwdwovNkRzckNo
|
34
|
+
V3c3NEhmc0pONnFKT0s2ODRoSmVUOGxCWUFVZmlDM3dEMG93b1BTZytYdHlB
|
35
|
+
QWRkaXNSK0tWNVkxCk5tVkh1THRRY05UWnkrZ1JodDNhaEpSTXVDNlF5TG1r
|
36
|
+
VHNmKzZNYWVud0FNa0FnSGRzd0dzSnp0T25ObkJhM0YKeTBrQ1NXbUs2RCt4
|
37
|
+
L1NiZlM2cjdLZTA3TVJxemlKZEI5R3VFMSswY0lSdUZoOEVRK0xONkhYQ0tN
|
38
|
+
NXBvbi9HVQp5Y3dNWGZsMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
|
39
|
+
date: 2013-03-10 00:00:00.000000000 Z
|
40
|
+
dependencies:
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: gchartrb
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ! '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
description:
|
58
|
+
email: michael@grosser.it
|
59
|
+
executables:
|
60
|
+
- git-graph
|
61
|
+
extensions: []
|
62
|
+
extra_rdoc_files: []
|
63
|
+
files:
|
64
|
+
- .travis.yml
|
65
|
+
- Gemfile
|
66
|
+
- Rakefile
|
67
|
+
- Readme.md
|
68
|
+
- bin/git-graph
|
69
|
+
- gem-public_cert.pem
|
70
|
+
- git-graph.gemspec
|
71
|
+
- lib/git/graph.rb
|
72
|
+
- lib/git/graph/version.rb
|
73
|
+
- spec/git/graph_spec.rb
|
74
|
+
- spec/spec_helper.rb
|
75
|
+
homepage: http://github.com/grosser/git-graph
|
76
|
+
licenses:
|
77
|
+
- MIT
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
hash: 3863793032351926901
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
hash: 3863793032351926901
|
100
|
+
requirements: []
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 1.8.24
|
103
|
+
signing_key:
|
104
|
+
specification_version: 3
|
105
|
+
summary: Make graphs from your git history
|
106
|
+
test_files: []
|
metadata.gz.sig
ADDED