rjgit 5.6.0.0 → 5.6.1.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
  SHA256:
3
- metadata.gz: c590ad61a1ab2ef9e2a778f49722cf46886d390185a02aa6ca1ac8ef0b0e8073
4
- data.tar.gz: 2c13389fc678529de6623891ff123f6fe05effc86b147e21d488869bcfdb2741
3
+ metadata.gz: 11fd7309b1391fba839301750f2c1fe51d0b38abbb72a36088c39f729ad0368f
4
+ data.tar.gz: e890015d41e4408358b9d000d8d5d94a251a8dfe9a4815f75c22858f607c01b0
5
5
  SHA512:
6
- metadata.gz: af2a8f79cf5600e81a6df902d10d4fa9d51ce2e52b99d012ca9c978e36611d332f6647a5c267e225e5e5626841fd28985efef97b171f47f293d3da2866ab592b
7
- data.tar.gz: acab43332a63d482908b9c52b835cfd9ee364880af1558c53829b81ef86a71a984b6d37413a36156331d47a7d21d4c4adc4cc5fd2b01a27b31c22c47d9f2c445
6
+ metadata.gz: a8afbaa28cfd0a432c3d0d3ad9aa54e34a9e262bbe924d6554a3b7745abbe3025508015ccd97c8bdadae38a89a87f04ef71eb3c052ba9508129d398dfc9bdec4
7
+ data.tar.gz: fc84910f12f9c6b5a768e9b06ef7336363fa5f308192d19493c6f2ae2047f3e7032392305795dff9c1225b372ff903838d843f02b4cab6c7aefa47d49fa56ba2
data/Gemfile CHANGED
@@ -1,12 +1,12 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem "mime-types", "~> 2.6.2"
4
- gem "rake", "~> 10.4.2"
3
+ gem 'mime-types', '~> 2.6.2'
4
+ gem 'rake', '>= 12.3.3'
5
5
 
6
- gem 'coveralls', require: false
6
+ gem 'coveralls', '~> 0.8.23', require: false
7
7
 
8
8
  group :test do
9
- gem "rspec", "~> 3.4.0"
10
- gem "rspec-collection_matchers", "~> 1.1.2"
11
- gem "simplecov"
9
+ gem 'rspec', '~> 3.4.0'
10
+ gem 'rspec-collection_matchers', '~> 1.1.2'
11
+ gem 'simplecov'
12
12
  end
data/README.md CHANGED
@@ -75,6 +75,13 @@ repo.find('959329025f67539fb82e76b02782322fad032821')
75
75
  repo.find('959329025f67539fb82e76b02782322fad032821', :commit) # Find a specific :commit, :blob, :tree, or :tag
76
76
  ```
77
77
 
78
+ ### Logs
79
+
80
+ ```ruby
81
+ repo.git.log # Returns an Array of Commits constituting the log for the default branch
82
+ repo.git.log("follow-rename.txt", "HEAD", follow: true, list_renames: true) # Log for a specific path, tracking the pathname over renames. Returns an Array of TrackingCommits, which store the tracked filename: [#<RJGit::TrackingCommit:0x773014d3 @tracked_pathname="follow-rename.txt" ...>]
83
+ ```
84
+
78
85
  ### Getting diffs
79
86
  ```ruby
80
87
  sha1 = repo.head.id
@@ -4,7 +4,7 @@ module RJGit
4
4
  import 'org.eclipse.jgit.revwalk.RevCommit'
5
5
  import 'org.eclipse.jgit.diff.DiffFormatter'
6
6
  import 'org.eclipse.jgit.util.io.DisabledOutputStream'
7
-
7
+
8
8
  class Commit
9
9
 
10
10
  attr_reader :id, :parents, :actor, :committer, :authored_date, :committed_date
@@ -100,12 +100,12 @@ module RJGit
100
100
  Commit.new(repository, RevWalk.new(repository).parseCommit(new_commit))
101
101
  end
102
102
 
