pronto 0.2.6 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f111d71e81d706ca4c7b27acb6b7975f41c3a228
4
- data.tar.gz: 6e095990250968f7d9b21fd18408f6080587bd03
3
+ metadata.gz: eab403503e8dbeb40f3d944afe3e66d7a6cabca2
4
+ data.tar.gz: d57522b4873da0a0ea3f2034107469f026c33e0e
5
5
  SHA512:
6
- metadata.gz: 16cbef1d33a4944b03650b71e08ae9ddda91f424b0cf8e3ca62a8bd8fa155623e6433b906e4bb29732b4d0951c86dfdd7a3e619d8f1571fd5bc1c9b8ffccc425
7
- data.tar.gz: dc71ff6f03901e319fdff52d4e13837b76be86f0d80a065da512f3d6a6f8849aa3a1d15c2a3bf037d0797f2fb38677fb1b0220ad41c95176cbbb2ba638d9139d
6
+ metadata.gz: f4ede27aa270973fb03c9ba2b1431f1cf9e1cef42b527719f66b9aa3ac855cdb7e352b59bd21de000bc47c5af19f44b778229e319adece9a9a5f342ee2a3d36e
7
+ data.tar.gz: 345071ecbe13dd72c6d3dbfb807bbf345317d72cacf9bf3fbcb9f009c861f9154b09bbd248c37db33006fe6773fbd044ffd246c5072fd99dce886913610a5e35
@@ -1,34 +1,38 @@
1
1
  require 'rugged'
2
- require 'pronto/rugged/diff'
3
- require 'pronto/rugged/diff/delta'
4
- require 'pronto/rugged/diff/patch'
5
- require 'pronto/rugged/diff/line'
6
- require 'pronto/rugged/tree'
7
- require 'pronto/rugged/remote'
8
- require 'pronto/rugged/repository'
9
- require 'pronto/rugged/commit'
2
+ require 'octokit'
3
+ require 'forwardable'
4
+
5
+ require 'pronto/git/repository'
6
+ require 'pronto/git/patches'
7
+ require 'pronto/git/patch'
8
+ require 'pronto/git/line'
9
+ require 'pronto/git/remote'
10
10
 
11
11
  require 'pronto/plugin'
12
12
  require 'pronto/message'
13
13
  require 'pronto/runner'
14
+ require 'pronto/github'
14
15
 
15
16
  require 'pronto/formatter/text_formatter'
16
17
  require 'pronto/formatter/json_formatter'
17
18
  require 'pronto/formatter/github_formatter'
19
+ require 'pronto/formatter/github_pull_request_formatter'
18
20
  require 'pronto/formatter/checkstyle_formatter'
19
21
  require 'pronto/formatter/formatter'
20
22
 
21
23
  module Pronto
22
24
  def self.run(commit = 'master', repo_path = '.', formatter = nil)
23
- repo = Rugged::Repository.new(repo_path)
24
25
  commit ||= 'master'
25
- merge_base = repo.merge_base(commit, repo.head.target)
26
- patches = repo.diff(merge_base, repo.head.target)
27
26
 
28
- result = run_all_runners(patches, merge_base)
27
+ repo = Git::Repository.new(repo_path)
28
+ patches = repo.diff(commit)
29
+
30
+ result = run_all_runners(patches)
29
31
 
30
32
  formatter ||= default_formatter
31
- formatter.format(result, repo)
33
+ puts formatter.format(result, repo)
34
+
35
+ result
32
36
  end
33
37
 
34
38
  def self.gem_names
@@ -37,7 +41,7 @@ module Pronto
37
41
  true
38
42
  elsif gem.name != 'pronto'
39
43
  runner_path = File.join(gem.full_gem_path, "lib/pronto/#{gem.name}.rb")
40
- File.exists?(runner_path)
44
+ File.exist?(runner_path)
41
45
  end
42
46
  end
43
47
 
@@ -48,9 +52,9 @@ module Pronto
48
52
 
49
53
  private
50
54
 
51
- def self.run_all_runners(patches, commit)
55
+ def self.run_all_runners(patches)
52
56
  Runner.runners.map do |runner|
53
- runner.new.run(patches, commit)
57
+ runner.new.run(patches, patches.commit)
54
58
  end.flatten.compact
55
59
  end
56
60
 
@@ -14,6 +14,10 @@ module Pronto
14
14
 
15
15
  desc 'run', 'Run Pronto'
16
16
 
