git_fame 2.5.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/git_fame.gemspec DELETED
@@ -1,42 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/git_fame/version', __FILE__)
3
-
4
- Gem::Specification.new do |gem|
5
- gem.authors = ["Linus Oleander"]
6
- gem.email = ["linus@oleander.nu"]
7
- gem.description = "A command-line tool that helps you summarize and pretty-print collaborators in a git repository based on contributions"
8
- gem.summary = %q{
9
- git-fame is a command-line tool that helps you summarize and pretty-print collaborators in a git repository based on contributions. A Ruby wrapper for git-blame if you will.
10
-
11
- Generates stats like:
12
- - Number of files changed by a user
13
- - Number of commits by user
14
- - Lines of code by a user}
15
-
16
- gem.homepage = "http://oleander.io/git-fame-rb"
17
-
18
- gem.files = `git ls-files`.split($\)
19
- gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
- gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
21
- gem.name = "git_fame"
22
- gem.require_paths = ["lib"]
23
- gem.version = GitFame::VERSION
24
-
25
- gem.add_dependency("progressbar", "~> 0.21.0")
26
- gem.add_dependency("trollop", "~> 2.1.2")
27
- gem.add_dependency("hirb", "~> 0.7.3")
28
- gem.add_dependency("scrub_rb", "~> 1.0.1")
29
- gem.add_dependency("memoist", "~> 0.14.0")
30
- gem.add_dependency("method_profiler", "~> 2.0.1")
31
-
32
- gem.add_development_dependency("rspec", "~> 3.4.0")
33
- gem.add_development_dependency("rspec-collection_matchers", "~> 1.1.2")
34
- gem.add_development_dependency("rake", "~> 10.4.2")
35
- gem.add_development_dependency("coveralls", "~> 0.8.1")
36
- gem.add_development_dependency("json", "~> 1.8.3")
37
- gem.add_development_dependency("tins", "~> 1.6.0")
38
- gem.add_development_dependency("term-ansicolor", "~> 1.3.2")
39
- gem.add_development_dependency("colorize")
40
-
41
- gem.required_ruby_version = ">= 1.9.2"
42
- end
@@ -1,83 +0,0 @@
1
- # Extracted from the dolt gem. Currently not maintained.
2
- # Source: https://docs.omniref.com/ruby/gems/libdolt/0.33.14/symbols/Dolt::Git::Blame::PorcelainParser
3
- module GitFame
4
- class BlameParser
5
- def initialize(output)
6
- @output = output
7
- @commits = {}
8
- end
9
- def parse
10
- lines = @output.split("\n")
11
- chunks = []
12
- while lines.length > 0
13
- chunk = extract_header(lines)
14
- affected_lines = extract_lines(lines, chunk[:num_lines])
15
- if chunks.last && chunk[:oid] == chunks.last[:oid]
16
- chunks.last[:lines].concat(affected_lines)
17
- else
18
- chunk[:lines] = affected_lines
19
- chunks << chunk
20
- end
21
- end
22
- chunks
23
- rescue Exception => error
24
- raise Error, "Failed parsing Procelain: #{error.message}"
25
- end
26
-
27
- def is_header?(line)
28
- line =~ /^[0-9a-f]{40} \d+ \d+ \d+$/
29
- end
30
-
31
- def extract_header(lines)
32
- header = lines.shift
33
- pieces = header.scan(/^([0-9a-f]{40}) (\d+) (\d+) (\d+)$/).first
34
- header = { :oid => pieces.first, :num_lines => pieces[3].to_i }
35
- if lines.first =~ /^author/
36
- header[:author] = extract_hash(lines, :author)
37
- header[:committer] = extract_hash(lines, :committer)
38
- header[:summary] = extract(lines, "summary")
39
- header[:boundary] = extract(lines, "boundary")
40
- throwaway = lines.shift until throwaway =~ /^filename/
41
- @commits[header[:oid]] = header
42
- else
43
- header[:author] = @commits[header[:oid]][:author]
44
- header[:committer] = @commits[header[:oid]][:committer]
45
- header[:summary] = @commits[header[:oid]][:summary]
46
- end
47
- header
48
- end
49
-
50
- def extract_lines(lines, num)
51
- extracted = []
52
- num.times do
53
- if extracted.length > 0
54
- line = lines.shift # Header for next line
55
- end
56
- content = lines.shift # Actual content
57
- next unless content
58
- extracted.push(content[1..content.length]) # 8 spaces padding
59
- end
60
- extracted
61
- end
62
-
63
- def extract_hash(lines, type)
64
- {
65
- :name => extract(lines, "#{type}"),
66
- :mail => extract(lines, "#{type}-mail").gsub(/[<>]/, ""),
67
- :time => (Time.at(extract(lines, "#{type}-time").to_i).utc +
68
- Time.zone_offset(extract(lines, "#{type}-tz")))
69
- }
70
- end
71
- def extract(lines, thing)
72
- if thing == "boundary"
73
- if (line = lines.shift) == thing
74
- return true
75
- else
76
- return ! lines.unshift(line)
77
- end
78
- end
79
-
80
- lines.shift.split("#{thing} ")[1]
81
- end
82
- end
83
- end
@@ -1,27 +0,0 @@
1
- class CommitRange < Struct.new(:data, :current_branch)
2
- SHORT_LENGTH = 7
3
-
4
- def to_s(short = false)
5
- @_to_s ||= range.map do |commit|
6
- short ? shorten(commit) : commit
7
- end.join("..")
8
- end
9
-
10
- def is_range?
11
- data.is_a?(Array)
12
- end
13
-
14
- def range
15
- is_range? ? data : [data]
16
- end
17
-
18
- private
19
-
20
- def branch?(commit)
21
- current_branch == commit
22
- end
23
-
24
- def shorten(commit)
25
- branch?(commit) ? commit : commit[0..SHORT_LENGTH]
26
- end
27
- end
@@ -1,6 +0,0 @@
1
- module GitFame
2
- class Error < StandardError
3
- end
4
- class NothingFound < StandardError
5
- end
6
- end
data/lib/git_fame/file.rb DELETED
@@ -1,13 +0,0 @@
1
- module GitFame
2
- class FileUnit < Struct.new(:path)
3
- def extname
4
- return @_extname if @_extname
5
- @_extname = ::File.extname(path).sub(/^\./, "")
6
- @_extname = @_extname.empty? ? "unknown" : @_extname
7
- end
8
-
9
- def to_s
10
- path
11
- end
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- module GitFame
2
- module Helper
3
- #
4
- # @value Fixnum Value to be formated
5
- # @return String Formated according ActionView::Helpers::NumberHelper.number_with_delimiter
6
- #
7
- def number_with_delimiter(value)
8
- value.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
9
- end
10
- end
11
- end
@@ -1,20 +0,0 @@
1
- require "progressbar"
2
-
3
- class SilentProgressbar
4
- #
5
- # @name String Name for progressbar
6
- # @steps Fixnum Total number of steps
7
- # @active Should progressbar be visible?
8
- #
9
- def initialize(name, steps, active = false)
10
- @bp = ProgressBar.new(name, steps) if active
11
- end
12
-
13
- def finish
14
- @bp && @bp.finish
15
- end
16
-
17
- def increment
18
- @bp && @bp.inc
19
- end
20
- end
data/spec/bin_spec.rb DELETED
@@ -1,116 +0,0 @@
1
- describe "bin/git-fame" do
2
- it "should include the authors name" do
3
- run("--help").should include_output("Linus Oleander")
4
- end
5
-
6
- it "should include the the current version" do
7
- run("--version").should include_output(GitFame::VERSION)
8
- end
9
-
10
- it "should fail on invalid option" do
11
- run("--nope").should_not be_a_succees
12
- end
13
-
14
- it "should not accept a non-existent repository" do
15
- run("--repository=??").should_not be_a_succees
16
- end
17
-
18
- [
19
- "--sort=name",
20
- "--sort=commits",
21
- "--sort=loc",
22
- "--hide-progressbar",
23
- "--whitespace",
24
- "--by-type",
25
- "--include=hello",
26
- "--exclude=hello",
27
- "--extension=rb,ln",
28
- "--branch=master",
29
- "--format=csv",
30
- "--format=pretty",
31
- "--before=2010-01-01",
32
- "--after=1980-01-01",
33
- "--version",
34
- "--help",
35
- "--verbose",
36
- "--everything",
37
- "--timeout=10",
38
- "--timeout=-1"
39
- ].each do |option|
40
- it "should support #{option}" do
41
- run(option).should be_a_succees
42
- end
43
- end
44
-
45
- it "should sort by loc by default" do
46
- run("--sort=loc", "--progressbar=0").first.should eq(run("--progressbar=0").first)
47
- end
48
-
49
- context "dates" do
50
- it "should fail on invalid before date" do
51
- res = run("--before='---'")
52
- res.should_not be_a_succees
53
- res.should include_output("'---' is not a valid date")
54
- end
55
-
56
- it "should fail on invalid after date" do
57
- res = run("--after='---'")
58
- res.should_not be_a_succees
59
- res.should include_output("'---' is not a valid date")
60
- end
61
-
62
- it "should not print stack trace on invalid dates (--after)" do
63
- res = run("--after='---'")
64
- res.should_not be_a_succees
65
- res.should_not include_output("GitFame::Error")
66
- end
67
-
68
- it "should fail on invalid timeout" do
69
- run("--timeout=hello").should_not be_a_succees
70
- run("--timeout=").should_not be_a_succees
71
- run("--timeout=0").should_not be_a_succees
72
- run("--timeout=-2").should_not be_a_succees
73
- end
74
-
75
- it "should not print stack trace on invalid dates (--before)" do
76
- res = run("--before='---'")
77
- res.should_not be_a_succees
78
- res.should_not include_output("GitFame::Error")
79
- end
80
-
81
- it "should not print stack trace on out of span (--before)" do
82
- res = run("--before='1910-01-01'")
83
- res.should_not be_a_succees
84
- res.should_not include_output("GitFame::Error")
85
- end
86
-
87
- it "should not print stack trace on out of span (--after)" do
88
- res = run("--after='2100-01-01'")
89
- res.should_not be_a_succees
90
- res.should_not include_output("GitFame::Error")
91
- end
92
- end
93
-
94
- context "sort" do
95
- it "should fail on non existing option" do
96
- run("--sort=-----").should_not be_a_succees
97
- end
98
-
99
- results = []
100
- GitFame::SORT.each do |option|
101
- it "should be able to sort by #{option}" do
102
- out = run("--sort=#{option}")
103
- out.should be_a_succees
104
- # TODO: Not a impl. problem
105
- # Just not enough data
106
- unless option == "name"
107
- results.push(out.first)
108
- end
109
- end
110
- end
111
-
112
- it "#{GitFame::SORT.join(", ")} should not output the same thing" do
113
- results.uniq.sort.should eq(results.sort)
114
- end
115
- end
116
- end