103
- def self.find_head(repository)
103
+ def self.find_head(repository, ref = Constants::HEAD)
104
104
  repository = RJGit.repository_type(repository)
105
105
  return nil if repository.nil?
106
106
  begin
107
107
  walk = RevWalk.new(repository)
108
- objhead = repository.resolve(Constants::HEAD)
108
+ objhead = repository.resolve(ref)
109
109
  return Commit.new(repository, walk.parseCommit(objhead))
110
110
  rescue java.lang.NullPointerException => e
111
111
  return nil
@@ -128,4 +128,13 @@ module RJGit
128
128
  end
129
129
 
130
130
  end
131
+
132
+ class TrackingCommit < Commit
133
+ attr_reader :tracked_pathname # This commit is part of a log for a single pathname. The tracked_pathname attribute tracks the pathname over renames.
134
+
135
+ def initialize(repository, commit, tracked_pathname = nil)
136
+ super(repository, commit)
137
+ @tracked_pathname = tracked_pathname
138
+ end
139
+ end
131
140
  end
data/lib/git.rb CHANGED
@@ -15,6 +15,10 @@ module RJGit
15
15
  import 'org.eclipse.jgit.api.TransportConfigCallback'
16
16
  import 'org.eclipse.jgit.transport.JschConfigSessionFactory'
17
17
  import 'org.eclipse.jgit.transport.SshTransport'
18
+ import 'org.eclipse.jgit.revwalk.FollowFilter'
19
+ import 'org.eclipse.jgit.revwalk.TreeRevFilter'
20
+
21
+ class PatchApplyException < StandardError; end
18
22
 
19
23
  class RubyGit
20
24
 
@@ -47,67 +51,58 @@ module RJGit
47
51
  return [] unless ref
48
52
  jcommits = Array.new
49
53
 
54
+ logs = @jgit.log
55
+ logs.add(ref)
56
+
50
57
  if path && options[:follow]
51
- current_path = path
52
- start = nil
53
- loop do
54
- logs = @jgit.log.add(ref).addPath(current_path).call
55
- logs.each do |jcommit|
56
- next if jcommits.include?(jcommit)
57
- jcommits << jcommit
58
- start = jcommit
59
- end
60
- current_path = follow_renames(start, current_path) if start
61
- break if current_path.nil?
62
- end
58
+ cfg = Configuration.new(nil)
59
+ cfg.add_setting('renames', true, 'diffs', nil)
60
+ follow = FollowFilter.create(path, cfg.jconfig.get(org.eclipse.jgit.diff.DiffConfig::KEY))
61
+ logs.set_rev_filter(TreeRevFilter.new(RevWalk.new(jrepo), follow))
62
+ elsif path
63
+ logs.addPath(path)
64
+ end
63
65
 
64
- else
65
- logs = @jgit.log
66
- logs.add(ref)
67
- logs.addPath(path) if path
68
- logs.setMaxCount(options[:max_count]) if options[:max_count]
69
- logs.setSkip(options[:skip]) if options[:skip]
70
-
71
- if (options[:since] && options[:until])
72
- revwalk = RevWalk.new(jrepo)
73
- since_commit = revwalk.parseCommit(jrepo.resolve(options[:since]))
74
- until_commit = revwalk.parseCommit(jrepo.resolve(options[:until]))
75
- logs.addRange(since_commit, until_commit)
76
- end
77
- if options[:not]
78
- revwalk = RevWalk.new(jrepo)
79
- options[:not].each do |ref|
80
- logs.not(revwalk.parseCommit(jrepo.resolve(ref)))
81
- end
82
- end
83
- jcommits = logs.call
66
+ logs.setMaxCount(options[:max_count]) if options[:max_count]
67
+ logs.setSkip(options[:skip]) if options[:skip]
68
+
69
+ if (options[:since] && options[:until])
70
+ revwalk = RevWalk.new(jrepo)
71
+ since_commit = revwalk.parseCommit(jrepo.resolve(options[:since]))
72
+ until_commit = revwalk.parseCommit(jrepo.resolve(options[:until]))
73
+ logs.addRange(since_commit, until_commit)
84
74
  end
