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
parent
6097ff68e7
commit
ee11974719
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue