Search Commits via Commit Hash (#7400)

* search commits via commit hash

Signed-off-by: Gary Kim <gary@garykim.dev>

* Also include all option for hash search

Signed-off-by: Gary Kim <gary@garykim.dev>

* Remove code duplication in commit search

Signed-off-by: Gary Kim <gary@garykim.dev>

* Add case ignore to commit hash search

Signed-off-by: Gary Kim <gary@garykim.dev>
release/v1.15
Gary Kim 2019-09-02 23:38:04 +00:00 committed by techknowlogick
parent 6097ff68e7
commit ee11974719
2 changed files with 48 additions and 21 deletions

View File

@ -28,10 +28,16 @@ func testRepoCommitsSearch(t *testing.T, query, commit string) {
} }
func TestRepoCommitsSearch(t *testing.T) { func TestRepoCommitsSearch(t *testing.T) {
testRepoCommitsSearch(t, "e8eabd", "")
testRepoCommitsSearch(t, "38a9cb", "")
testRepoCommitsSearch(t, "6e8e", "6e8eabd9a7")
testRepoCommitsSearch(t, "58e97", "58e97d1a24")
testRepoCommitsSearch(t, "author:alice", "6e8eabd9a7") testRepoCommitsSearch(t, "author:alice", "6e8eabd9a7")
testRepoCommitsSearch(t, "author:alice 6e8ea", "6e8eabd9a7")
testRepoCommitsSearch(t, "committer:Tom", "58e97d1a24") testRepoCommitsSearch(t, "committer:Tom", "58e97d1a24")
testRepoCommitsSearch(t, "author:bob commit-4", "58e97d1a24") testRepoCommitsSearch(t, "author:bob commit-4", "58e97d1a24")
testRepoCommitsSearch(t, "author:bob commit after:2019-03-03", "58e97d1a24") testRepoCommitsSearch(t, "author:bob commit after:2019-03-03", "58e97d1a24")
testRepoCommitsSearch(t, "committer:alice 6e8e before:2019-03-02", "6e8eabd9a7")
testRepoCommitsSearch(t, "committer:alice commit before:2019-03-02", "6e8eabd9a7") testRepoCommitsSearch(t, "committer:alice commit before:2019-03-02", "6e8eabd9a7")
testRepoCommitsSearch(t, "committer:alice author:tom commit before:2019-03-04 after:2019-03-02", "0a8499a22a") testRepoCommitsSearch(t, "committer:alice author:tom commit before:2019-03-04 after:2019-03-02", "0a8499a22a")
} }

View File

@ -208,36 +208,57 @@ func (repo *Repository) commitsByRange(id SHA1, page int) (*list.List, error) {
} }
func (repo *Repository) searchCommits(id SHA1, opts SearchCommitsOptions) (*list.List, error) { func (repo *Repository) searchCommits(id SHA1, opts SearchCommitsOptions) (*list.List, error) {
cmd := NewCommand("log", id.String(), "-100", "-i", prettyLogFormat) cmd := NewCommand("log", id.String(), "-100", prettyLogFormat)
args := []string{"-i"}
if len(opts.Authors) > 0 {
for _, v := range opts.Authors {
args = append(args, "--author="+v)
}
}
if len(opts.Committers) > 0 {
for _, v := range opts.Committers {
args = append(args, "--committer="+v)
}
}
if len(opts.After) > 0 {
args = append(args, "--after="+opts.After)
}
if len(opts.Before) > 0 {
args = append(args, "--before="+opts.Before)
}
if opts.All {
args = append(args, "--all")
}
if len(opts.Keywords) > 0 { if len(opts.Keywords) > 0 {
for _, v := range opts.Keywords { for _, v := range opts.Keywords {
cmd.AddArguments("--grep=" + v) cmd.AddArguments("--grep=" + v)
} }
} }
if len(opts.Authors) > 0 { cmd.AddArguments(args...)
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) stdout, err := cmd.RunInDirBytes(repo.Path)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return repo.parsePrettyFormatLogToList(stdout) if len(stdout) != 0 {
stdout = append(stdout, '\n')
}
if len(opts.Keywords) > 0 {
for _, v := range opts.Keywords {
if len(v) >= 4 {
hashCmd := NewCommand("log", "-1", prettyLogFormat)
hashCmd.AddArguments(args...)
hashCmd.AddArguments(v)
hashMatching, err := hashCmd.RunInDirBytes(repo.Path)
if err != nil || bytes.Contains(stdout, hashMatching) {
continue
}
stdout = append(stdout, hashMatching...)
stdout = append(stdout, '\n')
}
}
}
return repo.parsePrettyFormatLogToList(bytes.TrimSuffix(stdout, []byte{'\n'}))
} }
func (repo *Repository) getFilesChanged(id1, id2 string) ([]string, error) { func (repo *Repository) getFilesChanged(id1, id2 string) ([]string, error) {