diff options
author | Mura Li <typeless@users.noreply.github.com> | 2019-04-12 10:28:44 +0800 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2019-04-12 10:28:44 +0800 |
commit | 3186ef554cdbf54e1a3328ffcb35ea18105d7cb1 (patch) | |
tree | a5291a4503ea8e7c009446098ea88cf885abb0fb /modules/git/commit.go | |
parent | 1b7dffc3a30b2244aa2690abce19dd4c31613016 (diff) | |
download | gitea-3186ef554cdbf54e1a3328ffcb35ea18105d7cb1.tar.gz gitea-3186ef554cdbf54e1a3328ffcb35ea18105d7cb1.zip |
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
Diffstat (limited to 'modules/git/commit.go')
-rw-r--r-- | modules/git/commit.go | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/modules/git/commit.go b/modules/git/commit.go index 36b8d54565..85c9554bb5 100644 --- a/modules/git/commit.go +++ b/modules/git/commit.go @@ -214,9 +214,48 @@ func (c *Commit) CommitsBeforeUntil(commitID string) (*list.List, error) { return c.repo.CommitsBetween(c, endCommit) } +// SearchCommitsOptions specify the parameters for SearchCommits +type SearchCommitsOptions struct { + Keywords []string + Authors, Committers []string + After, Before string + All bool +} + +// NewSearchCommitsOptions contruct a SearchCommitsOption from a space-delimited search string +func NewSearchCommitsOptions(searchString string, forAllRefs bool) SearchCommitsOptions { + var keywords, authors, committers []string + var after, before string + + fields := strings.Fields(searchString) + for _, k := range fields { + switch { + case strings.HasPrefix(k, "author:"): + authors = append(authors, strings.TrimPrefix(k, "author:")) + case strings.HasPrefix(k, "committer:"): + committers = append(committers, strings.TrimPrefix(k, "committer:")) + case strings.HasPrefix(k, "after:"): + after = strings.TrimPrefix(k, "after:") + case strings.HasPrefix(k, "before:"): + before = strings.TrimPrefix(k, "before:") + default: + keywords = append(keywords, k) + } + } + + return SearchCommitsOptions{ + Keywords: keywords, + Authors: authors, + Committers: committers, + After: after, + Before: before, + All: forAllRefs, + } +} + // SearchCommits returns the commits match the keyword before current revision -func (c *Commit) SearchCommits(keyword string, all bool) (*list.List, error) { - return c.repo.searchCommits(c.ID, keyword, all) +func (c *Commit) SearchCommits(opts SearchCommitsOptions) (*list.List, error) { + return c.repo.searchCommits(c.ID, opts) } // GetFilesChangedSinceCommit get all changed file names between pastCommit to current revision |