diff --git a/modules/git/grep.go b/modules/git/grep.go index ba870e054..6449b465b 100644 --- a/modules/git/grep.go +++ b/modules/git/grep.go @@ -63,8 +63,9 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO 2^@10^@repo: go-gitea/gitea */ var results []*GrepResult + // -I skips binary files cmd := NewCommand(ctx, "grep", - "--null", "--break", "--heading", "--column", + "-I", "--null", "--break", "--heading", "--column", "--fixed-strings", "--line-number", "--ignore-case", "--full-name") cmd.AddOptionValues("--context", fmt.Sprint(opts.ContextLineNumber)) if opts.MatchesPerFile > 0 { diff --git a/modules/git/grep_test.go b/modules/git/grep_test.go index bb7db7d58..5d0d343ac 100644 --- a/modules/git/grep_test.go +++ b/modules/git/grep_test.go @@ -98,6 +98,31 @@ func TestGrepSearch(t *testing.T) { assert.Empty(t, res) } +func TestGrepNoBinary(t *testing.T) { + tmpDir := t.TempDir() + + err := InitRepository(DefaultContext, tmpDir, false, Sha1ObjectFormat.Name()) + require.NoError(t, err) + + gitRepo, err := openRepositoryWithDefaultContext(tmpDir) + require.NoError(t, err) + defer gitRepo.Close() + + require.NoError(t, os.WriteFile(path.Join(tmpDir, "BINARY"), []byte("I AM BINARY\n\x00\nYOU WON'T SEE ME"), 0o666)) + require.NoError(t, os.WriteFile(path.Join(tmpDir, "TEXT"), []byte("I AM NOT BINARY\nYOU WILL SEE ME"), 0o666)) + + err = AddChanges(tmpDir, true) + require.NoError(t, err) + + err = CommitChanges(tmpDir, CommitChangesOptions{Message: "Binary and text files"}) + require.NoError(t, err) + + res, err := GrepSearch(context.Background(), gitRepo, "BINARY", GrepOptions{}) + require.NoError(t, err) + assert.Len(t, res, 1) + assert.Equal(t, "TEXT", res[0].Filename) +} + func TestGrepLongFiles(t *testing.T) { tmpDir := t.TempDir()