1
0
Fork 0
forked from forgejo/forgejo

Support search operators for commits search (#6479)

* Support searching commits with prefix syntax

For now, support auther: committer:
When more than one prefix is supplied is presented, the result is the union.
When different prefixes are supplied, the result is the intersection.

For example,
"author:alice author:bob"
=> the result is all commits authored by Alice OR Bob

"hello committer:alice"
=> the result is all commits committed by Alice AND has the keyword
'hello' in the message.

Note that there should NOT have any space after the colon(:) of the prefix.
For example,
"author:bill" => correct
"author: bill" => wrong

* Remove unneeded logging

* Add missing files of test repository

* Add missing repo_unit entries to test fixtures

* Update test cases

* Add tooltip for commits search button

* Update tooltip text

I have no idea about how to format it with line breaks.

* Make the usage example more real

* Add a test case

* Add new options struct for SearchCommits

* Prefer len(s) > 0 over s != ""

* Add NewSearchCommitsOptions
This commit is contained in:
Mura Li 2019-04-12 10:28:44 +08:00 committed by Lunny Xiao
parent 1b7dffc3a3
commit 3186ef554c
41 changed files with 687 additions and 21 deletions

View file

@ -237,9 +237,30 @@ func (repo *Repository) commitsByRange(id SHA1, page int) (*list.List, error) {
return repo.parsePrettyFormatLogToList(stdout)
}
func (repo *Repository) searchCommits(id SHA1, keyword string, all bool) (*list.List, error) {
cmd := NewCommand("log", id.String(), "-100", "-i", "--grep="+keyword, prettyLogFormat)
if all {
func (repo *Repository) searchCommits(id SHA1, opts SearchCommitsOptions) (*list.List, error) {
cmd := NewCommand("log", id.String(), "-100", "-i", prettyLogFormat)
if len(opts.Keywords) > 0 {
for _, v := range opts.Keywords {
cmd.AddArguments("--grep=" + v)
}
}
if len(opts.Authors) > 0 {
for _, v := range opts.Authors {
cmd.AddArguments("--author=" + v)
}
}
if len(opts.Committers) > 0 {
for _, v := range opts.Committers {
cmd.AddArguments("--committer=" + v)
}
}
if len(opts.After) > 0 {
cmd.AddArguments("--after=" + opts.After)
}
if len(opts.Before) > 0 {
cmd.AddArguments("--before=" + opts.Before)
}
if opts.All {
cmd.AddArguments("--all")
}
stdout, err := cmd.RunInDirBytes(repo.Path)