git-stat 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +81 -0
- data/LICENSE.txt +20 -0
- data/README.md +76 -0
- data/Rakefile +51 -0
- data/VERSION +1 -0
- data/bin/git-stat +49 -0
- data/git-stat.gemspec +64 -0
- data/lib/git-stat.rb +208 -0
- data/test/helper.rb +34 -0
- data/test/test_git-stat.rb +7 -0
- metadata +128 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cf97961ee62e35f533a39b66245b85ba341e312a
|
4
|
+
data.tar.gz: a4d8a2021cbbbfdcdcf0f46ffe977498708ca352
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f29cc3e815d9d21850b3bdd25576cafa7c29f63f871fa5386accef665d835b7baaa9c286cb014fc2d61924a5d5b0a5f774e8da4b426c38a8d8658142f636989f
|
7
|
+
data.tar.gz: dc62f98c7326da37c000776c63cdb7c795f01ee0a571c74a837fa71f7fb59f2c76db22e13bd58f798d4bd97dc6170c1dc04828b248de91b8b72b250d2940d9fc
|
data/.document
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
# Add dependencies required to use your gem here.
|
3
|
+
# Example:
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
5
|
+
|
6
|
+
# Add dependencies to develop your gem here.
|
7
|
+
# Include everything needed to run rake, tests, features, etc.
|
8
|
+
group :development do
|
9
|
+
gem "shoulda", ">= 0"
|
10
|
+
gem "rdoc", "~> 3.12"
|
11
|
+
gem "bundler", "~> 1.0"
|
12
|
+
gem "jeweler", "~> 2.0.1"
|
13
|
+
gem "simplecov", ">= 0"
|
14
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activesupport (4.0.3)
|
5
|
+
i18n (~> 0.6, >= 0.6.4)
|
6
|
+
minitest (~> 4.2)
|
7
|
+
multi_json (~> 1.3)
|
8
|
+
thread_safe (~> 0.1)
|
9
|
+
tzinfo (~> 0.3.37)
|
10
|
+
addressable (2.3.5)
|
11
|
+
atomic (1.1.15)
|
12
|
+
builder (3.2.2)
|
13
|
+
descendants_tracker (0.0.3)
|
14
|
+
docile (1.1.3)
|
15
|
+
faraday (0.9.0)
|
16
|
+
multipart-post (>= 1.2, < 3)
|
17
|
+
git (1.2.6)
|
18
|
+
github_api (0.11.3)
|
19
|
+
addressable (~> 2.3)
|
20
|
+
descendants_tracker (~> 0.0.1)
|
21
|
+
faraday (~> 0.8, < 0.10)
|
22
|
+
hashie (>= 1.2)
|
23
|
+
multi_json (>= 1.7.5, < 2.0)
|
24
|
+
nokogiri (~> 1.6.0)
|
25
|
+
oauth2
|
26
|
+
hashie (2.0.5)
|
27
|
+
highline (1.6.21)
|
28
|
+
i18n (0.6.9)
|
29
|
+
jeweler (2.0.1)
|
30
|
+
builder
|
31
|
+
bundler (>= 1.0)
|
32
|
+
git (>= 1.2.5)
|
33
|
+
github_api
|
34
|
+
highline (>= 1.6.15)
|
35
|
+
nokogiri (>= 1.5.10)
|
36
|
+
rake
|
37
|
+
rdoc
|
38
|
+
json (1.8.1)
|
39
|
+
jwt (0.1.11)
|
40
|
+
multi_json (>= 1.5)
|
41
|
+
mini_portile (0.5.2)
|
42
|
+
minitest (4.7.5)
|
43
|
+
multi_json (1.9.0)
|
44
|
+
multi_xml (0.5.5)
|
45
|
+
multipart-post (2.0.0)
|
46
|
+
nokogiri (1.6.1)
|
47
|
+
mini_portile (~> 0.5.0)
|
48
|
+
oauth2 (0.9.3)
|
49
|
+
faraday (>= 0.8, < 0.10)
|
50
|
+
jwt (~> 0.1.8)
|
51
|
+
multi_json (~> 1.3)
|
52
|
+
multi_xml (~> 0.5)
|
53
|
+
rack (~> 1.2)
|
54
|
+
rack (1.5.2)
|
55
|
+
rake (10.1.1)
|
56
|
+
rdoc (3.12.2)
|
57
|
+
json (~> 1.4)
|
58
|
+
shoulda (3.5.0)
|
59
|
+
shoulda-context (~> 1.0, >= 1.0.1)
|
60
|
+
shoulda-matchers (>= 1.4.1, < 3.0)
|
61
|
+
shoulda-context (1.1.6)
|
62
|
+
shoulda-matchers (2.5.0)
|
63
|
+
activesupport (>= 3.0.0)
|
64
|
+
simplecov (0.8.2)
|
65
|
+
docile (~> 1.1.0)
|
66
|
+
multi_json
|
67
|
+
simplecov-html (~> 0.8.0)
|
68
|
+
simplecov-html (0.8.0)
|
69
|
+
thread_safe (0.2.0)
|
70
|
+
atomic (>= 1.1.7, < 2)
|
71
|
+
tzinfo (0.3.39)
|
72
|
+
|
73
|
+
PLATFORMS
|
74
|
+
ruby
|
75
|
+
|
76
|
+
DEPENDENCIES
|
77
|
+
bundler (~> 1.0)
|
78
|
+
jeweler (~> 2.0.1)
|
79
|
+
rdoc (~> 3.12)
|
80
|
+
shoulda
|
81
|
+
simplecov
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2014 Peter Salas
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# git-stat
|
2
|
+
|
3
|
+
A collection of useful utilities and libraries for Ruby development (not Rails)
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
The toolset can be installed via:
|
8
|
+
|
9
|
+
gem install git-stat
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
TODO
|
14
|
+
|
15
|
+
|
16
|
+
## Documentation
|
17
|
+
|
18
|
+
The projects homepage can be found [here](https://github.com/gradeawarrior/git-stat). You can also refer to the [Rubydoc YARD Server](http://rubydoc.info/gems/git-stat/frames)
|
19
|
+
|
20
|
+
# Development
|
21
|
+
|
22
|
+
The project is built by [jeweler](https://github.com/technicalpickles/jeweler). See the project's page for more details about how to manage this gem. However, I will list out quick guidance on a typical release.
|
23
|
+
|
24
|
+
## Active Gem Development
|
25
|
+
|
26
|
+
It may be useful to load this project for use in other local projects. The easiest way to configure Ruby is to set `RUBYLIB` environment variable to include all Ruby paths (Separated by colons ':'):
|
27
|
+
|
28
|
+
$ export RUBYLIB=$YOUR_PATH_TO_LIB_DIRECTORY:$OTHER_PATHS
|
29
|
+
|
30
|
+
### 1. Version Bump
|
31
|
+
|
32
|
+
When you are ready to release, you will need to up-rev the version via the
|
33
|
+
following methods depending if it's (i) a major, (ii) a minor, or (iii) a patch
|
34
|
+
release:
|
35
|
+
|
36
|
+
# version:write like before
|
37
|
+
$ rake version:write MAJOR=0 MINOR=3 PATCH=0
|
38
|
+
|
39
|
+
# bump just major, ie 0.1.0 -> 1.0.0
|
40
|
+
$ rake version:bump:major
|
41
|
+
|
42
|
+
# bump just minor, ie 0.1.0 -> 0.2.0
|
43
|
+
$ rake version:bump:minor
|
44
|
+
|
45
|
+
# bump just patch, ie 0.1.0 -> 0.1.1
|
46
|
+
$ rake version:bump:patch
|
47
|
+
|
48
|
+
### 2. Local Testing of Gem
|
49
|
+
|
50
|
+
While doing active work on your project, it is helpful to actively install your gem into your local gem repo using `rake install` on the command-line.
|
51
|
+
|
52
|
+
$ rake install
|
53
|
+
|
54
|
+
Do note that discovering what files to include in the gem is written around git. The file must be at least be tracked. You may need to do a `git init` and a `git add .` to at least satisfy the requirements for building a gem from source.
|
55
|
+
|
56
|
+
### 3. Releasing
|
57
|
+
|
58
|
+
At last, it's time to ship it! Make sure you have everything committed and pushed, then go wild:
|
59
|
+
|
60
|
+
$ rake release
|
61
|
+
|
62
|
+
# Contributing to git-stat
|
63
|
+
|
64
|
+
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
|
65
|
+
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
|
66
|
+
* Fork the project.
|
67
|
+
* Start a feature/bugfix branch.
|
68
|
+
* Commit and push until you are happy with your contribution.
|
69
|
+
* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
70
|
+
* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
|
71
|
+
|
72
|
+
# Copyright
|
73
|
+
|
74
|
+
Copyright (c) 2014 Peter Salas. See LICENSE.txt for
|
75
|
+
further details.
|
76
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
|
17
|
+
gem.name = "git-stat"
|
18
|
+
gem.homepage = "http://github.com/gradeawarrior/git-stat"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = "git-stat utility"
|
21
|
+
gem.description = "Git Statistics Utility for your projects"
|
22
|
+
gem.email = "psalas+github@gmail.com"
|
23
|
+
gem.authors = ["Peter Salas"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
require 'rake/testtask'
|
29
|
+
Rake::TestTask.new(:test) do |test|
|
30
|
+
test.libs << 'lib' << 'test'
|
31
|
+
test.pattern = 'test/**/test_*.rb'
|
32
|
+
test.verbose = true
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "Code coverage detail"
|
36
|
+
task :simplecov do
|
37
|
+
ENV['COVERAGE'] = "true"
|
38
|
+
Rake::Task['test'].execute
|
39
|
+
end
|
40
|
+
|
41
|
+
task :default => :test
|
42
|
+
|
43
|
+
require 'rdoc/task'
|
44
|
+
Rake::RDocTask.new do |rdoc|
|
45
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
46
|
+
|
47
|
+
rdoc.rdoc_dir = 'rdoc'
|
48
|
+
rdoc.title = "git-stat #{version}"
|
49
|
+
rdoc.rdoc_files.include('README*')
|
50
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
51
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
data/bin/git-stat
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
def show_usage(opts, message=nil)
|
7
|
+
code = 0
|
8
|
+
puts opts
|
9
|
+
|
10
|
+
if !message.nil?
|
11
|
+
puts "[ERROR] #{message}"
|
12
|
+
code = 1
|
13
|
+
end
|
14
|
+
exit(code)
|
15
|
+
end
|
16
|
+
|
17
|
+
## Variables
|
18
|
+
git_dir = '.'
|
19
|
+
|
20
|
+
# Process command line arguments if any.
|
21
|
+
opts = OptionParser.new do |opts|
|
22
|
+
|
23
|
+
# Set a banner, displayed at the top
|
24
|
+
# of the help screen.
|
25
|
+
opts.banner = "Usage: git-stat [options]"
|
26
|
+
|
27
|
+
opts.on('-d', '--dir GIT_DIR', "A git directory to get stats on (Default: current directory)") do |dir|
|
28
|
+
show_usage("'#{dir} does not exist!") unless File.exist?(dir)
|
29
|
+
show_usage("'#{dir} is not a directory!") unless File.directory?(dir)
|
30
|
+
git_dir = dir
|
31
|
+
end
|
32
|
+
|
33
|
+
# This displays the help screen, all programs are
|
34
|
+
# assumed to have this option.
|
35
|
+
opts.on('-h', '--help', 'Display this screen') do
|
36
|
+
show_usage(opts)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
opts.parse(ARGV)
|
41
|
+
|
42
|
+
require 'git-stat'
|
43
|
+
Dir.chdir(git_dir)
|
44
|
+
if Git::is_git_project?
|
45
|
+
stats = Git::all_stats
|
46
|
+
puts stats.to_yaml
|
47
|
+
else
|
48
|
+
show_usage(opts, "#{git_dir} is not a git project!")
|
49
|
+
end
|
data/git-stat.gemspec
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "git-stat"
|
8
|
+
s.version = "1.0.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Peter Salas"]
|
12
|
+
s.date = "2014-03-13"
|
13
|
+
s.description = "Git Statistics Utility for your projects"
|
14
|
+
s.email = "psalas+github@gmail.com"
|
15
|
+
s.executables = ["git-stat"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"LICENSE.txt",
|
18
|
+
"README.md"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".document",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.md",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"bin/git-stat",
|
29
|
+
"git-stat.gemspec",
|
30
|
+
"lib/git-stat.rb",
|
31
|
+
"test/helper.rb",
|
32
|
+
"test/test_git-stat.rb"
|
33
|
+
]
|
34
|
+
s.homepage = "http://github.com/gradeawarrior/git-stat"
|
35
|
+
s.licenses = ["MIT"]
|
36
|
+
s.require_paths = ["lib"]
|
37
|
+
s.rubygems_version = "2.0.14"
|
38
|
+
s.summary = "git-stat utility"
|
39
|
+
|
40
|
+
if s.respond_to? :specification_version then
|
41
|
+
s.specification_version = 4
|
42
|
+
|
43
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
45
|
+
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
46
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
47
|
+
s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
|
48
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
49
|
+
else
|
50
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
51
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
52
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
53
|
+
s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
|
54
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
55
|
+
end
|
56
|
+
else
|
57
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
58
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
59
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
60
|
+
s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
|
61
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
data/lib/git-stat.rb
ADDED
@@ -0,0 +1,208 @@
|
|
1
|
+
## Check to make sure system has git installed, otherwise quickly exit
|
2
|
+
begin
|
3
|
+
`git --version`
|
4
|
+
abort("git is not installed on your system!") unless $?.success?
|
5
|
+
end
|
6
|
+
|
7
|
+
##
|
8
|
+
# Provides a quick wrapper around git commands in order to analyze and provide interesting statistics
|
9
|
+
# around a git repository
|
10
|
+
#
|
11
|
+
class Git
|
12
|
+
|
13
|
+
UNKNOWN_TYPE = 'UNKNOWN'
|
14
|
+
|
15
|
+
##
|
16
|
+
# Checks if the current directory is a git project
|
17
|
+
#
|
18
|
+
def self.is_git_project?
|
19
|
+
`git status`
|
20
|
+
$?.success?
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# Returns the project name, which is assumed to be the current directory's name
|
25
|
+
#
|
26
|
+
def self.project_name
|
27
|
+
`printf '%s\n' "${PWD##*/}"`.chomp
|
28
|
+
end
|
29
|
+
|
30
|
+
##
|
31
|
+
# Returns a list of files in the git project
|
32
|
+
#
|
33
|
+
def self.ls_files
|
34
|
+
`git ls-files`.split(/\n/)
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Returns a list of all remote branches
|
39
|
+
#
|
40
|
+
def self.remote_branches
|
41
|
+
`git branch -a | grep remotes | awk '{print $1}'`.split(/\n/)
|
42
|
+
end
|
43
|
+
|
44
|
+
##
|
45
|
+
# Returns a list of tags
|
46
|
+
#
|
47
|
+
def self.tags
|
48
|
+
`git tag -l`.split(/\n/)
|
49
|
+
end
|
50
|
+
|
51
|
+
##
|
52
|
+
# Executes the blame command and returns the String output
|
53
|
+
#
|
54
|
+
def self.blame(file)
|
55
|
+
`git blame "#{file}"`
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Returns the number of lines in a file
|
60
|
+
#
|
61
|
+
def self.line_count(file)
|
62
|
+
`git blame "#{file}" | wc -l`.to_i
|
63
|
+
end
|
64
|
+
|
65
|
+
##
|
66
|
+
# Returns a hash containing some interesting stats about a file including:
|
67
|
+
#
|
68
|
+
# 1. The file
|
69
|
+
# 2. The file type
|
70
|
+
# 3. line count
|
71
|
+
# 4. and all the authors and the number of lines they were responsible for
|
72
|
+
#
|
73
|
+
# It will look something like this:
|
74
|
+
#
|
75
|
+
# {
|
76
|
+
# :file => file,
|
77
|
+
# :type => type,
|
78
|
+
# :line_count => line_count,
|
79
|
+
# :authors_influence => authors
|
80
|
+
# }
|
81
|
+
#
|
82
|
+
def self.file_stat(file)
|
83
|
+
authors = {}
|
84
|
+
line_count = 0
|
85
|
+
type = File.extname(file).empty? ? UNKNOWN_TYPE : File.extname(file)
|
86
|
+
begin
|
87
|
+
lines = blame(file).split(/\n/)
|
88
|
+
line_count = lines.length
|
89
|
+
lines.each do |line|
|
90
|
+
if (line.match(/\((.*?)\s+[0-9]{4}-[0-9]{2}-[0-9]{2}\s+[0-9]{2}:[0-9]{2}:[0-9]{2}\s.[0-9]*\s+[0-9]*\)/))
|
91
|
+
authors[$1] += 1 if authors.has_key?($1)
|
92
|
+
authors[$1] = 1 unless authors.has_key?($1)
|
93
|
+
else
|
94
|
+
$stderr.puts "[WARN] Did not find whom to blame on this line in file: #{file}"
|
95
|
+
$stderr.flush
|
96
|
+
end
|
97
|
+
end
|
98
|
+
rescue Exception
|
99
|
+
line_count = Git::line_count(file)
|
100
|
+
end
|
101
|
+
{
|
102
|
+
:file => file,
|
103
|
+
:type => type,
|
104
|
+
:line_count => line_count,
|
105
|
+
:authors_influence => authors
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
##
|
110
|
+
# Merges two hashes containing counts together
|
111
|
+
#
|
112
|
+
def self.merge_hash_value_counts(h1, h2)
|
113
|
+
h2.each_key.inject(h1) do |result,key|
|
114
|
+
result[key] += h2[key] if result.has_key?(key)
|
115
|
+
result[key] = h2[key] unless result.has_key?(key)
|
116
|
+
result
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
##
|
121
|
+
# Creates a "sorted" hash by the value counts. This is simply
|
122
|
+
# for easier visual output when serialized to yaml
|
123
|
+
#
|
124
|
+
def self.sort_hash(hash)
|
125
|
+
sorted_array = hash.sort_by {|k,v| v}.reverse
|
126
|
+
sorted_array.inject({}) do |result,element|
|
127
|
+
result[element[0]] = element[1]
|
128
|
+
result
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
##
|
133
|
+
# This iterates over files and calls Git::file_stat on each of them.
|
134
|
+
# Output will look like this:
|
135
|
+
#
|
136
|
+
# {
|
137
|
+
# :number_of_files => number_of_files,
|
138
|
+
# :total_line_counts => total_line_counts,
|
139
|
+
# :file_types => sort_hash(types_count),
|
140
|
+
# :line_counts_by_type => sort_hash(line_counts_by_type),
|
141
|
+
# :authors_influence => sort_hash(authors_influence)
|
142
|
+
# }
|
143
|
+
#
|
144
|
+
def self.files_stat
|
145
|
+
files = Git::ls_files()
|
146
|
+
number_of_files = files.length
|
147
|
+
types_count = {}
|
148
|
+
line_counts = {}
|
149
|
+
line_counts_by_type = {}
|
150
|
+
authors_influence = {}
|
151
|
+
total_line_counts = 0
|
152
|
+
|
153
|
+
file_index = 0
|
154
|
+
files.each do |file|
|
155
|
+
file_index += 1
|
156
|
+
file_stat = file_stat(file)
|
157
|
+
authors_influence = merge_hash_value_counts(authors_influence, file_stat[:authors_influence])
|
158
|
+
total_line_counts += file_stat[:line_count]
|
159
|
+
|
160
|
+
if types_count.has_key?(file_stat[:type])
|
161
|
+
types_count[file_stat[:type]] += 1
|
162
|
+
line_counts_by_type[file_stat[:type]] += file_stat[:line_count]
|
163
|
+
else
|
164
|
+
types_count[file_stat[:type]] = 1
|
165
|
+
line_counts_by_type[file_stat[:type]] = file_stat[:line_count]
|
166
|
+
end
|
167
|
+
line_counts[file] = Git::line_count(file)
|
168
|
+
end
|
169
|
+
|
170
|
+
{
|
171
|
+
:number_of_files => number_of_files,
|
172
|
+
:total_line_counts => total_line_counts,
|
173
|
+
:file_types => sort_hash(types_count),
|
174
|
+
:line_counts_by_type => sort_hash(line_counts_by_type),
|
175
|
+
:authors_influence => sort_hash(authors_influence)
|
176
|
+
}
|
177
|
+
end
|
178
|
+
|
179
|
+
##
|
180
|
+
# Does Git::files_stat and then formats everything.
|
181
|
+
# Output will look like this:
|
182
|
+
#
|
183
|
+
# {
|
184
|
+
# 'project_name' => Git::project_name(),
|
185
|
+
# 'total_files' => stats[:number_of_files],
|
186
|
+
# 'total_lines' => stats[:total_line_counts],
|
187
|
+
# 'file_types' => stats[:file_types],
|
188
|
+
# 'authors_line_count' => stats[:authors_influence],
|
189
|
+
# 'line_counts_by_type' => stats[:line_counts_by_type],
|
190
|
+
# 'branches' => Git::remote_branches(),
|
191
|
+
# 'tags' => Git::tags()
|
192
|
+
# }
|
193
|
+
#
|
194
|
+
def self.all_stats
|
195
|
+
stats = files_stat()
|
196
|
+
{
|
197
|
+
'project_name' => Git::project_name(),
|
198
|
+
'total_files' => stats[:number_of_files],
|
199
|
+
'total_lines' => stats[:total_line_counts],
|
200
|
+
'file_types' => stats[:file_types],
|
201
|
+
'authors_line_count' => stats[:authors_influence],
|
202
|
+
'line_counts_by_type' => stats[:line_counts_by_type],
|
203
|
+
'branches' => Git::remote_branches(),
|
204
|
+
'tags' => Git::tags()
|
205
|
+
}
|
206
|
+
end
|
207
|
+
|
208
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
|
3
|
+
module SimpleCov::Configuration
|
4
|
+
def clean_filters
|
5
|
+
@filters = []
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
SimpleCov.configure do
|
10
|
+
clean_filters
|
11
|
+
load_adapter 'test_frameworks'
|
12
|
+
end
|
13
|
+
|
14
|
+
ENV["COVERAGE"] && SimpleCov.start do
|
15
|
+
add_filter "/.rvm/"
|
16
|
+
end
|
17
|
+
require 'rubygems'
|
18
|
+
require 'bundler'
|
19
|
+
begin
|
20
|
+
Bundler.setup(:default, :development)
|
21
|
+
rescue Bundler::BundlerError => e
|
22
|
+
$stderr.puts e.message
|
23
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
24
|
+
exit e.status_code
|
25
|
+
end
|
26
|
+
require 'test/unit'
|
27
|
+
require 'shoulda'
|
28
|
+
|
29
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
30
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
31
|
+
require 'git-stat'
|
32
|
+
|
33
|
+
class Test::Unit::TestCase
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: git-stat
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Peter Salas
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-03-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: shoulda
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rdoc
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.12'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.12'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: jeweler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.0.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.0.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: Git Statistics Utility for your projects
|
84
|
+
email: psalas+github@gmail.com
|
85
|
+
executables:
|
86
|
+
- git-stat
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files:
|
89
|
+
- LICENSE.txt
|
90
|
+
- README.md
|
91
|
+
files:
|
92
|
+
- .document
|
93
|
+
- Gemfile
|
94
|
+
- Gemfile.lock
|
95
|
+
- LICENSE.txt
|
96
|
+
- README.md
|
97
|
+
- Rakefile
|
98
|
+
- VERSION
|
99
|
+
- bin/git-stat
|
100
|
+
- git-stat.gemspec
|
101
|
+
- lib/git-stat.rb
|
102
|
+
- test/helper.rb
|
103
|
+
- test/test_git-stat.rb
|
104
|
+
homepage: http://github.com/gradeawarrior/git-stat
|
105
|
+
licenses:
|
106
|
+
- MIT
|
107
|
+
metadata: {}
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - '>='
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
requirements: []
|
123
|
+
rubyforge_project:
|
124
|
+
rubygems_version: 2.0.14
|
125
|
+
signing_key:
|
126
|
+
specification_version: 4
|
127
|
+
summary: git-stat utility
|
128
|
+
test_files: []
|