From b79cf761cf351c41373b0fd32566f7773822d008 Mon Sep 17 00:00:00 2001 From: James Fairbairn Date: Wed, 16 Mar 2022 10:47:45 +1300 Subject: [PATCH] Fix bug when grepping lines that contain numbers surrounded by colons Signed-off-by: James Fairbairn --- lib/git/lib.rb | 2 +- tests/files/working/colon_numbers.txt | 1 + tests/files/working/dot_git/index | Bin 352 -> 526 bytes tests/files/working/dot_git/logs/HEAD | 1 + .../working/dot_git/logs/refs/heads/git_grep | 1 + .../46/abbf07e3c564c723c7c039a43ab3a39e5d02dd | 1 + .../55/cbfe9fdf29da8b9dac05cb3c515055fe52ac2d | Bin 0 -> 158 bytes .../e7/6778b73006b0dda0dd56e9257c5bf6b6dd3373 | Bin 0 -> 69 bytes .../files/working/dot_git/refs/heads/git_grep | 2 +- .../dot_git/refs/tags/grep_colon_numbers | 1 + tests/units/test_describe.rb | 4 +-- tests/units/test_lib.rb | 9 +++++-- tests/units/test_log.rb | 24 +++++++++--------- tests/units/test_status.rb | 4 ++- 14 files changed, 31 insertions(+), 19 deletions(-) create mode 100644 tests/files/working/colon_numbers.txt create mode 100644 tests/files/working/dot_git/objects/46/abbf07e3c564c723c7c039a43ab3a39e5d02dd create mode 100644 tests/files/working/dot_git/objects/55/cbfe9fdf29da8b9dac05cb3c515055fe52ac2d create mode 100644 tests/files/working/dot_git/objects/e7/6778b73006b0dda0dd56e9257c5bf6b6dd3373 create mode 100644 tests/files/working/dot_git/refs/tags/grep_colon_numbers diff --git a/lib/git/lib.rb b/lib/git/lib.rb index 2d6c129d..8f450c86 100644 --- a/lib/git/lib.rb +++ b/lib/git/lib.rb @@ -419,7 +419,7 @@ def grep(string, opts = {}) hsh = {} command_lines('grep', grep_opts).each do |line| - if m = /(.*)\:(\d+)\:(.*)/.match(line) + if m = /(.*?)\:(\d+)\:(.*)/.match(line) hsh[m[1]] ||= [] hsh[m[1]] << [m[2].to_i, m[3]] end diff --git a/tests/files/working/colon_numbers.txt b/tests/files/working/colon_numbers.txt new file mode 100644 index 00000000..e76778b7 --- /dev/null +++ b/tests/files/working/colon_numbers.txt @@ -0,0 +1 @@ +Grep regex doesn't like this:4342: because it is bad diff --git a/tests/files/working/dot_git/index b/tests/files/working/dot_git/index index ef22be73369fe2742f17b338c3e9017511ad4112..9896710a283289dc577f4196d6ec40026e0a2a25 100644 GIT binary patch delta 371 zcmaFB)W=fq;u+-3z`(!+#H>kr2Udyem|q6cMg0HT(-?tbjA1)YFfcSOVPIhV3REKk z#HP>FE4CZ3ZMeJOZrDrJn&@xa?iv>}2qx#}1E!P68`iP zMuW}s741VZZ=$}gN|IjbZOKckO<^=xS%9`8k}{Er4LT5Yx57Vz)d6X!I%O1f7oh4M zaI1sW0cof@6=Zdj6&Q7jLV{dff&K|&FjX+(3O)UA{(a3`-E-Hlp0)`L2>lndMz=UQ zzodl0NWp;1RpHR=j<~ryH{7?WUR_ZjS|`hJIJF`^C9{aZ5Gb8p$$KYmwZX@p)puEi hU;Mar;L_!{0kQHgT>V>P^Hv1 1378910110 -0400 commit (merge): Merge commit '4ce44a75510cbfe200b131fdbcc56a86f1b2dc08' into cherry faf8d899a0f123c3c5def10857920be1c930e8ed 5e392652a881999392c2757cf9b783c5d47b67f7 Scott Chacon 1378910135 -0400 checkout: moving from cherry to master 5e392652a881999392c2757cf9b783c5d47b67f7 5e53019b3238362144c2766f02a2c00d91fcc023 Scott Chacon 1378910138 -0400 checkout: moving from master to git_grep +5e53019b3238362144c2766f02a2c00d91fcc023 46abbf07e3c564c723c7c039a43ab3a39e5d02dd Scott Chacon 1647231179 +1300 commit: add example for grep with colon and numbers diff --git a/tests/files/working/dot_git/logs/refs/heads/git_grep b/tests/files/working/dot_git/logs/refs/heads/git_grep index 0123a146..22a6f143 100644 --- a/tests/files/working/dot_git/logs/refs/heads/git_grep +++ b/tests/files/working/dot_git/logs/refs/heads/git_grep @@ -3,3 +3,4 @@ a3db7143944dcfa006fefe7fb49c48793cb29ade 34a566d193dc4702f03149969a2aad1443231560 scott Chacon 1194632975 -0800 commit: modified to not show up 34a566d193dc4702f03149969a2aad1443231560 935badc874edd62a8629aaf103418092c73f0a56 scott Chacon 1194633382 -0800 commit: more search help 935badc874edd62a8629aaf103418092c73f0a56 5e53019b3238362144c2766f02a2c00d91fcc023 scott Chacon 1194720731 -0800 commit: diff test +5e53019b3238362144c2766f02a2c00d91fcc023 46abbf07e3c564c723c7c039a43ab3a39e5d02dd Scott Chacon 1647231179 +1300 commit: add example for grep with colon and numbers diff --git a/tests/files/working/dot_git/objects/46/abbf07e3c564c723c7c039a43ab3a39e5d02dd b/tests/files/working/dot_git/objects/46/abbf07e3c564c723c7c039a43ab3a39e5d02dd new file mode 100644 index 00000000..9675e231 --- /dev/null +++ b/tests/files/working/dot_git/objects/46/abbf07e3c564c723c7c039a43ab3a39e5d02dd @@ -0,0 +1 @@ +xQj0DSH+A('XVG0<I-ezS"YƜ2ėe#K9сuq/>&9lQMe𳯵ᶲ+_!| ӌ޹9»֚Aal 7=Àdz,/RL \ No newline at end of file diff --git a/tests/files/working/dot_git/objects/55/cbfe9fdf29da8b9dac05cb3c515055fe52ac2d b/tests/files/working/dot_git/objects/55/cbfe9fdf29da8b9dac05cb3c515055fe52ac2d new file mode 100644 index 0000000000000000000000000000000000000000..8ea983cf5d1e6d05d6a6776e1e921df6377f0eab GIT binary patch literal 158 zcmV;P0Ac@l0V^p=O;s>7v1BkbFfcPQQAp0u$vo{1$3jYDHph zK~5^zoZjQJo+oDQm(%r)oqjd#)246d9ymkHDNfEWDPeF`I5fK>Ztl(v_id_IR}_fW M$ub-U02SXuthmBTz5oCK literal 0 HcmV?d00001 diff --git a/tests/files/working/dot_git/objects/e7/6778b73006b0dda0dd56e9257c5bf6b6dd3373 b/tests/files/working/dot_git/objects/e7/6778b73006b0dda0dd56e9257c5bf6b6dd3373 new file mode 100644 index 0000000000000000000000000000000000000000..28df1dc013314799f6595566aad255a4c4327684 GIT binary patch literal 69 zcmV-L0J{Hp0ZYosPf{>7W^gY`El?;*O;4>*NXbtv&QmW@$jQu3RVc~GEVeQ+HZihN bNJ>pkEG true}), 'v2.8') + assert_equal(@git.describe(nil, {:tags => true}), 'grep_colon_numbers') end end diff --git a/tests/units/test_lib.rb b/tests/units/test_lib.rb index 8c8c420d..d589eac6 100644 --- a/tests/units/test_lib.rb +++ b/tests/units/test_lib.rb @@ -19,7 +19,7 @@ def test_fetch_unshallow git = Git.clone("file://#{@wdir}", "shallow", path: dir, depth: 1).lib assert_equal(1, git.log_commits.length) git.fetch("file://#{@wdir}", unshallow: true) - assert_equal(71, git.log_commits.length) + assert_equal(72, git.log_commits.length) end end @@ -282,10 +282,15 @@ def test_grep match = @lib.grep('search', :object => 'gitsearch1', :invert_match => true) assert_equal(6, match['gitsearch1:scott/text.txt'].size) assert_equal(2, match.size) + + match = @lib.grep('Grep', :object => 'grep_colon_numbers') + assert_equal("Grep regex doesn't like this:4342: because it is bad", match['grep_colon_numbers:colon_numbers.txt'].first[1]) + assert_equal(1, match.size) end def test_show - assert(/^commit 5e53019b3238362144c2766f02a2c00d91fcc023.+\+replace with new text - diff test$/m.match(@lib.show)) + puts @lib.show + assert_match(/^commit 46abbf07e3c564c723c7c039a43ab3a39e5d02dd.+\+Grep regex doesn't like this:4342: because it is bad\n$/m, @lib.show) assert(/^commit 935badc874edd62a8629aaf103418092c73f0a56.+\+nothing!$/m.match(@lib.show('gitsearch1'))) assert(/^hello.+nothing!$/m.match(@lib.show('gitsearch1', 'scott/text.txt'))) assert(@lib.show('gitsearch1', 'scott/text.txt') == "hello\nthis is\na file\nthat is\nput here\nto search one\nto search two\nnothing!\n") diff --git a/tests/units/test_log.rb b/tests/units/test_log.rb index 81c6e300..4a947842 100644 --- a/tests/units/test_log.rb +++ b/tests/units/test_log.rb @@ -12,13 +12,13 @@ def setup def test_get_fisrt_and_last_entries log = @git.log assert(log.first.is_a?(Git::Object::Commit)) - assert_equal('5e53019b3238362144c2766f02a2c00d91fcc023', log.first.objectish) + assert_equal('46abbf07e3c564c723c7c039a43ab3a39e5d02dd', log.first.objectish) assert(log.last.is_a?(Git::Object::Commit)) - assert_equal('f1410f8735f6f73d3599eb9b5cdd2fb70373335c', log.last.objectish) + assert_equal('b03003311ad3fa368b475df58390353868e13c91', log.last.objectish) end - - def test_get_log_entries + + def test_get_log_entries assert_equal(30, @git.log.size) assert_equal(50, @git.log(50).size) assert_equal(10, @git.log(10).size) @@ -35,15 +35,15 @@ def test_log_skip assert_equal(three2.sha, three3.sha) assert_equal(three1.sha, three2.sha) end - + def test_get_log_since l = @git.log.since("2 seconds ago") assert_equal(0, l.size) - + l = @git.log.since("#{Date.today.year - 2006} years ago") assert_equal(30, l.size) end - + def test_get_log_grep l = @git.log.grep("search") assert_equal(2, l.size) @@ -55,11 +55,11 @@ def test_get_log_author l = @git.log(5).author("lazySusan") assert_equal(0, l.size) end - - def test_get_log_since_file + + def test_get_log_since_file l = @git.log.path('example.txt') assert_equal(30, l.size) - + l = @git.log.between('v2.5', 'test').path('example.txt') assert_equal(1, l.size) end @@ -72,7 +72,7 @@ def test_get_log_path log = @git.log.path(['example.txt','scott/text.txt']) assert_equal(30, log.size) end - + def test_log_file_noexist assert_raise Git::GitExecuteError do @git.log.object('no-exist.txt').size @@ -96,5 +96,5 @@ def test_log_cherry l = @git.log.between( 'master', 'cherry').cherry assert_equal( 1, l.size ) end - + end diff --git a/tests/units/test_status.rb b/tests/units/test_status.rb index 2a2e7836..964a59ae 100644 --- a/tests/units/test_status.rb +++ b/tests/units/test_status.rb @@ -12,7 +12,9 @@ def setup def test_status_pretty in_temp_dir do |path| git = Git.clone(@wdir, 'test_dot_files_status') - string = "ex_dir/ex.txt\n\tsha(r) \n\tsha(i) e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 " \ + string = "colon_numbers.txt\n\tsha(r) \n\tsha(i) " \ + "e76778b73006b0dda0dd56e9257c5bf6b6dd3373 100644\n\ttype \n\tstage 0\n\tuntrac \n" \ + "ex_dir/ex.txt\n\tsha(r) \n\tsha(i) e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 " \ "100644\n\ttype \n\tstage 0\n\tuntrac \nexample.txt\n\tsha(r) \n\tsha(i) " \ "8dc79ae7616abf1e2d4d5d97d566f2b2f6cee043 100644\n\ttype \n\tstage 0\n\tuntrac " \ "\nscott/newfile\n\tsha(r) \n\tsha(i) 5d4606820736043f9eed2a6336661d6892c820a5 " \