git-branch_stats 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OWIzMWY2MWJlNzBhYTk4ODYyMzJlMDI5NGE2YjQxYmY1NDg4YmFhMw==
5
+ data.tar.gz: !binary |-
6
+ MWI3ZWViZTFmYWEzMmVhZDAxZDY3MGUzNmZlMDVkYzdhMDJhNGNiYg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ OGY5NzY2ODU2ODgyNTJiZGI3NWE0NGU4MzRiMjE3ZTA5ODU2NmJlNDYyODQz
10
+ MmJlMTUwNDgxYmU0MjA5Y2NlYzRlOGE1YmJhMWJkNTk2YzMxNjg4NDAxZWQx
11
+ YmM3ODVjNjE2NjY4MGVjMTUzNGIxMzczZGFkYTY1NTBkODRlMDQ=
12
+ data.tar.gz: !binary |-
13
+ MzFhYTZiZWFmOThlMGYzMTlmZmJkMjgzNjIxZDVmM2FiYjhlMDAxMTkzYjBk
14
+ NmQyYzVkNGJhZjgwZGIyYzY2YTVlMzAwYWE3Njc5NzQyMDc2MDA0OGM1NmEw
15
+ NWMzNjlhMGU1YzZkYTdiMjkyNTlhZTNkMjM0NmZjN2JkMDc4YzY=
metadata CHANGED
@@ -1,69 +1,63 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-branch_stats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
5
- prerelease:
4
+ version: 0.0.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - François-Pierre Bouchard
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-06 00:00:00.000000000 Z
11
+ date: 2014-06-06 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: github-linguist
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '2.11'
19
20
  - - ! '>='
20
21
  - !ruby/object:Gem::Version
21
- version: '0'
22
+ version: 2.11.4
22
23
  type: :runtime
23
24
  prerelease: false
24
25
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
26
  requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '2.11'
27
30
  - - ! '>='
28
31
  - !ruby/object:Gem::Version
29
- version: '0'
32
+ version: 2.11.4
30
33
  description: Analyzes commits and diffs that are only present on the given branch
31
34
  email:
32
35
  - fpbouchard@petalmd.com
33
36
  executables: []
34
37
  extensions: []
35
38
  extra_rdoc_files: []
36
- files:
37
- - .gitignore
38
- - Gemfile
39
- - LICENSE.txt
40
- - README.md
41
- - Rakefile
42
- - git-branch_stats.gemspec
43
- - lib/git-branch_stats.rb
44
- - lib/git-branch_stats/version.rb
39
+ files: []
45
40
  homepage: ''
46
41
  licenses: []
42
+ metadata: {}
47
43
  post_install_message:
48
44
  rdoc_options: []
49
45
  require_paths:
50
46
  - lib
51
47
  required_ruby_version: !ruby/object:Gem::Requirement
52
- none: false
53
48
  requirements:
54
49
  - - ! '>='
55
50
  - !ruby/object:Gem::Version
56
51
  version: '0'
57
52
  required_rubygems_version: !ruby/object:Gem::Requirement
58
- none: false
59
53
  requirements:
60
54
  - - ! '>='
61
55
  - !ruby/object:Gem::Version
62
56
  version: '0'
63
57
  requirements: []
64
58
  rubyforge_project:
65
- rubygems_version: 1.8.25
59
+ rubygems_version: 2.2.2
66
60
  signing_key:
67
- specification_version: 3
61
+ specification_version: 4
68
62
  summary: Git branch statistics
69
63
  test_files: []
