git-age 0.1.3 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/Gemfile.lock +1 -1
- data/README.md +20 -0
- data/bin/git-age +20 -0
- data/lib/git/age/graph_cli.rb +4 -2
- data/lib/git/age/main.rb +40 -15
- data/lib/git/age/options.rb +4 -1
- data/lib/git/age/stats.rb +14 -2
- data/lib/git/age/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +6 -6
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7153be146820941b347da47c7f3e519f070a42011b4c58d12e91ceafc422de9e
|
4
|
+
data.tar.gz: 83199ea081e730fabd206fdd78adf07e4ca51695d5259cf9394c698430b1988f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88c39ceb771fdbd8d6112e49ed628a6052853f590216f0214511e5816539d6e20ae184fce2fd58ee50079964214f04e22e410e9f1cf48b1a9de534c170b6afb1
|
7
|
+
data.tar.gz: dede2a5a778e4edd18c438e153b2d268ac2d57619a9d42b6700a3c6905adac323ec6021f184859a3ec9299ffdb17373aad7cf90f86e2b188a68e2049a528c573
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -29,6 +29,10 @@ Usage: git-age [options]
|
|
29
29
|
-t, --title=TITLE Graphic title
|
30
30
|
-x, --xtitle=TITLE X axis title
|
31
31
|
-y, --ytitle=TITLE Y axis title
|
32
|
+
-c, --code=PATTERN Code dir pattern
|
33
|
+
-e, --test=PATTERN Test dir pattern
|
34
|
+
-y, --type=TYPE Graph type, default to bar
|
35
|
+
-v, --version Show version
|
32
36
|
```
|
33
37
|
|
34
38
|
Example:
|
@@ -37,9 +41,25 @@ Example:
|
|
37
41
|
$ git-age -o /tmp/data.csv -t 'Test project' -x 'Dates here' -y 'Lines here' -i /tmp/data.png
|
38
42
|
```
|
39
43
|
|
44
|
+
Sending a dir pattern as your test dir, creating a test column to compare:
|
45
|
+
|
46
|
+
```
|
47
|
+
$ git-age -o /tmp/data.csv -t 'Test project' -x 'Dates here' -y 'Lines here' -i /tmp/data.png -e test
|
48
|
+
```
|
49
|
+
|
50
|
+
If you're sending a test dir, it can be unfair if you don't also send a dir
|
51
|
+
pattern to your code dir, because all other files (configurations, temporary
|
52
|
+
files) will count as code and your code to test ratio will implode. So, sending
|
53
|
+
a code dir pattern:
|
54
|
+
|
55
|
+
```
|
56
|
+
$ git-age -o /tmp/data.csv -t 'Test project' -x 'Dates here' -y 'Lines here' -i /tmp/data.png -e test -c app
|
57
|
+
```
|
58
|
+
|
40
59
|
Supported image processors:
|
41
60
|
|
42
61
|
- [graph-cli](https://github.com/mcastorina/graph-cli)
|
62
|
+
Supports bar graphs (`-y bar`, default) and line graphs (`-y line`).
|
43
63
|
|
44
64
|
Example image:
|
45
65
|
|
data/bin/git-age
CHANGED
@@ -48,6 +48,26 @@ opts.on('-y', '--ytitle=TITLE', 'Y axis title') do |title|
|
|
48
48
|
options.ytitle = title
|
49
49
|
end
|
50
50
|
|
51
|
+
opts.on('-e', '--test=PATTERN', 'Test dir pattern') do |pattern|
|
52
|
+
STDOUT.puts "Using test dir pattern #{pattern}"
|
53
|
+
options.test = pattern
|
54
|
+
end
|
55
|
+
|
56
|
+
opts.on('-c', '--code=PATTERN', 'Code dir pattern') do |pattern|
|
57
|
+
STDOUT.puts "Using code dir pattern #{pattern}"
|
58
|
+
options.code = pattern
|
59
|
+
end
|
60
|
+
|
61
|
+
opts.on('-y', '--type=TYPE', 'Graph type, defaults to bar') do |type|
|
62
|
+
STDOUT.puts "Using graph type #{type}"
|
63
|
+
options.type = type
|
64
|
+
end
|
65
|
+
|
66
|
+
opts.on('-v', '--version', 'Show version') do
|
67
|
+
STDOUT.puts "Version #{Git::Age::VERSION}"
|
68
|
+
return
|
69
|
+
end
|
70
|
+
|
51
71
|
opts.parse!
|
52
72
|
|
53
73
|
Git::Age::Main.new.run
|
data/lib/git/age/graph_cli.rb
CHANGED
@@ -9,10 +9,12 @@ module Git
|
|
9
9
|
|
10
10
|
def self.create(input)
|
11
11
|
options = Git::Age::Options.instance
|
12
|
+
legend = options.test ? 'code' : ''
|
13
|
+
type = options.type == 'bar' ? '--bar' : ''
|
12
14
|
STDOUT.puts "Creating image #{options.image} ..."
|
13
15
|
|
14
|
-
cmd = "graph #{input}
|
15
|
-
|
16
|
+
cmd = "graph #{input} #{type} -o #{options.image} --title '#{options.title}' --xlabel='#{options.xtitle}' --ylabel='#{options.ytitle}' --xtick-fontsize 5 --time-format-output '%Y-%m' --legend='#{legend}' 2> /dev/null"
|
17
|
+
IO.popen(cmd) do |io|
|
16
18
|
io.read
|
17
19
|
end
|
18
20
|
end
|
data/lib/git/age/main.rb
CHANGED
@@ -9,9 +9,14 @@ module Git
|
|
9
9
|
def initialize
|
10
10
|
STDOUT.puts "Waiting, analysing your repository ..."
|
11
11
|
|
12
|
-
@dates = Hash.new
|
13
|
-
@files =
|
12
|
+
@dates = Hash.new { |hash, key| hash[key] = { code: 0, test: 0 } }
|
13
|
+
@files = fill_files
|
14
14
|
@winsize = IO.console.winsize
|
15
|
+
@test = Git::Age::Options.instance.test
|
16
|
+
@code = Git::Age::Options.instance.code
|
17
|
+
|
18
|
+
@test_regexp = @test ? %r{^#{@test}} : nil
|
19
|
+
@code_regexp = @code ? %r{^#{@code}} : nil
|
15
20
|
end
|
16
21
|
|
17
22
|
def run
|
@@ -22,10 +27,19 @@ module Git
|
|
22
27
|
show_stats
|
23
28
|
rescue => e
|
24
29
|
STDERR.puts "Error: #{e}"
|
30
|
+
puts e.backtrace
|
25
31
|
end
|
26
32
|
|
27
33
|
private
|
28
34
|
|
35
|
+
def file_type(file)
|
36
|
+
return :t if @test_regexp && file.match(@test_regexp)
|
37
|
+
|
38
|
+
return :c unless @code_regexp
|
39
|
+
|
40
|
+
@code_regexp && file.match(@code_regexp) ? :c : :u
|
41
|
+
end
|
42
|
+
|
29
43
|
def read_files
|
30
44
|
cnt = 0
|
31
45
|
total = @files.size
|
@@ -44,12 +58,14 @@ module Git
|
|
44
58
|
matches = line.match(/[\w^]+\s\([\w\s]+(?<date>\d{4}-\d{2})-\d{2}/)
|
45
59
|
next unless matches
|
46
60
|
|
47
|
-
|
61
|
+
type = file_type(file)
|
62
|
+
mapfile << "#{file}[#{type}]: #{line}\n" if mapfile
|
48
63
|
|
49
|
-
@dates[matches[:date]] += 1
|
64
|
+
@dates[matches[:date]][:test] += 1 if type == :t
|
65
|
+
@dates[matches[:date]][:code] += 1 if type == :c
|
50
66
|
end
|
51
|
-
rescue =>
|
52
|
-
print "Error on file: #{file}\r"
|
67
|
+
rescue => exc
|
68
|
+
print "Error on file: #{file}: #{exc}\r"
|
53
69
|
end
|
54
70
|
end
|
55
71
|
|
@@ -64,13 +80,17 @@ module Git
|
|
64
80
|
|
65
81
|
def create_csv
|
66
82
|
output = Git::Age::Options.instance.output
|
67
|
-
STDOUT.puts "Creating CSV file #{output} ...".ljust(@winsize[1])
|
83
|
+
STDOUT.puts "Creating CSV file #{output} with #{@dates.size} lines ...".ljust(@winsize[1])
|
68
84
|
|
69
85
|
File.open(output, 'w') do |file|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
86
|
+
header = "\"date\",\"code\""
|
87
|
+
header << ",\"test\"" if @test
|
88
|
+
file << "#{header}\n"
|
89
|
+
|
90
|
+
@dates.each do |key, data|
|
91
|
+
line = "\"#{key}\",#{data[:code]}"
|
92
|
+
line << ",#{data[:test]}" if @test
|
93
|
+
file << "#{line}\n"
|
74
94
|
end
|
75
95
|
end
|
76
96
|
rescue => e
|
@@ -96,7 +116,7 @@ module Git
|
|
96
116
|
processor.create(options.output)
|
97
117
|
end
|
98
118
|
|
99
|
-
def
|
119
|
+
def fill_files
|
100
120
|
branch = Git::Age::Options.instance.branch
|
101
121
|
STDOUT.puts "Reading files info from #{branch} branch ..."
|
102
122
|
|
@@ -117,13 +137,18 @@ module Git
|
|
117
137
|
stats = Git::Age::Stats.new(self)
|
118
138
|
first = Date.parse(stats.first_commit)
|
119
139
|
last = Date.parse(stats.last_commit)
|
120
|
-
diff = (last - first).to_i
|
140
|
+
diff = (last - first).to_i + 1
|
121
141
|
ustats = stats.unchanged_stats
|
122
142
|
|
123
143
|
puts "First commit in: #{first}"
|
124
144
|
puts "Last commit in: #{last}"
|
125
|
-
puts "Repository
|
126
|
-
puts "Month with more lines unchanged: #{ustats[:bigger][:date]} (#{ustats[:bigger][:lines]} lines)"
|
145
|
+
puts "Repository has #{diff} days with commits"
|
146
|
+
puts "Month with more code lines unchanged: #{ustats[:bigger][:date]} (#{ustats[:bigger][:lines]} lines)"
|
147
|
+
|
148
|
+
if @test_regexp && @code_regexp
|
149
|
+
ratio = stats.code_to_test_ratio
|
150
|
+
puts "Code to test ratio: 1:#{ratio[:ratio]} (#{ratio[:code]}/#{ratio[:test]})"
|
151
|
+
end
|
127
152
|
end
|
128
153
|
end
|
129
154
|
end
|
data/lib/git/age/options.rb
CHANGED
@@ -4,7 +4,7 @@ module Git
|
|
4
4
|
module Age
|
5
5
|
class Options
|
6
6
|
include Singleton
|
7
|
-
attr_accessor :branch, :output, :title, :processor, :image, :xtitle, :ytitle, :map
|
7
|
+
attr_accessor :branch, :output, :title, :processor, :image, :xtitle, :ytitle, :map, :test, :code, :type
|
8
8
|
|
9
9
|
def initialize
|
10
10
|
@branch = 'master'
|
@@ -14,6 +14,9 @@ module Git
|
|
14
14
|
@image = 'git-age.png'
|
15
15
|
@xtitle = 'Dates'
|
16
16
|
@ytitle = 'Lines'
|
17
|
+
@test = nil
|
18
|
+
@code = nil
|
19
|
+
@type = 'bar'
|
17
20
|
@map = false
|
18
21
|
end
|
19
22
|
end
|
data/lib/git/age/stats.rb
CHANGED
@@ -14,8 +14,20 @@ module Git
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def unchanged_stats
|
17
|
-
max = @data.dates.max_by { |key, value| value }
|
18
|
-
{ bigger: { date: max[0], lines: max[1] } }
|
17
|
+
max = @data.dates.max_by { |key, value| value[:code] }
|
18
|
+
{ bigger: { date: max[0], lines: max[1][:code] } }
|
19
|
+
end
|
20
|
+
|
21
|
+
def code_to_test_ratio
|
22
|
+
stats = @data.dates.reduce({code: 0, test: 0}) do |memo, data|
|
23
|
+
memo[:code] += data[1][:code]
|
24
|
+
memo[:test] += data[1][:test]
|
25
|
+
memo
|
26
|
+
end
|
27
|
+
|
28
|
+
{ code: stats[:code], test: stats[:test], ratio: (stats[:test].to_f / stats[:code].to_f).round(2) }
|
29
|
+
rescue
|
30
|
+
{ code: 0, test: 0, ratio: 0.0 }
|
19
31
|
end
|
20
32
|
|
21
33
|
private
|
data/lib/git/age/version.rb
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-age
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eustaquio Rangel
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain:
|
11
11
|
- |
|
@@ -36,7 +36,7 @@ cert_chain:
|
|
36
36
|
7NRJmY9c84Zb3sCf0DV6UH+d2id9Dndp9ewchgDOSwGznt+oJmjDFZ9gYd8IP2Ol
|
37
37
|
1eLrW8x4LHV+EVEIaiVTvmKt
|
38
38
|
-----END CERTIFICATE-----
|
39
|
-
date: 2022-
|
39
|
+
date: 2022-12-22 00:00:00.000000000 Z
|
40
40
|
dependencies: []
|
41
41
|
description: Check all the repository files lines dates and group it by year and month,
|
42
42
|
allowing check how old code is still in use
|
@@ -70,7 +70,7 @@ licenses: []
|
|
70
70
|
metadata:
|
71
71
|
homepage_uri: https://github.com/taq/git-age
|
72
72
|
source_code_uri: https://github.com/taq/git-age
|
73
|
-
post_install_message:
|
73
|
+
post_install_message:
|
74
74
|
rdoc_options: []
|
75
75
|
require_paths:
|
76
76
|
- lib
|
@@ -85,8 +85,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
85
|
- !ruby/object:Gem::Version
|
86
86
|
version: '0'
|
87
87
|
requirements: []
|
88
|
-
rubygems_version: 3.3.
|
89
|
-
signing_key:
|
88
|
+
rubygems_version: 3.3.3
|
89
|
+
signing_key:
|
90
90
|
specification_version: 4
|
91
91
|
summary: Create a CSV file with line year and month from your Git repository
|
92
92
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|