pronto 0.2.6 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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