From 0b8ab7565b87ea9dd413dddbd9a934493990d9f5 Mon Sep 17 00:00:00 2001 From: Hanfei Shen Date: Thu, 6 Mar 2014 23:42:15 +0800 Subject: [PATCH] fix grep while it matches in binary files Sometimes there is no "\n\n" between "Binary file ... matches" and the others. ``` master:test/dot_git/file-index 874^@test/dot_git/refs/heads/master 875^@test/dot_git/refs/remotes/origin/HEAD 876^@test/dot_git/refs/remotes/origin/master Binary file master:test/dot_git/index matches Binary file master:test/dot_git_iv2/index matches master:test/dot_git_iv2/info/refs 5^@2d3acf90f35989df8f262dc50beadc4ee3ae1560 refs/heads/testing 6^@ca8a30f5a7f0f163bbe3b6f0abf18a6c83b0687a refs/remotes/origin/HEAD 7^@ca8a30f5a7f0f163bbe3b6f0abf18a6c83b0687a refs/remotes/origin/master ``` --- lib/grit/repo.rb | 10 ++++++---- test/test_repo.rb | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/grit/repo.rb b/lib/grit/repo.rb index 3d948fab..071b8e31 100644 --- a/lib/grit/repo.rb +++ b/lib/grit/repo.rb @@ -718,11 +718,13 @@ def grep(searchtext, contextlines = 3, branch = 'master') context_arg = '-C ' + contextlines.to_s result = git.native(:grep, {pipeline: false}, '-n', '-E', '-i', '-z', '--heading', '--break', context_arg, searchtext, branch).encode('UTF-8', invalid: :replace, undef: :replace, replace: '') greps = [] + result.gsub!(/(^Binary file (.+) matches$)/, "\n\\1\n") + result.strip! filematches = result.split("\n\n") filematches.each do |filematch| binary = false file = '' - matches = filematch.split("--\n") + matches = filematch.strip.split("--\n") matches.each_with_index do |match, i| content = [] startline = 0 @@ -733,10 +735,10 @@ def grep(searchtext, contextlines = 3, branch = 'master') file = text[/^Binary file (.+) matches$/] if file binary = true - else - text.slice! /^#{branch}:/ - file = text + text = $1 end + text.slice! /^#{branch}:/ + file = text end lines.each_with_index do |line, j| line.chomp! diff --git a/test/test_repo.rb b/test/test_repo.rb index d15ea6d2..5810fc4a 100644 --- a/test/test_repo.rb +++ b/test/test_repo.rb @@ -424,4 +424,21 @@ def test_grep assert_equal 'test/test_repo.rb', res.first.filename assert_equal ' def test_select_existing_objects', res.first.content[1] end + + def test_grep_binary + res = @r.grep('origin/HEAD', 1, 'master') + assert_equal 5, res.length + + assert_equal 874, res.first.startline + assert_equal 'test/dot_git/file-index', res.first.filename + assert_equal 'test/dot_git/refs/remotes/origin/HEAD', res.first.content[1] + + assert_equal 0, res[1].startline + assert_equal 'test/dot_git/index', res[1].filename + assert_equal [], res[1].content + + assert_equal 5, res[3].startline + assert_equal 'test/dot_git_iv2/info/refs', res[3].filename + assert_equal "ca8a30f5a7f0f163bbe3b6f0abf18a6c83b0687a\trefs/remotes/origin/HEAD", res[3].content[1] + end end