85
75
 
86
- jcommits.map{ |jcommit| Commit.new(jrepo, jcommit) }
87
- end
76
+ if options[:not]
77
+ revwalk = RevWalk.new(jrepo)
78
+ options[:not].each do |ref|
79
+ logs.not(revwalk.parseCommit(jrepo.resolve(ref)))
80
+ end
81
+ end
88
82
 
89
- def follow_renames(jcommit, path)
90
- commits = @jgit.log.add(jcommit).call
91
- commits.each do |jcommit_prev|
92
- tree_start = jcommit.getTree
93
- tree_prev = jcommit_prev.getTree
94
- treewalk = TreeWalk.new(jrepo)
95
- #treewalk.setFilter(PathFilter.create(File.dirname(path)))
96
- treewalk.addTree(tree_prev)
97
- treewalk.addTree(tree_start)
98
- treewalk.setRecursive(true)
99
- rename_detector = RenameDetector.new(jrepo)
100
- rename_detector.addAll(DiffEntry.scan(treewalk))
101
- diff_entries = rename_detector.compute
102
- diff_entries.each do |entry|
103
- if ((entry.getChangeType == DiffEntry::ChangeType::RENAME || entry.getChangeType == DiffEntry::ChangeType::COPY) && entry.getNewPath.match(path))
104
- return entry.getOldPath
105
- end
83
+ if options[:follow] && options[:list_renames]
84
+ df = DiffFormatter.new(DisabledOutputStream::INSTANCE)
85
+ df.set_repository(jrepo)
86
+ df.set_context(0)
87
+ df.set_path_filter(follow)
88
+ df.set_detect_renames(true)
89
+ prev_commit = nil
90
+ pathname = path
91
+ end
92
+
93
+ commits = logs.call.map do |jcommit|
94
+ if path && options[:follow] && options[:list_renames]
95
+ entries = df.scan(jcommit, prev_commit).to_a
96
+ pathname = entries.empty? ? pathname : entries.last.get_old_path
97
+ prev_commit = jcommit
98
+ TrackingCommit.new(jrepo, jcommit, pathname)
99
+ else
100
+ Commit.new(jrepo, jcommit)
106
101
  end
107
102
  end
108
- return nil
109
- end
110
103
 
104
+ commits
105
+ end
111
106
 
112
107
  def branch_list
113
108
  branch = @jgit.branch_list
@@ -289,7 +284,11 @@ module RJGit
289
284
  end
290
285
 
291
286
  def apply(input_stream)
292
- apply_result = @jgit.apply.set_patch(input_stream).call
287
+ begin
288
+ apply_result = @jgit.apply.set_patch(input_stream).call
289
+ rescue Java::OrgEclipseJgitApiErrors::PatchApplyException
290
+ raise RJGit::PatchApplyException
291
+ end
293
292
  updated_files = apply_result.get_updated_files
294
293
  updated_files_parsed = []
295
294
  updated_files.each do |file|
@@ -1,5 +1,4 @@
1
1
  module RJGit
2
-
3
2
  begin
4
3
  require 'java'
5
4
  Dir["#{File.dirname(__FILE__)}/java/jars/*.jar"].each { |jar| require jar }
@@ -10,7 +9,7 @@ module RJGit
10
9
  def self.version
11
10
  VERSION
12
11
  end
13
-
12
+
14
13
  require 'uri'
15
14
  require 'stringio'
16
15
  # gem requires
@@ -19,15 +18,16 @@ module RJGit
19
18
  require "#{File.dirname(__FILE__)}/rjgit_helpers.rb"
20
19
  # require everything else
21
20
  begin
22
- Dir["#{File.dirname(__FILE__)}/*.rb"].each do |file|
21
+ Dir["#{File.dirname(__FILE__)}/*.rb"].each do |file|
23
22
  require file
24
23
  end
25
24
  end
26
-
25
+
27
26
  import 'org.eclipse.jgit.lib.ObjectId'
