rjgit 5.9.0.0 → 5.9.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/lib/blob.rb +1 -1
  3. data/lib/rjgit.rb +29 -6
  4. data/lib/version.rb +1 -1
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5b28d35d4c9ea97c5a4ea28b0a62b7374daea6a7a0fd906cfbefbcb986ac37aa
4
- data.tar.gz: dceb29a1d1e1d20f93a43c71b08ba02d7f23d1f2c8dd92c43a8bf810594dba19
3
+ metadata.gz: 7f03c8f0d9e77ec4568625a3ec9cbfb87a5b6ec4ae7a1c1f540a5cde0599d9be
4
+ data.tar.gz: 81f752231d8d1714639f0422b9fb08fe3179837ab171f4ddb919d32159fab52b
5
5
  SHA512:
6
- metadata.gz: e3ab922915d8f98e59757c853277f96273871c867d3f7eda3e2bec4f3d65fb6ec142fdab92fd9df60df3a7ffb6c010482d98ad2c9ac0b3b511a14cd469a5e2fc
7
- data.tar.gz: c1ac638be7e459f8ab20364ec89c75e6da40d9fa81cd184c7c28f3aaa898c8953b2c62f7f63b52294d38f488ee932944ac6dd707ae74474c0e5e1d83bfa639c3
6
+ metadata.gz: '05482710f19d6205ca490ef7a3c49244ae584c1116a8de447d4eb34d7624d4b92e34fdd7d932752c823a62459b41b94afcb0052702a9e1389615831dd19d8388'
7
+ data.tar.gz: 74bff6ee3bc9361e1638697203d6cf64048408f2dcb9d2bc108ff0d7a69918a8fdbe3c27e5ed8a81e869267a413f32dc218e8a1b80ee517e0631ff90fcd1c060
@@ -36,7 +36,7 @@ module RJGit
36
36
  # The binary contents of this blob.
37
37
  # Returns String
38
38
  def data
39
- @data ||= RJGit::Porcelain.cat_file(@jrepo, @jblob)
39
+ @data ||= RJGit::Porcelain.cat_file(@jrepo, self)
40
40
  end
41
41
 
42
42
  def is_symlink?
@@ -56,10 +56,11 @@ module RJGit
56
56
 
57
57
  # http://dev.eclipse.org/mhonarc/lists/jgit-dev/msg00558.html
58
58
  def self.cat_file(repository, blob)
59
+ mode = blob.mode if blob.respond_to?(:mode)
59
60
  jrepo = RJGit.repository_type(repository)
60
61
  jblob = RJGit.blob_type(blob)
61
62
  # Try to resolve symlinks; return nil otherwise
62
- mode = RJGit.get_file_mode(jrepo, jblob)
63
+ mode ||= RJGit.get_file_mode(jrepo, jblob)
63
64
  if mode == SYMLINK_TYPE
64
65
  symlink_source = jrepo.open(jblob.id).get_bytes.to_a.pack('c*').force_encoding('UTF-8')
65
66
  blob = Blob.find_blob(jrepo, symlink_source)
@@ -209,15 +210,37 @@ module RJGit
209
210
 
210
211
  query = Regexp.new(query.source, query.options | Regexp::IGNORECASE) if case_insensitive
211
212
 
212
- ls_tree(repo, nil, options.fetch(:ref, 'HEAD'), ls_tree_options).each_with_object({}) do |item, result|
213
- blob = Blob.new(repo, item[:mode], item[:path], walk.lookup_blob(ObjectId.from_string(item[:id])))
214
- next if blob.binary?
213
+ # We optimize below by first grepping the entire file, and then, if a match is found, then identifying the individual line.
214
+ # To avoid missing full-line matches during the optimization, we first convert multiline anchors to single-line anchors.
215
+ query = Regexp.new(query.source.gsub(/\A\\A/, '^').gsub(/\\z\z/, '$'), query.options)
215
216
 
216
- rows = blob.data.split("\n")
217
+ ref = options.fetch(:ref, 'HEAD')
218
+ files_to_scan = ls_tree(repo, nil, ref, ls_tree_options)
219
+
220
+ files_to_scan.each_with_object({}) do |file, result|
221
+ id = if file[:mode] == SYMLINK_TYPE
222
+ symlink_source = repo.open(ObjectId.from_string(file[:id])).get_bytes.to_a.pack('c*').force_encoding('UTF-8')
223
+ unless symlink_source[File::SEPARATOR]
224
+ dir = file[:path].split(File::SEPARATOR)
225
+ dir[-1] = symlink_source
226
+ symlink_source = File.join(dir)
227
+ end
228
+ Blob.find_blob(repo, symlink_source, ref).jblob.id
229
+ else
230
+ ObjectId.from_string(file[:id])
231
+ end
232
+ bytes = repo.open(id).get_bytes
233
+
234
+ next if RawText.is_binary(bytes)
235
+
236
+ file_contents = bytes.to_s
237
+ next unless query.match(file_contents)
238
+
239
+ rows = file_contents.split("\n")
217
240
  data = rows.grep(query)
218
241
  next if data.empty?
219
242
 
220
- result[blob.path] = data
243
+ result[file[:path]] = data
221
244
  end
222
245
  end
223
246
  end
@@ -1,3 +1,3 @@
1
1
  module RJGit
2
- VERSION = "5.9.0.0"
2
+ VERSION = "5.9.0.1"
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.9.0.0
4
+ version: 5.9.0.1
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: 2020-11-02 00:00:00.000000000 Z
15
+ date: 2020-11-19 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  requirement: !ruby/object:Gem::Requirement