17
+ method_option :'exit-code',
18
+ type: :boolean,
19
+ banner: 'Exits with non-zero code if there were any warnings/errors.'
20
+
17
21
  method_option :commit,
18
22
  type: :string,
19
23
  default: 'master',
@@ -39,7 +43,8 @@ module Pronto
39
43
  end
40
44
 
41
45
  formatter = ::Pronto::Formatter.get(options[:formatter])
42
- puts ::Pronto.run(options[:commit], '.', formatter)
46
+ messages = ::Pronto.run(options[:commit], '.', formatter)
47
+ exit(messages.count) if options[:'exit-code']
43
48
  rescue Rugged::RepositoryError
44
49
  puts '"pronto" should be run from a git repository'
45
50
  end
@@ -11,6 +11,7 @@ module Pronto
11
11
 
12
12
  FORMATTERS = {
13
13
  'github' => GithubFormatter,
14
+ 'github_pr' => GithubPullRequestFormatter,
14
15
  'json' => JsonFormatter,
15
16
  'checkstyle' => CheckstyleFormatter,
16
17
  'text' => TextFormatter
@@ -1,17 +1,16 @@
1
- require 'octokit'
2
-
3
1
  module Pronto
4
2
  module Formatter
5
3
  class GithubFormatter
6
4
  def format(messages, repo)
7
5
  commit_messages = messages.map do |message|
8
- github_slug = repo.remotes.map(&:github_slug).compact.first
6
+ github_slug = repo.github_slug
9
7
  sha = message.commit_sha
10
- position = message.line.commit_line.position if message.line
11
- path = message.path
12
8
  body = message.msg
9
+ path = message.path
10
+ position = message.line.commit_line.position if message.line
13
11
 
14
- create_comment(github_slug, sha, position, path, body)
12
+ comment = Github::Comment.new(github_slug, sha, body, path, position)
13
+ create_comment(github_slug, sha, comment)
15
14
  end
16
15
 
17
16
  "#{commit_messages.compact.count} Pronto messages posted to GitHub"
@@ -19,26 +18,14 @@ module Pronto
19
18
 
20
19
  private
21
20
 
22
- def create_comment(repo, sha, position, path, body)
21
+ def create_comment(repo, sha, comment)
23
22
  comments = client.commit_comments(repo, sha)
24
-
25
- existing_comment = comments.find do |comment|
26
- comment.position == position &&
27
- comment.path == path &&
28
- comment.body == body
29
- end
30
-
31
- unless existing_comment
32
- client.create_commit_comment(repo, sha, body, path, nil, position)
33
- end
34
- end
35
-
36
- def access_token
37
- ENV['GITHUB_ACCESS_TOKEN']
23
+ existing = comments.any? { |c| comment == c }
24
+ client.create_commit_comment(repo, sha, comment) unless existing
38
25
  end
39
26
 
40
27
  def client
41
- @client ||= Octokit::Client.new(access_token: access_token)
28
+ @client ||= Github.new
42
29
  end
43
30
  end
44
31
  end
@@ -0,0 +1,41 @@
1
+ module Pronto
2
+ module Formatter
3
+ class GithubPullRequestFormatter
4
+ def format(messages, repo)
5
+ commit_messages = messages.map do |message|
6
+ github_slug = repo.github_slug
7
+ body = message.msg
8
+ path = message.path
9
+
10
+ commits = repo.commits_until(message.commit_sha)
11
+
12
+ line = nil
13
+ sha = commits.find do |commit|
14
+ patches = repo.show_commit(commit)
15
+ line = patches.find_line(message.full_path, message.line.new_lineno)
16
+ line
17
+ end
18
+
19
+ position = line.position - 1
20
+
21
+ comment = Github::Comment.new(github_slug, sha, body, path, position)
22
+ create_comment(github_slug, sha, comment)
23
+ end
24
+
25
+ "#{commit_messages.compact.count} Pronto messages posted to GitHub"
26
+ end
27
+
28
+ private
29
+
30
+ def create_comment(repo, sha, comment)
31
+ comments = client.pull_comments(repo, sha)
32
+ existing = comments.any? { |c| comment == c }
33
+ client.create_pull_comment(repo, sha, comment) unless existing
34
+ end
35
+
36
+ def client
37
+ @client ||= Github.new
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,44 @@
1
+ module Pronto
2
+ module Git
3
+ class Line < Struct.new(:line, :patch, :hunk)
4
+ extend Forwardable
5
+
6
+ def_delegators :line, :addition?, :deletion?, :content, :new_lineno,
7
+ :old_lineno, :line_origin
8
+
9
+ def position
10
+ hunk_index = patch.hunks.find_index { |h| h.header == hunk.header }
11
+ line_index = patch.lines.find_index(line)
12
+
13
+ line_index + hunk_index + 1
14
+ end
15
+
16
+ def commit_sha
17
+ blame[:final_commit_id] if blame
18
+ end
19
+
20
+ def commit_line
21
+ @commit_line ||= begin
22
+ patches = patch.repo.show_commit(commit_sha)
23
+
24
+ result = patches.find_line(patch.new_file_full_path,
25
+ blame[:orig_start_line_number])
26
+ result || self # no commit_line means that it was just added
27
+ end
28
+ end
29
+
30
+ def ==(other)
31
+ content == other.content &&
32
+ line_origin == other.line_origin &&
33
+ old_lineno == other.old_lineno &&
34
+ new_lineno == other.new_lineno
35
+ end
36
+
37
+ private
38
+
39
+ def blame
40
+ @blame ||= patch.blame(new_lineno)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,41 @@
1
+ module Pronto
2
+ module Git
3
+ class Patch < Struct.new(:patch, :repo)
4
+ extend Forwardable
5
+
6
+ def_delegators :patch, :delta, :hunks, :stat
7
+
8
+ def additions
9
+ stat[0]
10
+ end
11
+
12
+ def deletions
13
+ stat[1]
14
+ end
15
+
16
+ def blame(lineno)
17
+ repo.blame(self, lineno)
18
+ end
19
+
20
+ def lines
21
+ @lines ||= begin
22
+ hunks.flat_map do |hunk|
23
+ hunk.lines.map { |line| Line.new(line, self, hunk) }
24
+ end
25
+ end
26
+ end
27
+
28
+ def added_lines
29
+ lines.select(&:addition?)
30
+ end
31
+
32
+ def deleted_lines
33
+ lines.select(&:deletion?)
34
+ end
35
+
36
+ def new_file_full_path
37
+ repo.path.join(delta.new_file[:path])
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,24 @@
1
+ module Pronto
2
+ module Git
3
+ class Patches
4
+ include Enumerable
5
+
6
+ attr_reader :commit, :repo
7
+
8
+ def initialize(repo, commit, patches)
9
+ @commit = commit
10
+ @patches = patches.map { |patch| Git::Patch.new(patch, repo) }
11
+ end
12
+
13
+ def each(&block)
14
+ @patches.each(&block)
15
+ end
16
+
17
+ def find_line(path, line)
18
+ patch = find { |p| p.new_file_full_path == path }
19
+ lines = patch ? patch.lines : []
20
+ lines.find { |l| l.new_lineno == line }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,10 @@
1
+ module Pronto
2
+ module Git
3
+ class Remote < Struct.new(:remote)
4
+ def github_slug
5
+ match = /.*github.com(:|\/)(?<slug>.*).git/.match(remote.url)
6
+ match[:slug] if match
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,68 @@
1
+ require 'pathname'
2
+
3
+ module Pronto
4
+ module Git
5
+ class Repository
6
+ def initialize(path)
7
+ @repo = Rugged::Repository.new(path)
8
+ end
9
+
10
+ def github_slug
11
+ remotes.map(&:github_slug).compact.first
12
+ end
13
+
14
+ def diff(commit)
15
+ merge_base = merge_base(commit)
16
+ patches = @repo.diff(merge_base, head)
17
+ Patches.new(self, merge_base, patches)
18
+ end
19
+
20
+ def show_commit(sha)
21
+ return [] unless sha
22
+
23
+ commit = @repo.lookup(sha)
24
+ return [] if commit.parents.count != 1
25
+
26
+ # TODO: Rugged does not seem to support diffing against multiple parents
27
+ diff = commit.diff(reverse: true)
28
+ return [] if diff.nil?
29
+
30
+ Patches.new(self, sha, diff.patches)
31
+ end
32
+
33
+ def commits_until(sha)
34
+ result = []
35
+ @repo.walk('HEAD', Rugged::SORT_TOPO).take_while do |commit|
36
+ result << commit.oid
37
+ !commit.oid.start_with?(sha)
38
+ end
39
+ result
40
+ end
41
+
42
+ def path
43
+ Pathname.new(@repo.path).parent
44
+ end
45
+
46
+ def blame(patch, lineno)
47
+ Rugged::Blame.new(@repo, patch.delta.new_file[:path],
48
+ min_line: lineno, max_line: lineno,
49
+ track_copies_same_file: true,
50
+ track_copies_any_commit_copies: true)[0]
51
+ end
52
+
53
+ private
54
+
55
+ def merge_base(commit)
56
+ @repo.merge_base(commit, head)
57
+ end
58
+
59
+ def head
60
+ @repo.head.target
61
+ end
62
+
63
+ def remotes
64
+ @remotes ||= @repo.remotes.map { |remote| Remote.new(remote) }
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,55 @@
1
+ module Pronto
2
+ class Github
3
+ def initialize
4
+ @comment_cache = {}
5
+ end
6
+
7
+ def pull_comments(repo, sha)
8
+ @comment_cache["#{repo}/#{pull_id}/#{sha}"] ||= begin
9
+ client.pull_comments(repo, pull_id).map do |comment|
10
+ Comment.new(repo, sha, comment.body, comment.path, comment.position)
11
+ end
12
+ end
13
+ end
14
+
15
+ def commit_comments(repo, sha)
16
+ @comment_cache["#{repo}/#{sha}"] ||= begin
17
+ client.commit_comments(repo, sha).map do |comment|
18
+ Comment.new(repo, sha, comment.body, comment.path, comment.position)
19
+ end
20
+ end
21
+ end
22
+
23
+ def create_commit_comment(repo, sha, comment)
24
+ client.create_commit_comment(repo, sha, comment.body, comment.path,
25
+ nil, comment.position)
26
+ end
27
+
28
+ def create_pull_comment(repo, sha, comment)
29
+ client.create_pull_comment(repo, pull_id, comment.body, sha, comment.path,
30
+ comment.position)
31
+ end
32
+
33
+ private
34
+
35
+ def client
36
+ @client ||= Octokit::Client.new(access_token: access_token)
37
+ end
38
+
39
+ def pull_id
40
+ ENV['PULL_REQUEST_ID'].to_i
41
+ end
42
+
43
+ def access_token
44
+ ENV['GITHUB_ACCESS_TOKEN']
45
+ end
46
+
47
+ class Comment < Struct.new(:repo, :sha, :body, :path, :position)
48
+ def ==(other)
49
+ position == other.position &&
50
+ path == other.path &&
51
+ body == other.body
52
+ end
53
+ end
54
+ end
55
+ end
@@ -17,8 +17,12 @@ module Pronto
17
17
  @commit_sha ||= line.commit_sha if line
18
18
  end
19
19
 
20
+ def full_path
21
+ repo.path.join(path) if repo
22
+ end
23
+
20
24
  def repo
21
- line.patch.delta.repo if line
25
+ line.patch.repo if line
22
26
  end
23
27
  end
24
28
  end
@@ -1,5 +1,4 @@
1
1
  require 'pronto'
2
- require 'octokit'
3
2
  require 'rake'
4
3
  require 'rake/tasklib'
5
4
 
@@ -1,3 +1,3 @@
1
1
  module Pronto
2
- VERSION = '0.2.6'
2
+ VERSION = '0.3.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pronto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mindaugas Mozūras
@@ -14,122 +14,86 @@ dependencies:
14
14
  name: rugged
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
18
- - !ruby/object:Gem::Version
19
- version: 0.19.0
20
- - - <=
17
+ - - ~>
21
18
  - !ruby/object:Gem::Version
22
- version: 0.20.0
19
+ version: 0.21.0
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - '>='
28
- - !ruby/object:Gem::Version
29
- version: 0.19.0
30
- - - <=
24
+ - - ~>
31
25
  - !ruby/object:Gem::Version
32
- version: 0.20.0
26
+ version: 0.21.0
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: thor
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
31
  - - ~>
38
32
  - !ruby/object:Gem::Version
39
- version: '0.19'
40
- - - '>='
41
- - !ruby/object:Gem::Version
42
- version: 0.19.1
33
+ version: 0.19.0
43
34
  type: :runtime
44
35
  prerelease: false
45
36
  version_requirements: !ruby/object:Gem::Requirement
46
37
  requirements:
47
38
  - - ~>
48
39
  - !ruby/object:Gem::Version
49
- version: '0.19'
50
- - - '>='
51
- - !ruby/object:Gem::Version
52
- version: 0.19.1
40
+ version: 0.19.0
53
41
  - !ruby/object:Gem::Dependency
54
42
  name: octokit
55
43
  requirement: !ruby/object:Gem::Requirement
56
44
  requirements:
57
45
  - - ~>
58
46
  - !ruby/object:Gem::Version
59
- version: '2.7'
60
- - - '>='
61
- - !ruby/object:Gem::Version
62
- version: 2.7.1
47
+ version: '3.2'
63
48
  type: :runtime
64
49
  prerelease: false
65
50
  version_requirements: !ruby/object:Gem::Requirement
66
51
  requirements:
67
52
  - - ~>
68
53
  - !ruby/object:Gem::Version
69
- version: '2.7'
70
- - - '>='
71
- - !ruby/object:Gem::Version
72
- version: 2.7.1
54
+ version: '3.2'
73
55
  - !ruby/object:Gem::Dependency
74
- name: grit
56
+ name: rake
75
57
  requirement: !ruby/object:Gem::Requirement
76
58
  requirements:
77
59
  - - ~>
78
60
  - !ruby/object:Gem::Version
79
- version: '2.5'
80
- - - '>='
81
- - !ruby/object:Gem::Version
82
- version: 2.5.0
83
- type: :runtime
61
+ version: '10.3'
62
+ type: :development
84
63
  prerelease: false
85
64
  version_requirements: !ruby/object:Gem::Requirement
86
65
  requirements:
87
66
  - - ~>
88
67
  - !ruby/object:Gem::Version
89
- version: '2.5'
90
- - - '>='
91
- - !ruby/object:Gem::Version
92
- version: 2.5.0
68
+ version: '10.3'
93
69
  - !ruby/object:Gem::Dependency
94
- name: rake
70
+ name: rspec
95
71
  requirement: !ruby/object:Gem::Requirement
96
72
  requirements:
97
73
  - - ~>
98
74
  - !ruby/object:Gem::Version
99
- version: '10.1'
100
- - - '>='
101
- - !ruby/object:Gem::Version
102
- version: 10.1.0
75
+ version: '3.0'
103
76
  type: :development
104
77
  prerelease: false
105
78
  version_requirements: !ruby/object:Gem::Requirement
106
79
  requirements:
107
80
  - - ~>
108
81
  - !ruby/object:Gem::Version
109
- version: '10.1'
110
- - - '>='
111
- - !ruby/object:Gem::Version
112
- version: 10.1.0
82
+ version: '3.0'
113
83
  - !ruby/object:Gem::Dependency
114
- name: rspec
84
+ name: rspec-its
115
85
  requirement: !ruby/object:Gem::Requirement
116
86
  requirements:
117
87
  - - ~>
118
88
  - !ruby/object:Gem::Version
119
- version: '2.14'
120
- - - '>='
121
- - !ruby/object:Gem::Version
122
- version: 2.14.0
89
+ version: '1.0'
123
90
  type: :development
124
91
  prerelease: false
125
92
  version_requirements: !ruby/object:Gem::Requirement
126
93
  requirements:
127
94
  - - ~>
128
95
  - !ruby/object:Gem::Version
129
- version: '2.14'
130
- - - '>='
131
- - !ruby/object:Gem::Version
132
- version: 2.14.0
96
+ version: '1.0'
133
97
  description: |2
134
98
  Pronto runs analysis quickly by checking only the relevant changes. Created
135
99
  to be used on pull requests, but suited for other scenarios as well. Perfect
@@ -149,19 +113,18 @@ files:
149
113
  - lib/pronto/formatter/checkstyle_formatter.rb
150
114
  - lib/pronto/formatter/formatter.rb
151
115
  - lib/pronto/formatter/github_formatter.rb
116
+ - lib/pronto/formatter/github_pull_request_formatter.rb
152
117
  - lib/pronto/formatter/json_formatter.rb
153
118
  - lib/pronto/formatter/text_formatter.rb
119
+ - lib/pronto/git/line.rb
120
+ - lib/pronto/git/patch.rb
121
+ - lib/pronto/git/patches.rb
122
+ - lib/pronto/git/remote.rb
123
+ - lib/pronto/git/repository.rb
124
+ - lib/pronto/github.rb
154
125
  - lib/pronto/message.rb
155
126
  - lib/pronto/plugin.rb
156
127
  - lib/pronto/rake_task/travis_pull_request.rb
157
- - lib/pronto/rugged/commit.rb
158
- - lib/pronto/rugged/diff.rb
159
- - lib/pronto/rugged/diff/delta.rb
160
- - lib/pronto/rugged/diff/line.rb
161
- - lib/pronto/rugged/diff/patch.rb
162
- - lib/pronto/rugged/remote.rb
163
- - lib/pronto/rugged/repository.rb
164
- - lib/pronto/rugged/tree.rb
165
128
  - lib/pronto/runner.rb
166
129
  - lib/pronto/version.rb
167
130
  homepage: http://github.org/mmozuras/pronto
@@ -1,9 +0,0 @@
1
- module Rugged
2
- class Commit
3
- def show
4
- # TODO: Rugged does not seem to support diffing against multiple parents
5
- return if parents.count != 1
6
- diff(parents.first, reverse: true)
7
- end
8
- end
9
- end
@@ -1,6 +0,0 @@
1
- module Rugged
2
- class Diff
3
- attr_reader :owner
4
- alias_method :tree, :owner
5
- end
6
- end
@@ -1,16 +0,0 @@
1
- require 'pathname'
2
-
3
- module Rugged
4
- class Diff
5
- class Delta
6
- def repo
7
- diff.tree.repo
8
- end
9
-
10
- def new_file_full_path
11
- repo_path = Pathname.new(repo.path).parent
12
- repo_path.join(new_file[:path])
13
- end
14
- end
15
- end
16
- end
@@ -1,63 +0,0 @@
1
- module Rugged
2
- class Diff
3
- class Line
4
- def patch
5
- hunk.owner
6
- end
7
-
8
- def position
9
- hunk_index = patch.hunks.find_index { |h| h.header == hunk.header }
10
- line_index = patch.lines.find_index(self)
11
-
12
- line_index + hunk_index + 1
13
- end
14
-
15
- def commit
16
- @commit ||= begin
17
- repo.lookup(commit_sha) if commit_sha
18
- end
19
- end
20
-
21
- def commit_sha
22
- @commit_sha ||= begin
23
- blameline.commit.id if blameline
24
- end
25
- end
26
-
27
- def commit_line
28
- @commit_line ||= begin
29
- diff = commit.show
30
- patches = diff ? diff.patches : []
31
- commit_patch = patches.find do |p|
32
- patch.new_file_full_path == p.new_file_full_path
33
- end
34
-
35
- lines = commit_patch ? commit_patch.lines : []
36
- result = lines.find { |l| blameline.lineno == l.new_lineno }
37
-
38
- result || self # no commit_line means that it was just added
39
- end
40
- end
41
-
42
- def ==(other)
43
- content == other.content &&
44
- line_origin == other.line_origin &&
45
- old_lineno == other.old_lineno &&
46
- new_lineno == other.new_lineno
47
- end
48
-
49
- private
50
-
51
- def repo
52
- patch.diff.tree.repo
53
- end
54
-
55
- def blameline
56
- @blameline ||= begin
57
- blamelines = repo.blame(patch.new_file_full_path).lines
58
- blamelines.find { |line| line.lineno == new_lineno }
59
- end
60
- end
61
- end
62
- end
63
- end
@@ -1,21 +0,0 @@
1
- module Rugged
2
- class Diff
3
- class Patch
4
- def added_lines
5
- lines.select(&:addition?)
6
- end
7
-
8
- def deleted_lines
9
- lines.select(&:deletion?)
10
- end
11
-
12
- def new_file_full_path
13
- delta.new_file_full_path
14
- end
15
-
16
- def lines
17
- map(&:lines).flatten.compact
18
- end
19
- end
20
- end
21
- end
@@ -1,8 +0,0 @@
1
- module Rugged
2
- class Remote
3
- def github_slug
4
- match = /.*github.com(:|\/)(?<slug>.*).git/.match(url)
5
- match[:slug] if match
6
- end
7
- end
8
- end
@@ -1,11 +0,0 @@
1
- require 'grit'
2
-
3
- module Rugged
4
- class Repository
5
- def blame(filepath)
6
- # TODO: Using grit blame implementation for now.
7
- # Replace it with Rugged implementation when it's available.
8
- ::Grit::Repo.new(path).blame(filepath, 'HEAD')
9
- end
10
- end
11
- end
@@ -1,6 +0,0 @@
1
- module Rugged
2
- class Tree
3
- attr_reader :owner
4
- alias_method :repo, :owner
5
- end
6
- end