28
-
27
+
29
28
  module Porcelain
30
-
29
+
30
+ import 'org.eclipse.jgit.lib.Constants'
31
31
  import 'org.eclipse.jgit.api.AddCommand'
32
32
  import 'org.eclipse.jgit.api.CommitCommand'
33
33
  import 'org.eclipse.jgit.api.BlameCommand'
@@ -36,20 +36,19 @@ module RJGit
36
36
  import 'org.eclipse.jgit.treewalk.CanonicalTreeParser'
37
37
  import 'org.eclipse.jgit.diff.DiffFormatter'
38
38
 
39
-
40
39
  # http://wiki.eclipse.org/JGit/User_Guide#Porcelain_API
41
40
  def self.add(repository, file_pattern)
42
41
  repository.add(file_pattern)
43
42
  end
44
-
43
+
45
44
  def self.commit(repository, message="")
46
45
  repository.commit(message)
47
46
  end
48
-
47
+
49
48
  def self.object_for_tag(repository, tag)
50
49
  repository.find(tag.object.name, RJGit.sym_for_type(tag.object_type))
51
50
  end
52
-
51
+
53
52
  # http://dev.eclipse.org/mhonarc/lists/jgit-dev/msg00558.html
54
53
  def self.cat_file(repository, blob)
55
54
  jrepo = RJGit.repository_type(repository)
@@ -65,7 +64,7 @@ module RJGit
65
64
  bytes = jrepo.open(jblob.id).get_bytes
66
65
  return bytes.to_a.pack('c*').force_encoding('UTF-8')
67
66
  end
68
-
67
+
69
68
  def self.ls_tree(repository, path=nil, treeish=Constants::HEAD, options={})
70
69
  options = {recursive: false, print: false, io: $stdout, path_filter: nil}.merge options
71
70
  jrepo = RJGit.repository_type(repository)
@@ -95,7 +94,7 @@ module RJGit
95
94
  treewalk.set_recursive(options[:recursive])
96
95
  treewalk.set_filter(PathFilter.create(options[:path_filter])) if options[:path_filter]
97
96
  entries = []
98
-
97
+
99
98
  while treewalk.next
100
99
  entry = {}
101
100
  mode = treewalk.get_file_mode(0)
@@ -107,8 +106,8 @@ module RJGit
107
106
  end
108
107
  options[:io].puts RJGit.stringify(entries) if options[:print]
109
108
  entries
110
- end
111
-
109
+ end
110
+
112
111
  def self.blame(repository, file_path, options={})
113
112
  options = {:print => false, :io => $stdout}.merge(options)
114
113
  jrepo = RJGit.repository_type(repository)
@@ -130,28 +129,22 @@ module RJGit
130
129
  options[:io].puts RJGit.stringify(blame) if options[:print]
131
130
  return blame
132
131
  end
133
-
132
+
134
133
  def self.diff(repository, options = {})
135
134
  options = {:namestatus => false, :patch => false}.merge(options)
136
135
  repo = RJGit.repository_type(repository)
137
136
  git = RubyGit.new(repo).jgit
138
137
  diff_command = git.diff
139
- if options[:old_rev]
138
+ [:old, :new].each do |which_rev|
139
+ if rev = options["#{which_rev}_rev".to_sym]
140
140
  reader = repo.new_object_reader
141
- old_tree = repo.resolve("#{options[:old_rev]}^{tree}")
142
- old_tree_iter = CanonicalTreeParser.new
143
- old_tree_iter.reset(reader, old_tree)
144
- diff_command.set_old_tree(old_tree_iter)
145
- end
146
- if options[:new_rev]
147
- reader = repo.new_object_reader unless reader
148
- new_tree = repo.resolve("#{options[:new_rev]}^{tree}")
149
- new_tree_iter = CanonicalTreeParser.new
150
- new_tree_iter.reset(reader, new_tree)
151
- diff_command.set_new_tree(new_tree_iter)
141
+ parser = CanonicalTreeParser.new
142
+ parser.reset(reader, repo.resolve("#{rev}^{tree}"))
143
+ diff_command.send("set_#{which_rev}_tree".to_sym, parser)
152
144
  end
