Add name-only flag to gh pr diff sub command
This commit is contained in:
parent
d21d388b8d
commit
7036d055b5
2 changed files with 82 additions and 0 deletions
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/MakeNowJust/heredoc"
|
"github.com/MakeNowJust/heredoc"
|
||||||
|
|
@ -27,6 +28,7 @@ type DiffOptions struct {
|
||||||
SelectorArg string
|
SelectorArg string
|
||||||
UseColor bool
|
UseColor bool
|
||||||
Patch bool
|
Patch bool
|
||||||
|
NameOnly bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCmdDiff(f *cmdutil.Factory, runF func(*DiffOptions) error) *cobra.Command {
|
func NewCmdDiff(f *cmdutil.Factory, runF func(*DiffOptions) error) *cobra.Command {
|
||||||
|
|
@ -78,6 +80,7 @@ func NewCmdDiff(f *cmdutil.Factory, runF func(*DiffOptions) error) *cobra.Comman
|
||||||
|
|
||||||
cmdutil.StringEnumFlag(cmd, &colorFlag, "color", "", "auto", []string{"always", "never", "auto"}, "Use color in diff output")
|
cmdutil.StringEnumFlag(cmd, &colorFlag, "color", "", "auto", []string{"always", "never", "auto"}, "Use color in diff output")
|
||||||
cmd.Flags().BoolVar(&opts.Patch, "patch", false, "Display diff in patch format")
|
cmd.Flags().BoolVar(&opts.Patch, "patch", false, "Display diff in patch format")
|
||||||
|
cmd.Flags().BoolVar(&opts.NameOnly, "name-only", false, "Display only names of changed files")
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
@ -97,6 +100,10 @@ func diffRun(opts *DiffOptions) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts.NameOnly {
|
||||||
|
opts.Patch = false
|
||||||
|
}
|
||||||
|
|
||||||
diff, err := fetchDiff(httpClient, baseRepo, pr.Number, opts.Patch)
|
diff, err := fetchDiff(httpClient, baseRepo, pr.Number, opts.Patch)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not find pull request diff: %w", err)
|
return fmt.Errorf("could not find pull request diff: %w", err)
|
||||||
|
|
@ -109,6 +116,10 @@ func diffRun(opts *DiffOptions) error {
|
||||||
fmt.Fprintf(opts.IO.ErrOut, "failed to start pager: %v\n", err)
|
fmt.Fprintf(opts.IO.ErrOut, "failed to start pager: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts.NameOnly {
|
||||||
|
return changedFilesNames(opts.IO.Out, diff)
|
||||||
|
}
|
||||||
|
|
||||||
if !opts.UseColor {
|
if !opts.UseColor {
|
||||||
_, err = io.Copy(opts.IO.Out, diff)
|
_, err = io.Copy(opts.IO.Out, diff)
|
||||||
return err
|
return err
|
||||||
|
|
@ -227,3 +238,22 @@ func isAdditionLine(l []byte) bool {
|
||||||
func isRemovalLine(l []byte) bool {
|
func isRemovalLine(l []byte) bool {
|
||||||
return len(l) > 0 && l[0] == '-'
|
return len(l) > 0 && l[0] == '-'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func changedFilesNames(w io.Writer, r io.Reader) error {
|
||||||
|
diff, err := io.ReadAll(r)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pattern := regexp.MustCompile(`(?:^|\n)diff\s--git.*\sb/(.*)`)
|
||||||
|
matches := pattern.FindAllStringSubmatch(string(diff), -1)
|
||||||
|
|
||||||
|
for _, val := range matches {
|
||||||
|
name := strings.TrimSpace(val[1])
|
||||||
|
if _, err := w.Write([]byte(name + "\n")); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,18 @@ func Test_diffRun(t *testing.T) {
|
||||||
wantAccept: "application/vnd.github.v3.patch",
|
wantAccept: "application/vnd.github.v3.patch",
|
||||||
wantStdout: fmt.Sprintf(testDiff, "", "", "", ""),
|
wantStdout: fmt.Sprintf(testDiff, "", "", "", ""),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "name only",
|
||||||
|
opts: DiffOptions{
|
||||||
|
SelectorArg: "123",
|
||||||
|
UseColor: false,
|
||||||
|
Patch: false,
|
||||||
|
NameOnly: true,
|
||||||
|
},
|
||||||
|
rawDiff: fmt.Sprintf(testDiff, "", "", "", ""),
|
||||||
|
wantAccept: "application/vnd.github.v3.diff",
|
||||||
|
wantStdout: fmt.Sprintf(".github/workflows/releases.yml\nMakefile\n"),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
|
@ -290,3 +302,43 @@ func Test_colorDiffLines(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_changedFileNames(t *testing.T) {
|
||||||
|
inputs := []struct {
|
||||||
|
input, output string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
input: "",
|
||||||
|
output: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "\n",
|
||||||
|
output: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "diff --git a/cmd.go b/cmd.go\n--- /dev/null\n+++ b/cmd.go\n@@ -0,0 +1,313 @@",
|
||||||
|
output: "cmd.go\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: "diff --git a/cmd.go b/cmd.go\n--- a/cmd.go\n+++ /dev/null\n@@ -0,0 +1,313 @@",
|
||||||
|
output: "cmd.go\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: fmt.Sprintf("diff --git a/baz.go b/rename.go\n--- a/baz.go\n+++ b/rename.go\n+foo\n-b%sr", strings.Repeat("a", 2*lineBufferSize)),
|
||||||
|
output: "rename.go\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
input: fmt.Sprintf("diff --git a/baz.go b/baz.go\n--- a/baz.go\n+++ b/baz.go\n+foo\n-b%sr", strings.Repeat("a", 2*lineBufferSize)),
|
||||||
|
output: "baz.go\n",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range inputs {
|
||||||
|
buf := bytes.Buffer{}
|
||||||
|
if err := changedFilesNames(&buf, strings.NewReader(tt.input)); err != nil {
|
||||||
|
t.Fatalf("unexpected error: %s", err)
|
||||||
|
}
|
||||||
|
if got := buf.String(); got != tt.output {
|
||||||
|
t.Errorf("expected: %q, got: %q", tt.output, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue