mirror of
https://github.com/go-gitea/gitea.git
synced 2026-10-09 22:18:39 +02:00
fix(git): keep leading dashes in git grep search patterns (#39404)
Co-authored-by: silverwind <me@silverwind.io> Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
4 files changed
+35
-5
No files matched your search
@@ -172,6 +172,16 @@ func (c *Command) AddOptionFormat(opt string, args ...any) *Command {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Command) AddOptionGrepExpr(s string) *Command {
|
||||||
|
if len(c.args) == 0 || c.args[0] != "grep" {
|
||||||
|
c.handlePreErrorBrokenCommand("(not grep command)")
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
// man git-grep: -e: This option has to be used for patterns starting with "-"
|
||||||
|
c.args = append(c.args, "-e", s)
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
// AddDynamicArguments adds new dynamic argument values to the command.
|
// AddDynamicArguments adds new dynamic argument values to the command.
|
||||||
// The arguments may come from user input and can not be trusted, so no leading '-' is allowed to avoid passing options.
|
// The arguments may come from user input and can not be trusted, so no leading '-' is allowed to avoid passing options.
|
||||||
// TODO: in the future, this function can be renamed to AddArgumentValues
|
// TODO: in the future, this function can be renamed to AddArgumentValues
|
||||||
|
|||||||
@@ -77,10 +77,27 @@ func TestRunWithContextStd(t *testing.T) {
|
|||||||
cmd := NewCommand()
|
cmd := NewCommand()
|
||||||
cmd.AddDynamicArguments("-test")
|
cmd.AddDynamicArguments("-test")
|
||||||
assert.ErrorIs(t, cmd.Run(t.Context()), ErrBrokenCommand)
|
assert.ErrorIs(t, cmd.Run(t.Context()), ErrBrokenCommand)
|
||||||
|
assert.Empty(t, cmd.args)
|
||||||
|
|
||||||
cmd = NewCommand()
|
cmd = NewCommand()
|
||||||
cmd.AddDynamicArguments("--test")
|
cmd.AddDynamicArguments("--test")
|
||||||
assert.ErrorIs(t, cmd.Run(t.Context()), ErrBrokenCommand)
|
assert.ErrorIs(t, cmd.Run(t.Context()), ErrBrokenCommand)
|
||||||
|
assert.Empty(t, cmd.args)
|
||||||
|
|
||||||
|
cmd = NewCommand()
|
||||||
|
cmd.AddOptionGrepExpr("-x")
|
||||||
|
assert.ErrorIs(t, cmd.Run(t.Context()), ErrBrokenCommand)
|
||||||
|
assert.Empty(t, cmd.args)
|
||||||
|
|
||||||
|
cmd = NewCommand("any")
|
||||||
|
cmd.AddOptionGrepExpr("-x")
|
||||||
|
assert.ErrorIs(t, cmd.Run(t.Context()), ErrBrokenCommand)
|
||||||
|
assert.Equal(t, []string{"any"}, cmd.args)
|
||||||
|
|
||||||
|
cmd = NewCommand("grep")
|
||||||
|
cmd.AddOptionGrepExpr("-x")
|
||||||
|
assert.NoError(t, cmd.Run(t.Context()))
|
||||||
|
assert.Equal(t, []string{"grep", "-e", "-x"}, cmd.args)
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
+3
-5
@@ -59,16 +59,14 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
|
|||||||
cmd.AddOptionValues("--context", strconv.Itoa(opts.ContextLineNumber))
|
cmd.AddOptionValues("--context", strconv.Itoa(opts.ContextLineNumber))
|
||||||
switch opts.GrepMode {
|
switch opts.GrepMode {
|
||||||
case GrepModeExact:
|
case GrepModeExact:
|
||||||
cmd.AddArguments("--fixed-strings")
|
cmd.AddArguments("--fixed-strings").AddOptionGrepExpr(search)
|
||||||
cmd.AddOptionValues("-e", strings.TrimLeft(search, "-"))
|
|
||||||
case GrepModeRegexp:
|
case GrepModeRegexp:
|
||||||
cmd.AddArguments("--perl-regexp")
|
cmd.AddArguments("--perl-regexp").AddOptionGrepExpr(search)
|
||||||
cmd.AddOptionValues("-e", strings.TrimLeft(search, "-"))
|
|
||||||
default: /* words */
|
default: /* words */
|
||||||
words := strings.Fields(search)
|
words := strings.Fields(search)
|
||||||
cmd.AddArguments("--fixed-strings", "--ignore-case")
|
cmd.AddArguments("--fixed-strings", "--ignore-case")
|
||||||
for i, word := range words {
|
for i, word := range words {
|
||||||
cmd.AddOptionValues("-e", strings.TrimLeft(word, "-"))
|
cmd.AddOptionGrepExpr(word)
|
||||||
if i < len(words)-1 {
|
if i < len(words)-1 {
|
||||||
cmd.AddOptionValues("--and")
|
cmd.AddOptionValues("--and")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,11 @@ func TestGrepSearch(t *testing.T) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Empty(t, res)
|
assert.Empty(t, res)
|
||||||
|
|
||||||
|
// search a string starting with a dash
|
||||||
|
res, err = GrepSearch(t.Context(), repo, "-v", GrepOptions{})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, []*GrepResult{{Filename: ".gitattributes", LineNumbers: []int{1}, LineCodes: []string{"*.vendor.java linguist-vendored"}}}, res)
|
||||||
|
|
||||||
nonExistingRepo := &Repository{RepositoryBase: RepositoryBase{repoFacade: gitrepo.RepositoryUnmanaged("no-such-git-repo")}}
|
nonExistingRepo := &Repository{RepositoryBase: RepositoryBase{repoFacade: gitrepo.RepositoryUnmanaged("no-such-git-repo")}}
|
||||||
res, err = GrepSearch(t.Context(), nonExistingRepo, "no-such-content", GrepOptions{})
|
res, err = GrepSearch(t.Context(), nonExistingRepo, "no-such-content", GrepOptions{})
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
|
|||||||
Reference in new issue
Block a user