145
+ end
153
146
  diff_command.set_path_filter(PathFilter.create(options[:file_path])) if options[:file_path]
154
- diff_command.set_show_name_and_status_only(true) if options[:namestatus]
147
+ diff_command.set_show_name_and_status_only(true) if options[:namestatus]
155
148
  diff_command.set_cached(true) if options[:cached]
156
149
  diff_entries = diff_command.call
157
150
  diff_entries = diff_entries.to_array.to_ary
@@ -169,34 +162,34 @@ module RJGit
169
162
  diff_entries = options[:patch] ? result : diff_entries.map {|entry| [entry]}
170
163
  RJGit.convert_diff_entries(diff_entries)
171
164
  end
172
-
165
+
173
166
  end
174
-
167
+
175
168
  module Plumbing
176
169
  import org.eclipse.jgit.lib.Constants
177
-
170
+
178
171
  class TreeBuilder
179
172
  import org.eclipse.jgit.lib.FileMode
180
173
  import org.eclipse.jgit.lib.TreeFormatter
181
-
182
-
174
+ import org.eclipse.jgit.patch.Patch
175
+
183
176
  attr_accessor :treemap
184
177
  attr_reader :log
185
-
178
+
186
179
  def initialize(repository)
187
180
  @jrepo = RJGit.repository_type(repository)
188
181
  @treemap = {}
189
182
  init_log
190
183
  end
191
-
184
+
192
185
  def object_inserter
193
186
  @object_inserter ||= @jrepo.newObjectInserter
194
187
  end
195
-
188
+
196
189
  def init_log
197
190
  @log = {:deleted => [], :added => [] }
198
191
  end
199
-
192
+
200
193
  def only_contains_deletions(hashmap)
201
194
  hashmap.each do |key, value|
202
195
  if value.is_a?(Hash)
@@ -207,7 +200,7 @@ module RJGit
207
200
  end
208
201
  true
209
202
  end
210
-
203
+
211
204
  def build_tree(start_tree, treemap = nil, flush = false)
212
205
  existing_trees = {}
213
206
  untouched_objects = {}
@@ -232,7 +225,7 @@ module RJGit
232
225
  end
233
226
  end
234
227
  end
235
-
228
+
236
229
  sorted_treemap = treemap.inject({}) {|h, (k,v)| v.is_a?(Hash) ? h["#{k}/"] = v : h[k] = v; h }.merge(untouched_objects).sort
237
230
  sorted_treemap.each do |object_name, data|
238
231
  case data
@@ -252,27 +245,27 @@ module RJGit
252
245
  end
253
246
  object_inserter.insert(formatter)
254
247
  end
255
-
248
+
256
249
  def write_blob(contents, flush = false)
257
250
  blobid = object_inserter.insert(Constants::OBJ_BLOB, contents.to_java_bytes)
258
251
  object_inserter.flush if flush
259
252
  blobid
260
253
  end
261
-
254
+
262
255
  end
263
-
256
+
264
257
  class Index
265
258
  import org.eclipse.jgit.lib.CommitBuilder
266
-
259
+
267
260
  attr_accessor :treemap, :current_tree
268
261
  attr_reader :jrepo
269
-
262
+
270
263
  def initialize(repository)
271
264
  @treemap = {}
272
265
  @jrepo = RJGit.repository_type(repository)
273
266
  @treebuilder = TreeBuilder.new(@jrepo)
274
267
  end
275
-
268
+
276
269
  def add(path, data)
277
270
  path = path[1..-1] if path[0] == '/'
278
271
  path = path.split('/')
@@ -289,24 +282,24 @@ module RJGit
289
282
  current[filename] = data
290
283
  @treemap
291
284
  end
292
-
285
+
293
286
  def delete(path)
294
287
  path = path[1..-1] if path[0] == '/'
295
288
  path = path.split('/')
296
289
  last = path.pop
