git-age 0.1.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9ee1f171ee1fc257032663614b5b13ccadf62e2181450af785d45b98a5c91e17
4
+ data.tar.gz: 5607965e9be16da07a2d3a757cd8372fdf160e5263c897f51868179b6a310ebc
5
+ SHA512:
6
+ metadata.gz: 652a2263c2d1cac464b48fc98caeaaf0eb1af076fa06d14982fb2051f31e402a83e5fe73cb911de1111d868f190905d0dd8999ca02af3eda12345079fc2aea39
7
+ data.tar.gz: 9ba360f91613ca3928e02237ac232d9076d9ac92782f638ba85d3a95da7500b81dbc2c849abd62350d097c77f807665a1cae301fb2130d0e17230bc21c34a8ef
checksums.yaml.gz.sig ADDED
Binary file
data/.gitignore ADDED
@@ -0,0 +1,8 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ ---
2
+ language: ruby
3
+ cache: bundler
4
+ rvm:
5
+ - 2.6.3
6
+ before_install: gem install bundler -v 2.1.4
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in git-age.gemspec
4
+ gemspec
5
+
6
+ gem "rake", "~> 12.0"
7
+ gem "minitest", "~> 5.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,21 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ git-age (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ minitest (5.14.4)
10
+ rake (12.3.3)
11
+
12
+ PLATFORMS
13
+ ruby
14
+
15
+ DEPENDENCIES
16
+ git-age!
17
+ minitest (~> 5.0)
18
+ rake (~> 12.0)
19
+
20
+ BUNDLED WITH
21
+ 2.1.4
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # Git::Age
2
+
3
+ Would you like to know how many lines from the past still persists on your
4
+ repository? This gem can help with that.
5
+
6
+ It will create a CSV file with year, month and the line count from the specified
7
+ period.
8
+
9
+ Also, with some CLI graphic processor installed, it can create an image with a
10
+ graph showing the CSV data as a bar graph.
11
+
12
+ ## Installation
13
+
14
+ ```
15
+ $ gem install git-age
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ Go to your repository and run:
21
+
22
+ ```
23
+ Usage: git-age [options]
24
+ -o, --output=FILE Output file
25
+ -i, --image=FILE Image file
26
+ -g, --graph=PROCESSOR Graphic processor
27
+ -t, --title=TITLE Graphic title
28
+ -x, --xtitle=TITLE X axis title
29
+ -y, --ytitle=TITLE Y axis title
30
+ ```
31
+
32
+ Example:
33
+
34
+ ```
35
+ ```
36
+
37
+ ## Development
38
+
39
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
40
+
41
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
42
+
43
+ ## Contributing
44
+
45
+ Bug reports and pull requests are welcome on GitHub at https://github.com/taq/git-age.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "git/age"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/git-age ADDED
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/git/age"
4
+ require 'optparse'
5
+
6
+ options = Git::Age::Options.instance
7
+
8
+ opts = OptionParser.new
9
+ opts.banner = 'Usage: git-age [options]'
10
+
11
+ opts.on('-b', '--branch=BRANCH', 'Git branch') do |branch|
12
+ STDOUT.puts "Git branch: #{branch}"
13
+ options.branch = branch
14
+ end
15
+
16
+ opts.on('-o', '--output=FILE', 'Output file') do |file|
17
+ STDOUT.puts "Output to #{file}"
18
+ options.output = file
19
+ end
20
+
21
+ opts.on('-i', '--image=FILE', 'Image file') do |file|
22
+ STDOUT.puts "Image output to #{file}"
23
+ options.image = file
24
+ end
25
+
26
+ opts.on('-g', '--graph=PROCESSOR', 'Graphic processor') do |processor|
27
+ STDOUT.puts "Using graphic processor #{processor}"
28
+ options.processor = processor
29
+ end
30
+
31
+ opts.on('-t', '--title=TITLE', 'Graphic title') do |title|
32
+ STDOUT.puts "Using title #{title}"
33
+ options.title = title
34
+ end
35
+
36
+ opts.on('-x', '--xtitle=TITLE', 'X axis title') do |title|
37
+ STDOUT.puts "Using X axis title #{title}"
38
+ options.xtitle = title
39
+ end
40
+
41
+ opts.on('-y', '--ytitle=TITLE', 'Y axis title') do |title|
42
+ STDOUT.puts "Using Y axis title #{title}"
43
+ options.ytitle = title
44
+ end
45
+
46
+ opts.parse!
47
+
48
+ Git::Age::Main.new.run
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,27 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEjjCCAvagAwIBAgIBATANBgkqhkiG9w0BAQsFADBGMRgwFgYDVQQDDA9ldXN0
3
+ YXF1aW9yYW5nZWwxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixk
4
+ ARkWA2NvbTAeFw0yMjA4MjUxMjM1NDlaFw0yMzA4MjUxMjM1NDlaMEYxGDAWBgNV
5
+ BAMMD2V1c3RhcXVpb3JhbmdlbDEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYK
6
+ CZImiZPyLGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA
7
+ 3YBFbveSL2/69Igp0dpsop8U9ZxMAHMK00ZpwX+sUDIQOEQ/y9D/sS0YM5vXKWSC
8
+ +b9XVyhRZ62nF49HfcFK9EzZ3prs5N8NL1hel50l4B3U1z4fuiZ/DWZI1UcEc/Kn
9
+ Mp18z484LDu8Ahh4SBzZ+VYJAh1LPt5NfUaOPvPiROJqJgOV1qcXO+6ZVA3y1h5U
10
+ EeWBgkzyi0WkaUUyXqkDV4RBPpPvT590U3cd6ok4EwTJA4XNwlvQU10WoXjnLESn
11
+ w1WvoA4zQCigAS7S1eVdR3UEbdef+bc7DXBRw7WVrainzjqiX+rKchQpCWSu/TMg
12
+ tO8r3s0V+bG04/4yQXc1zAeFquyBTJy/PInHLbTwEmTiV/5XauSwjtOTAlZbn90x
13
+ fe0srVN/hlzQIe5hOpGpV2CqCM8LTbM/shrK1jSZODvW9yDsxR2xOwbrxbxEVa3f
14
+ +/VK8+F3xVhJEPz3A0IdtFcSHxBYbDy3x3BBBPNxxx16pFrqC9AF3fyce9lp8l/1
15
+ AgMBAAGjgYYwgYMwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFIY3
16
+ pLeLD3pErXWmpnX6YmuFkJpYMCQGA1UdEQQdMBuBGWV1c3RhcXVpb3JhbmdlbEBn
17
+ bWFpbC5jb20wJAYDVR0SBB0wG4EZZXVzdGFxdWlvcmFuZ2VsQGdtYWlsLmNvbTAN
18
+ BgkqhkiG9w0BAQsFAAOCAYEAUoZqEnK4qtASN9iSnAhbj/1h0Bd98YFYmmHwlc7q
19
+ zOQ9FuxPHwK1Lfe540JY87mfGsCLNp+ePGHgkZUBIgtIVA427SYc0t5Tz76nJzOA
20
+ eH8Aev8mKYkz319CuZexxFQBTGagpUAZN6/34jMPnA6/JPeuikMTeagm76WX4SMO
21
+ 1dHKnul+R5pDABWL9x7+Ed4d9Cko83Y5CF8z4lyUleuxlxh22qYHw39diIA3lUqF
22
+ AW6goHQVToZSxT4EFSNraft4HOuuGV8Kzw0+r8vWLIaCDhT7GZcOoTW7mdcgTAfb
23
+ CYYXOb19ueiFFDMzwMIMS+hMNV8CUDhzlp4FdEOZmQcMwomwpc5EASQI/eLLo1sB
24
+ wEEm2u37AJRyw/zKbLBX+mN/EySVht7IPVNeG4kOCv3o84AGZPiVZhQlypocjm9I
25
+ 7NRJmY9c84Zb3sCf0DV6UH+d2id9Dndp9ewchgDOSwGznt+oJmjDFZ9gYd8IP2Ol
26
+ 1eLrW8x4LHV+EVEIaiVTvmKt
27
+ -----END CERTIFICATE-----
data/git-age.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ require_relative 'lib/git/age/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "git-age"
5
+ spec.version = Git::Age::VERSION
6
+ spec.authors = ["Eustaquio Rangel"]
7
+ spec.email = ["taq@eustaquiorangel.com"]
8
+
9
+ spec.summary = %q{Create a CSV file with line year and month from your Git repository}
10
+ spec.description = %q{Check all the repository files lines dates and group it by year and month, allowing check how old code is still in use}
11
+ spec.homepage = "https://github.com/taq/git-age"
12
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
13
+
14
+ #spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = "https://github.com/taq/git-age"
18
+ #spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+
26
+ spec.bindir = "bin"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.executables << "git-age"
29
+ spec.require_paths = ["lib"]
30
+
31
+ spec.signing_key = '/home/taq/.gemcert/gem-private_key.pem'
32
+ spec.cert_chain = ['gem-public_cert.pem']
33
+ end
@@ -0,0 +1,22 @@
1
+ module Git
2
+ module Age
3
+ class GraphCli
4
+ def self.present?
5
+ IO.popen('which graph') do |io|
6
+ io.read
7
+ end.strip.size != 0
8
+ end
9
+
10
+ def self.create(input)
11
+ options = Git::Age::Options.instance
12
+ STDOUT.puts "Creating image #{options.image} ..."
13
+
14
+ cmd = "graph #{input} --bar -o #{options.image} --title '#{options.title}' --xlabel='#{options.xtitle}' --ylabel='#{options.ytitle}' --xtick-fontsize 5 --time-format-output '%Y-%m-%d' --legend=''"
15
+ rst = IO.popen(cmd) do |io|
16
+ io.read
17
+ end
18
+ STDOUT.puts rst
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,101 @@
1
+ module Git
2
+ module Age
3
+ class Main
4
+ JUSTIFICATION = 150
5
+
6
+ def initialize
7
+ STDOUT.puts "Waiting, analysing your repository ..."
8
+
9
+ @dates = Hash.new(0)
10
+ @files = files
11
+ end
12
+
13
+ def run
14
+ read_files
15
+ sort_dates
16
+ create_csv
17
+ create_image
18
+ rescue => e
19
+ STDERR.puts "Error: #{e}"
20
+ end
21
+
22
+ private
23
+
24
+ def read_files
25
+ cnt = 0
26
+ total = @files.size
27
+
28
+ @files.each do |file|
29
+ cnt += 1
30
+ next unless text?(file)
31
+
32
+ print "Checking [#{cnt}/#{total}] #{file.ljust(JUSTIFICATION)} ...\r"
33
+
34
+ IO.popen("git blame #{file} | iconv -t utf8") do |io|
35
+ io.read.split("\n")
36
+ end.each do |line|
37
+ matches = line.match(/\(.*(?<date>\d{4}-\d{2})-\d{2}.*\)/)
38
+ next unless matches
39
+
40
+ @dates[matches[:date]] += 1
41
+ end
42
+ end
43
+ rescue => e
44
+ STDERR.puts "Error reading files: #{e}"
45
+ end
46
+
47
+ def sort_dates
48
+ @dates = @dates.sort_by { |k, v| k }
49
+ end
50
+
51
+ def create_csv
52
+ output = Git::Age::Options.instance.output
53
+ STDOUT.puts "Creating CSV file #{output} ...".ljust(JUSTIFICATION)
54
+
55
+ File.open(output, 'w') do |file|
56
+ @dates.each do |key, value|
57
+ file << "#{key},#{value}\n"
58
+ end
59
+ end
60
+ rescue => e
61
+ STDERR.puts "Error creating CSV file: #{e}"
62
+ end
63
+
64
+ def create_image
65
+ options = Options.instance
66
+ processor = {
67
+ 'graph-cli' => Git::Age::GraphCli
68
+ }[options.processor]
69
+
70
+ unless processor
71
+ STDERR.puts "Image processor not supported: #{options.processor}"
72
+ return
73
+ end
74
+
75
+ unless processor.present?
76
+ STDERR.puts "Image processor #{options.processor} is not installed"
77
+ return
78
+ end
79
+
80
+ processor.create(options.output)
81
+ end
82
+
83
+ def files
84
+ branch = Git::Age::Options.instance.branch
85
+ STDOUT.puts "Reading files info from #{branch} branch ..."
86
+
87
+ IO.popen("git ls-tree -r #{branch} --name-only") do |io|
88
+ io.read.split("\n")
89
+ end
90
+ rescue => e
91
+ STDERR.puts "Error while searching for Git controlled files: #{e}"
92
+ end
93
+
94
+ def text?(file)
95
+ IO.popen("file -i -b #{file}") do |io|
96
+ io.read
97
+ end.match?(/\Atext/)
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,20 @@
1
+ require 'singleton'
2
+
3
+ module Git
4
+ module Age
5
+ class Options
6
+ include Singleton
7
+ attr_accessor :branch, :output, :title, :processor, :image, :xtitle, :ytitle
8
+
9
+ def initialize
10
+ @branch = 'master'
11
+ @output = 'git-age.csv'
12
+ @title = 'Git age statistics'
13
+ @processor = 'graph-cli'
14
+ @image = 'git-age.png'
15
+ @xtitle = 'Dates'
16
+ @ytitle = 'Lines'
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ module Git
2
+ module Age
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
data/lib/git/age.rb ADDED
@@ -0,0 +1,3 @@
1
+ require_relative 'age/main'
2
+ require_relative 'age/options'
3
+ require_relative 'age/graph_cli'
data.tar.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ [�X�EH�d�L
2
+ >؉;~E��syF�i���V����� i��)�&n,\��׆�"�3V0�xR>�)�w�l�O��"A3�YO�>�Ɉh�]���S!�l� K�*Jx��/�i���yt�0�wc=H��ĹH��p,�v���~c�Է\�ln�-��HԢ�پ��Ь'�N��>� �9�@u���*bM��J]�އ �]{�d��f^n�o����;J~³��gP�C���U�dx^ \N��U&�t䶯�v�{��Ec�"+Eg�ը���f�J��]U'�^*�V�-��C��x��͜W"Ӫ��bvp�X��0!�
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: git-age
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Eustaquio Rangel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEjjCCAvagAwIBAgIBATANBgkqhkiG9w0BAQsFADBGMRgwFgYDVQQDDA9ldXN0
14
+ YXF1aW9yYW5nZWwxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixk
15
+ ARkWA2NvbTAeFw0yMjA4MjUxMjM1NDlaFw0yMzA4MjUxMjM1NDlaMEYxGDAWBgNV
16
+ BAMMD2V1c3RhcXVpb3JhbmdlbDEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYK
17
+ CZImiZPyLGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA
18
+ 3YBFbveSL2/69Igp0dpsop8U9ZxMAHMK00ZpwX+sUDIQOEQ/y9D/sS0YM5vXKWSC
19
+ +b9XVyhRZ62nF49HfcFK9EzZ3prs5N8NL1hel50l4B3U1z4fuiZ/DWZI1UcEc/Kn
20
+ Mp18z484LDu8Ahh4SBzZ+VYJAh1LPt5NfUaOPvPiROJqJgOV1qcXO+6ZVA3y1h5U
21
+ EeWBgkzyi0WkaUUyXqkDV4RBPpPvT590U3cd6ok4EwTJA4XNwlvQU10WoXjnLESn
22
+ w1WvoA4zQCigAS7S1eVdR3UEbdef+bc7DXBRw7WVrainzjqiX+rKchQpCWSu/TMg
23
+ tO8r3s0V+bG04/4yQXc1zAeFquyBTJy/PInHLbTwEmTiV/5XauSwjtOTAlZbn90x
24
+ fe0srVN/hlzQIe5hOpGpV2CqCM8LTbM/shrK1jSZODvW9yDsxR2xOwbrxbxEVa3f
25
+ +/VK8+F3xVhJEPz3A0IdtFcSHxBYbDy3x3BBBPNxxx16pFrqC9AF3fyce9lp8l/1
26
+ AgMBAAGjgYYwgYMwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFIY3
27
+ pLeLD3pErXWmpnX6YmuFkJpYMCQGA1UdEQQdMBuBGWV1c3RhcXVpb3JhbmdlbEBn
28
+ bWFpbC5jb20wJAYDVR0SBB0wG4EZZXVzdGFxdWlvcmFuZ2VsQGdtYWlsLmNvbTAN
29
+ BgkqhkiG9w0BAQsFAAOCAYEAUoZqEnK4qtASN9iSnAhbj/1h0Bd98YFYmmHwlc7q
30
+ zOQ9FuxPHwK1Lfe540JY87mfGsCLNp+ePGHgkZUBIgtIVA427SYc0t5Tz76nJzOA
31
+ eH8Aev8mKYkz319CuZexxFQBTGagpUAZN6/34jMPnA6/JPeuikMTeagm76WX4SMO
32
+ 1dHKnul+R5pDABWL9x7+Ed4d9Cko83Y5CF8z4lyUleuxlxh22qYHw39diIA3lUqF
33
+ AW6goHQVToZSxT4EFSNraft4HOuuGV8Kzw0+r8vWLIaCDhT7GZcOoTW7mdcgTAfb
34
+ CYYXOb19ueiFFDMzwMIMS+hMNV8CUDhzlp4FdEOZmQcMwomwpc5EASQI/eLLo1sB
35
+ wEEm2u37AJRyw/zKbLBX+mN/EySVht7IPVNeG4kOCv3o84AGZPiVZhQlypocjm9I
36
+ 7NRJmY9c84Zb3sCf0DV6UH+d2id9Dndp9ewchgDOSwGznt+oJmjDFZ9gYd8IP2Ol
37
+ 1eLrW8x4LHV+EVEIaiVTvmKt
38
+ -----END CERTIFICATE-----
39
+ date: 2022-08-25 00:00:00.000000000 Z
40
+ dependencies: []
41
+ description: Check all the repository files lines dates and group it by year and month,
42
+ allowing check how old code is still in use
43
+ email:
44
+ - taq@eustaquiorangel.com
45
+ executables:
46
+ - git-age
47
+ extensions: []
48
+ extra_rdoc_files: []
49
+ files:
50
+ - ".gitignore"
51
+ - ".travis.yml"
52
+ - Gemfile
53
+ - Gemfile.lock
54
+ - README.md
55
+ - Rakefile
56
+ - bin/console
57
+ - bin/git-age
58
+ - bin/setup
59
+ - gem-public_cert.pem
60
+ - git-age.gemspec
61
+ - lib/git/age.rb
62
+ - lib/git/age/graph_cli.rb
63
+ - lib/git/age/main.rb
64
+ - lib/git/age/options.rb
65
+ - lib/git/age/version.rb
66
+ homepage: https://github.com/taq/git-age
67
+ licenses: []
68
+ metadata:
69
+ homepage_uri: https://github.com/taq/git-age
70
+ source_code_uri: https://github.com/taq/git-age
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 2.3.0
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubygems_version: 3.3.7
87
+ signing_key:
88
+ specification_version: 4
89
+ summary: Create a CSV file with line year and month from your Git repository
90
+ test_files: []
metadata.gz.sig ADDED
Binary file