repokeeper 0.0.1

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.
@@ -0,0 +1,58 @@
1
+ require 'rugged'
2
+ require 'delegate'
3
+
4
+ module Repokeeper
5
+ class RepoProxy
6
+ # Walks specified range
7
+ class BoundedWalker < SimpleDelegator
8
+ def initialize(walker, rev_range)
9
+ super(walker)
10
+ @rev_range = rev_range
11
+ configure_walker
12
+ end
13
+
14
+ private
15
+
16
+ def configure_walker
17
+ sorting(Rugged::SORT_TOPO)
18
+ push(@rev_range.end_rev)
19
+ hide(@rev_range.start_rev) if @rev_range.start_rev
20
+ end
21
+ end
22
+
23
+ def initialize(repo_path)
24
+ @repo = open_repo(repo_path)
25
+ end
26
+
27
+ def commits(rev_range = nil)
28
+ rev_range ||= RevParser::RevRange.new
29
+ rev_range = check_rev_range(rev_range)
30
+ create_walker(rev_range).to_a
31
+ end
32
+
33
+ def local_branches
34
+ @repo.branches.each_name(:local).sort
35
+ end
36
+
37
+ def remote_branches
38
+ @repo.branches.each_name(:remote).sort
39
+ end
40
+
41
+ private
42
+
43
+ def check_rev_range(rev_range)
44
+ end_rev = rev_range.end_rev || @repo.head.name
45
+ start_rev = rev_range.start_rev
46
+ RevParser::RevRange.new(end_rev, start_rev)
47
+ end
48
+
49
+ def open_repo(repo_path)
50
+ Rugged::Repository.discover(repo_path)
51
+ end
52
+
53
+ def create_walker(rev_range)
54
+ walker = Rugged::Walker.new(@repo)
55
+ BoundedWalker.new(walker, rev_range)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,22 @@
1
+ module Repokeeper
2
+ # Parser for revision or revision range
3
+ class RevParser
4
+ RevRange = Struct.new(:end_rev, :start_rev)
5
+
6
+ attr_reader :range
7
+
8
+ def initialize(revisions = nil)
9
+ @revisions = revisions || ''
10
+ end
11
+
12
+ def parse
13
+ @range = RevRange.new(*parse_revs)
14
+ end
15
+
16
+ private
17
+
18
+ def parse_revs
19
+ @revisions.split('..').reverse
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,64 @@
1
+ module Repokeeper
2
+ class SimpleTextFormatter
3
+ def initialize(out_stream = $stdout)
4
+ @out_stream = out_stream
5
+ end
6
+
7
+ def started
8
+ @commits = Hash.new { |h, k| h[k] = [] }
9
+ @branches = Hash.new { |h, k| h[k] = [] }
10
+ end
11
+
12
+ def commits_analyzer_results(analyzer_name, offenses)
13
+ @commits[analyzer_name].concat(Array(offenses))
14
+ end
15
+
16
+ def branches_analyzer_results(analyzer_name, offenses)
17
+ @branches[analyzer_name].concat(Array(offenses))
18
+ end
19
+
20
+ def finished
21
+ write_results(@commits, :commit_offense_message)
22
+ write_results(@branches, :branch_offense_message)
23
+ end
24
+
25
+ private
26
+
27
+ def write_results(collection, write_offense_method)
28
+ collection.keys.sort.each do |analyzer_name|
29
+ offenses = collection[analyzer_name].compact
30
+ write_analyzer_results(analyzer_name, offenses, write_offense_method)
31
+ end
32
+ end
33
+
34
+ def write_analyzer_results(analyzer_name, offenses, write_offense_method)
35
+ @out_stream.puts "=== #{analyzer_name} ==="
36
+
37
+ if offenses.empty?
38
+ @out_stream.puts 'No issues were found'
39
+ else
40
+ offenses.each do |offense|
41
+ @out_stream.puts send(write_offense_method, offense)
42
+ end
43
+ end
44
+
45
+ @out_stream.puts
46
+ end
47
+
48
+ def commit_offense_message(offense)
49
+ error_message = offense.message
50
+ commit = offense.commit
51
+ id = commit.oid
52
+ author = commit.author[:name]
53
+
54
+ "#{id} by #{author}. #{error_message}"
55
+ end
56
+
57
+ def branch_offense_message(offense)
58
+ error_message = offense.message
59
+ branches = offense.branches.join(', ')
60
+
61
+ "#{error_message} - #{branches}"
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,10 @@
1
+ require 'levenshtein'
2
+
3
+ module Repokeeper
4
+ module Utils
5
+ # calculates levinstein distance of two strings
6
+ def self.edit_distance(str1, str2)
7
+ Levenshtein.distance(str1, str2)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module Repokeeper
2
+ VERSION = '0.0.1'
3
+ end
data/lib/repokeeper.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'repokeeper/version'
2
+ require 'repokeeper/config'
3
+ require 'repokeeper/cli'
4
+ require 'repokeeper/rev_parser'
5
+ require 'repokeeper/utils'
6
+ require 'repokeeper/repo_proxy'
7
+ require 'repokeeper/repo_analyzer'
8
+ require 'repokeeper/simple_text_formatter'
9
+ require 'repokeeper/analyzers'
10
+ require 'repokeeper/offenses/commit_offense'
11
+ require 'repokeeper/offenses/branches_offense'
metadata ADDED
@@ -0,0 +1,130 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: repokeeper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Anatoliy Plastinin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rugged
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.21'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.21'
27
+ - !ruby/object:Gem::Dependency
28
+ name: methadone
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: levenshtein-ffi
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.1.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.5'
69
+ description: |
70
+ Repokeeper is a tool for analysis of git repositotories
71
+ for common flaws in a workflow.
72
+ email:
73
+ - hello@antlypls.com
74
+ executables:
75
+ - repokeeper
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - GPLv3
80
+ - LICENSE
81
+ - README.md
82
+ - bin/repokeeper
83
+ - config/default.yml
84
+ - lib/repokeeper.rb
85
+ - lib/repokeeper/analyzers.rb
86
+ - lib/repokeeper/analyzers/analyzer.rb
87
+ - lib/repokeeper/analyzers/analyzers_set.rb
88
+ - lib/repokeeper/analyzers/branches/local_branches_count.rb
89
+ - lib/repokeeper/analyzers/branches/remote_branches_count.rb
90
+ - lib/repokeeper/analyzers/commits/merge_commits.rb
91
+ - lib/repokeeper/analyzers/commits/short_commit_message.rb
92
+ - lib/repokeeper/analyzers/commits/similar_commits.rb
93
+ - lib/repokeeper/analyzers/mixins/branches_analyzer.rb
94
+ - lib/repokeeper/analyzers/mixins/branches_count.rb
95
+ - lib/repokeeper/analyzers/mixins/commits_analyzer.rb
96
+ - lib/repokeeper/cli.rb
97
+ - lib/repokeeper/config.rb
98
+ - lib/repokeeper/offenses/branches_offense.rb
99
+ - lib/repokeeper/offenses/commit_offense.rb
100
+ - lib/repokeeper/repo_analyzer.rb
101
+ - lib/repokeeper/repo_proxy.rb
102
+ - lib/repokeeper/rev_parser.rb
103
+ - lib/repokeeper/simple_text_formatter.rb
104
+ - lib/repokeeper/utils.rb
105
+ - lib/repokeeper/version.rb
106
+ homepage: https://github.com/antlypls/repokeeper
107
+ licenses:
108
+ - GPLv3
109
+ metadata: {}
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubyforge_project:
126
+ rubygems_version: 2.4.1
127
+ signing_key:
128
+ specification_version: 4
129
+ summary: Repokeeper - git repo analysis tool
130
+ test_files: []