297
-
290
+
298
291
  current = self.treemap
299
-
292
+
300
293
  path.each do |dir|
301
294
  current[dir] ||= {}
302
295
  node = current[dir]
303
296
  current = node
304
297
  end
305
-
298
+
306
299
  current[last] = false
307
300
  @treemap
308
301
  end
309
-
302
+
310
303
  def do_commit(message, author, parents, new_tree)
311
304
  commit_builder = CommitBuilder.new
312
305
  person = author.person_ident
@@ -323,14 +316,11 @@ module RJGit
323
316
  @treebuilder.object_inserter.flush
324
317
  result
325
318
  end
326
-
327
- def commit(message, author, parents = nil, ref = nil, force = false)
328
- ref = ref ? ref : "refs/heads/#{Constants::MASTER}"
329
- @current_tree = @current_tree ? RJGit.tree_type(@current_tree) : @jrepo.resolve("refs/heads/#{Constants::MASTER}^{tree}")
330
- @treebuilder.treemap = @treemap
331
- new_tree = @treebuilder.build_tree(@current_tree)
319
+
320
+ def commit(message, author, parents = nil, ref = "refs/heads/#{Constants::MASTER}", force = false)
321
+ new_tree = build_new_tree(@treemap, "#{ref}^{tree}")
332
322
  return false if @current_tree && new_tree.name == @current_tree.name
333
-
323
+
334
324
  parents = parents ? parents : @jrepo.resolve(ref+"^{commit}")
335
325
  new_head = do_commit(message, author, parents, new_tree)
336
326
 
@@ -341,21 +331,129 @@ module RJGit
341
331
  ru.setRefLogIdent(author.person_ident)
342
332
  ru.setRefLogMessage("commit: #{message}", false)
343
333
  res = ru.update.to_string
344
-
345
- # @treebuilder.object_inserter.release
334
+
346
335
  @current_tree = new_tree
347
336
  log = @treebuilder.log
348
337
  @treebuilder.init_log
349
338
  sha = ObjectId.to_string(new_head)
350
339
  return res, log, sha
351
340
  end
352
-
341
+
353
342
  def self.successful?(result)
354
343
  ["NEW", "FAST_FORWARD", "FORCED"].include?(result)
355
344
  end
356
345
 