data/.gitignore DELETED
@@ -1,18 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
- .rvmrc
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in git-branch_stats.gemspec
4
- gemspec
@@ -1,22 +0,0 @@
1
- Copyright (c) 2013 François-Pierre Bouchard
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md DELETED
@@ -1,29 +0,0 @@
1
- # Git::BranchStats
2
-
3
- TODO: Write a gem description
4
-
5
- ## Installation
6
-
7
- Add this line to your application's Gemfile:
8
-
9
- gem 'git-branch_stats'
10
-
11
- And then execute:
12
-
13
- $ bundle
14
-
15
- Or install it yourself as:
16
-
17
- $ gem install git-branch_stats
18
-
19
- ## Usage
20
-
21
- TODO: Write usage instructions here
22
-
23
- ## Contributing
24
-
25
- 1. Fork it
26
- 2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Add some feature'`)
28
- 4. Push to the branch (`git push origin my-new-feature`)
29
- 5. Create new Pull Request
data/Rakefile DELETED
@@ -1 +0,0 @@
1
- require "bundler/gem_tasks"
@@ -1,21 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'git-branch_stats/version'
5
-
6
- Gem::Specification.new do |gem|
7
- gem.name = "git-branch_stats"
8
- gem.version = Git::BranchStats::VERSION
9
- gem.authors = ["François-Pierre Bouchard"]
10
- gem.email = ["fpbouchard@petalmd.com"]
11
- gem.description = %q{Analyzes commits and diffs that are only present on the given branch}
12
- gem.summary = %q{Git branch statistics}
13
- gem.homepage = ""
14
-
15
- gem.add_dependency 'github-linguist'
16
-
17
- gem.files = `git ls-files`.split($/)
18
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
19
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
- gem.require_paths = ["lib"]
21
- end
@@ -1,145 +0,0 @@
1
- require "git-branch_stats/version"
2
-
3
- require 'linguist'
4
-
5
- # ----- Language extractor from excerpts (that are in fact positive diffs) -----
6
- # This is a simple override of linguist's file blob, it is just 'like' the file
7
- # it references, but its contents is only an exceprt of the changed lines
8
- class ExcerptBlob < Linguist::FileBlob
9
- def initialize(path, excerpt)
10
- super(path)
11
- @data = excerpt
12
- @size = excerpt.bytesize
13
- end
14
-
15
- def data
16
- @data
17
- end
18
-
19
- def size
20
- @size
21
- end
22
- end
23
-
24
- # Repostiory that calculates sizes for all types (markup AND programming)
25
- # Since this analyzer is for branches, we want to have precise reporting on
26
- # what has been done, not just programming
27
- class AllTypesRepository < Linguist::Repository
28
- def compute_stats
29
- return if @computed_stats
30
-
31
- @enum.each do |blob|
32
- # Skip files that are likely binary
33
- next if blob.likely_binary?
34
-
35
- # Skip vendored or generated blobs
36
- next if blob.vendored? || blob.generated? || blob.language.nil?
37
-
38
- @sizes[blob.language.group] += blob.size
39
- end
40
-
41
- # Compute total size
42
- @size = @sizes.inject(0) { |s,(_,v)| s + v }
43
-
44
- # Get primary language
45
- if primary = @sizes.max_by { |(_, size)| size }
46
- @language = primary[0]
47
- end
48
-
49
- @computed_stats = true
50
-
51
- nil
52
- end
53
- end
54
-
55
- module Git
56
- module BranchStats
57
-
58
- def self.extract_language_stats(stats_by_file)
59
- file_blobs = stats_by_file.select {|numstat| numstat[:additions] > 0}.collect {|numstat| ExcerptBlob.new('./' + numstat[:filename], numstat[:content])}
60
- linguist = AllTypesRepository.new(file_blobs)
61
- # Linguist wraps the language in an object, we only want the language name (and why not, sort it by size, descending)
62
- language_stats = linguist.languages.collect {|language, size| [language.name, size]}.sort_by {|language, size| -size}
63
- language_stats
64
- end
65
-
66
-
67
- def self.analyze(branch = `git rev-parse --abbrev-ref HEAD`.strip)
68
- warnings = []
69
- # Get all commits that are only visible for this HEAD (branch).
70
- # List commits, without merges, of HEAD, that are not any ref from other branches
71
- branches = `git branch`.split(/\n/)
72
- independent_commits_and_emails = if branches.one?
73
- independent_commits_and_emails = `git log --format="%H,%ae" --no-merges #{branch}`.split(/\n/)
74
- else
75
- independent_commits_and_emails = `git log --format="%H,%ae" --no-merges #{branch} --not $(git for-each-ref --format="%(refname)" refs/heads | grep -Fv refs/heads/#{branch})`.split(/\n/)
76
- end
77
- independent_commits = independent_commits_and_emails.collect {|c| c.split(',').first}
78
- emails = independent_commits_and_emails.collect {|c| c.split(',').last}
79
- emails = emails.uniq
80
-
81
- # Using the list of independent commits, gather stats
82
-
83
- if independent_commits.any?
84
- # Start analysis before the last independent commit
85
- diff_origin = independent_commits.last + "~"
86
- commit_count = independent_commits.length
87
- # Fallback if last independent commit is the first commit of the repository
88
- # NOTE: Running the analyzer on a branch that has independent commits up to the first commit
89
- # will give weird results since it will omit this first commit in the numstats and language analysis.
90
- `git rev-parse --verify --quiet #{diff_origin}`
91
- if $?.to_i > 0
92
- diff_origin = independent_commits.last
93
-
94
- warnings.push "WARN: Branch has independent commits since the first commit of the repo, stats will be skewed (can't run stats *before* the first commit)"
95
- # In this case, exclude the last commit (since it won't be included in the stats)
96
- commit_count = commit_count - 1
97
- end
98
-
99
- # Numstats (files, +/-)
100
- numstats = `git diff --numstat #{diff_origin}`.split(/\n/)
101
- stats_by_file = numstats.collect do |numstat|
102
- additions, deletions, filename = numstat.split(/\t/)
103
- {:additions => additions.to_i, :deletions => deletions.to_i, :filename => filename}
104
- end
105
-
106
- # Extract content from diffs to generate language stats (only consider diffs that contain added/changed stuff)
107
- stats_by_file.select {|numstat| numstat[:additions] > 0}.each do |numstat|
108
- # Since first independent commit
109
- diff = `git diff #{diff_origin} -- #{numstat[:filename]}`
110
- # Collect lines prefixed with a single +
111
- new_content = diff.lines.select {|line| line =~ /^\+[^\+]/}.collect {|line| line[1..-1]}.join("\n")
112
- # Store in the stats for later language analysis
113
- numstat[:content] = new_content
114
- end
115
-
116
- # Extract language stats using github's linguist gem
117
- language_stats = extract_language_stats(stats_by_file)
118
-
119
- # Normalize stats for json REST API
120
- change_count = stats_by_file.length
121
- total_additions = stats_by_file.inject(0) {|total, numstat| total += numstat[:additions]}
122
- total_deletions = stats_by_file.inject(0) {|total, numstat| total += numstat[:deletions]}
123
- else
124
- commit_count = 0
125
- total_additions = 0
126
- total_deletions = 0
127
- change_count = 0
128
- language_stats = []
129
- emails = []
130
- warnings.push "No independent commits yet, commit something!"
131
- end
132
-
133
- {
134
- :commits => commit_count,
135
- :additions => total_additions,
136
- :deletions => total_deletions,
137
- :files_changed => change_count,
138
- :language_stats => language_stats,
139
- :emails => emails,
140
- :warnings => warnings
141
- }
142
- end
143
-
144
- end
145
- end
@@ -1,5 +0,0 @@
1
- module Git
2
- module BranchStats
3
- VERSION = "0.0.3"
4
- end
5
- end