346
+ private
347
+
348
+ def build_new_tree(treemap, ref)
349
+ @treebuilder.treemap = treemap
350
+ new_tree = @treebuilder.build_tree(@current_tree ? RJGit.tree_type(@current_tree) : @jrepo.resolve(ref))
351
+ end
352
+
353
+ end
354
+
355
+ class ApplyPatchToIndex < RJGit::Plumbing::Index
356
+
357
+ import org.eclipse.jgit.patch.Patch
358
+ import org.eclipse.jgit.diff.DiffEntry
359
+
360
+ ADD = org.eclipse.jgit.diff.DiffEntry::ChangeType::ADD
361
+ COPY = org.eclipse.jgit.diff.DiffEntry::ChangeType::COPY
362
+ MODIFY = org.eclipse.jgit.diff.DiffEntry::ChangeType::MODIFY
363
+ DELETE = org.eclipse.jgit.diff.DiffEntry::ChangeType::DELETE
364
+ RENAME = org.eclipse.jgit.diff.DiffEntry::ChangeType::RENAME
365
+
366
+ # Take the result of RJGit::Porcelain.diff with options[:patch] = true and return a patch String
367
+ def self.diffs_to_patch(diffs)
368
+ diffs.inject(""){|result, diff| result << diff[:patch]}
369
+ end
370
+
371
+ def initialize(repository, patch, ref = Constants::HEAD)
372
+ super(repository)
373
+ @ref = ref
374
+ @patch = Patch.new
375
+ @patch.parse(ByteArrayInputStream.new(patch.to_java_bytes))
376
+ raise_patch_apply_error unless @patch.getErrors.isEmpty()
377
+ @current_tree = Commit.find_head(@jrepo, ref).tree
378
+ end
379
+
380
+ def commit(message, author, parents = nil, force = false)
381
+ super(message, author, parents, @ref, force)
382
+ end
383
+
384
+ def build_map
385
+ raise_patch_apply_error if @patch.getFiles.isEmpty()
386
+ @patch.getFiles.each do |file_header|
387
+ case file_header.getChangeType
388
+ when ADD
389
+ add(file_header.getNewPath, apply('', file_header))
390
+ when MODIFY
391
+ add(file_header.getOldPath, apply(getData(file_header.getOldPath), file_header))
392
+ when DELETE
393
+ delete(file_header.getOldPath)
394
+ when RENAME
395
+ delete(file_header.getOldPath)
396
+ add(file_header.getNewPath, getData(file_header.getOldPath))
397
+ when COPY
398
+ add(file_header.getNewPath, getData(file_header.getOldPath))
399
+ end
400
+ end
401
+ @treemap
402
+ end
403
+
404
+ # Build the new tree based on the patch, but don't commit it
405
+ # Return the String object id of the new tree, and an Array of affected paths
406
+ def new_tree
407
+ map = build_map
408
+ return ObjectId.to_string(build_new_tree(map, @ref)), map.keys
409
+ end
410
+
411
+ private
412
+
413
+ def raise_patch_apply_error
414
+ raise ::RJGit::PatchApplyException.new('Patch failed to apply')
415
+ end
416
+
417
+ def getData(path)
418
+ begin
419
+ (@current_tree / path).data
420
+ rescue NoMethodError
421
+ raise_patch_apply_error
422
+ end
423
+ end
424
+
425
+ def hunk_sanity_check(hunk, hunk_line, pos, newLines)
426
+ raise_patch_apply_error unless newLines[hunk.getNewStartLine - 1 + pos] == hunk_line[1..-1]
427
+ end
428
+
429
+ def apply(original, file_header)
430
+ newLines = original.lines
431
+ file_header.getHunks.each do |hunk|
432
+ length = hunk.getEndOffset - hunk.getStartOffset
433
+ buffer_text = hunk.getBuffer.to_s.slice(hunk.getStartOffset, length)
434
+ pos = 0
435
+ buffer_text.each_line do |hunk_line|
436
+ case hunk_line[0]
437
+ when ' '
438
+ hunk_sanity_check(hunk, hunk_line, pos, newLines)
439
+ pos += 1
440
+ when '-'
441
+ if hunk.getNewStartLine == 0
442
+ newLines = []
443
+ else
444
+ hunk_sanity_check(hunk, hunk_line, pos, newLines)
445
+ newLines.slice!(hunk.getNewStartLine - 1 + pos)
446
+ end
447
+ when '+'
448
+ newLines.insert(hunk.getNewStartLine - 1 + pos, hunk_line[1..-1])
449
+ pos += 1
450
+ end
451
+ end
452
+ end
453
+ newLines.join
454
+ end
357
455
  end
358
-
456
+
359
457
  end
360
-
458
+
361
459
  end
@@ -1,3 +1,3 @@
1
1
  module RJGit
2
- VERSION = "5.6.0.0"
2
+ VERSION = "5.6.1.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rjgit
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.6.0.0
4
+ version: 5.6.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maarten Engelen
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2019-12-30 00:00:00.000000000 Z
15
+ date: 2020-03-14 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  requirement: !ruby/object:Gem::Requirement
@@ -49,7 +49,7 @@ files:
49
49
  - lib/java/jars/bcpkix-jdk15on-161.jar
50
50
  - lib/java/jars/bcprov-jdk15on-161.jar
51
51
  - lib/java/jars/jsch-0.1.54.jar
52
- - lib/java/jars/org.eclipse.jgit-5.6.0.201912101111-r.jar
52
+ - lib/java/jars/org.eclipse.jgit-5.6.1.202002131546-r.jar
53
53
  - lib/java/jars/slf4j-api-1.7.2.jar
54
54
  - lib/java/jars/slf4j-simple-1.7.12.jar
55
55
  - lib/repo.rb