Skip to content

Commit c8fc9ac

Browse files
ccoVeilleCodeWithEmad
authored andcommitted
chore: use GitHub official client for gh
1 parent ec1e320 commit c8fc9ac

File tree

3 files changed

+68
-20
lines changed

3 files changed

+68
-20
lines changed

go.mod

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ module github.com/CodeWithEmad/gh-delete-forks-interactively
22

33
go 1.24.0
44

5+
require github.com/cli/go-gh/v2 v2.12.1
6+
57
require (
8+
github.com/cli/safeexec v1.0.0 // indirect
69
github.com/inconshreveable/mousetrap v1.1.0 // indirect
710
github.com/spf13/pflag v1.0.6 // indirect
811
)
@@ -12,5 +15,5 @@ require (
1215
github.com/mattn/go-colorable v0.1.13 // indirect
1316
github.com/mattn/go-isatty v0.0.20 // indirect
1417
github.com/spf13/cobra v1.9.1
15-
golang.org/x/sys v0.28.0 // indirect
18+
golang.org/x/sys v0.31.0 // indirect
1619
)

go.sum

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,66 @@
1+
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
2+
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
3+
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
4+
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
5+
github.com/charmbracelet/lipgloss v1.1.1-0.20250319133953-166f707985bc h1:nFRtCfZu/zkltd2lsLUPlVNv3ej/Atod9hcdbRZtlys=
6+
github.com/charmbracelet/lipgloss v1.1.1-0.20250319133953-166f707985bc/go.mod h1:aKC/t2arECF6rNOnaKaVU6y4t4ZeHQzqfxedE/VkVhA=
7+
github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
8+
github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
9+
github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k=
10+
github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
11+
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
12+
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
13+
github.com/cli/go-gh/v2 v2.12.1 h1:SVt1/afj5FRAythyMV3WJKaUfDNsxXTIe7arZbwTWKA=
14+
github.com/cli/go-gh/v2 v2.12.1/go.mod h1:+5aXmEOJsH9fc9mBHfincDwnS02j2AIA/DsTH0Bk5uw=
15+
github.com/cli/safeexec v1.0.0 h1:0VngyaIyqACHdcMNWfo6+KdUYnqEr2Sg+bSP1pdF+dI=
16+
github.com/cli/safeexec v1.0.0/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q=
17+
github.com/cli/shurcooL-graphql v0.0.4 h1:6MogPnQJLjKkaXPyGqPRXOI2qCsQdqNfUY1QSJu2GuY=
18+
github.com/cli/shurcooL-graphql v0.0.4/go.mod h1:3waN4u02FiZivIV+p1y4d0Jo1jc6BViMA73C+sZo2fk=
119
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
20+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
21+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
222
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
323
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
24+
github.com/henvic/httpretty v0.0.6 h1:JdzGzKZBajBfnvlMALXXMVQWxWMF/ofTy8C3/OSUTxs=
25+
github.com/henvic/httpretty v0.0.6/go.mod h1:X38wLjWXHkXT7r2+uK8LjCMne9rsuNaBLJ+5cU2/Pmo=
426
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
527
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
28+
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
29+
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
630
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
731
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
832
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
933
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
1034
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
35+
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
36+
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
37+
github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
38+
github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
39+
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
40+
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
41+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
42+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
43+
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
44+
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
1145
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
1246
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
1347
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
1448
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
1549
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
50+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
51+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
52+
github.com/thlib/go-timezone-local v0.0.0-20210907160436-ef149e42d28e h1:BuzhfgfWQbX0dWzYzT1zsORLnHRv3bcRcsaUk0VmXA8=
53+
github.com/thlib/go-timezone-local v0.0.0-20210907160436-ef149e42d28e/go.mod h1:/Tnicc6m/lsJE0irFMA0LfIwTBo4QP7A8IfyIv4zZKI=
54+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
55+
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
1656
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1757
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
18-
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
19-
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
58+
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
59+
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
60+
golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y=
61+
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
62+
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
63+
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
2064
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
65+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
2166
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

main.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"strings"
1212
"time"
1313

14+
"github.com/cli/go-gh/v2"
1415
"github.com/fatih/color"
1516
"github.com/spf13/cobra"
1617
)
@@ -93,10 +94,9 @@ func getReposWithOpenPRs(ctx context.Context) (map[string][]PullRequestInfo, err
9394
}
9495
`
9596

96-
cmd := exec.CommandContext(ctx, "gh", "api", "graphql", "-f", fmt.Sprintf("query=%s", query))
97-
out, err := cmd.CombinedOutput()
97+
stdout, stderr, err := gh.ExecContext(ctx, "api", "graphql", "-f", fmt.Sprintf("query=%s", query))
9898
if err != nil {
99-
return nil, fmt.Errorf("error fetching open PRs: %v\nOutput: %s", err, string(out))
99+
return nil, fmt.Errorf("error fetching open PRs: %v\nOutput: %s", err, stderr.String())
100100
}
101101

102102
// Parse the GraphQL response
@@ -111,7 +111,7 @@ func getReposWithOpenPRs(ctx context.Context) (map[string][]PullRequestInfo, err
111111
}
112112

113113
var resp Response
114-
if err := json.Unmarshal(out, &resp); err != nil {
114+
if err := json.Unmarshal(stdout.Bytes(), &resp); err != nil {
115115
return nil, fmt.Errorf("error parsing GraphQL response: %v", err)
116116
}
117117

@@ -183,10 +183,10 @@ func getForks(ctx context.Context) ([]Repo, error) {
183183
if cursor != "" {
184184
args = append(args, "-f", fmt.Sprintf("after=%s", cursor))
185185
}
186-
cmd := exec.CommandContext(ctx, "gh", args...)
187-
out, err := cmd.CombinedOutput()
186+
187+
stdout, stderr, err := gh.ExecContext(ctx, args...)
188188
if err != nil {
189-
return nil, fmt.Errorf("error fetching forks: %v\nOutput: %s", err, string(out))
189+
return nil, fmt.Errorf("error fetching forks: %v\nOutput: %s", err, stderr.String())
190190
}
191191

192192
// Parse the GraphQL response
@@ -205,7 +205,7 @@ func getForks(ctx context.Context) ([]Repo, error) {
205205
}
206206

207207
var resp Response
208-
if err := json.Unmarshal(out, &resp); err != nil {
208+
if err := json.Unmarshal(stdout.Bytes(), &resp); err != nil {
209209
return nil, fmt.Errorf("error parsing GraphQL response: %v", err)
210210
}
211211

@@ -228,22 +228,22 @@ func getCommitComparison(ctx context.Context, fork Repo) (*CommitComparison, err
228228
}
229229

230230
// Use gh api to get the comparison between the fork and its parent
231-
cmd := exec.CommandContext(ctx, "gh", "api",
231+
stdout, stderr, err := gh.ExecContext(ctx,
232+
"api",
232233
fmt.Sprintf("repos/%s/compare/%s...%s:%s",
233234
fork.Parent.NameWithOwner,
234235
fork.Parent.DefaultBranchRef.Name,
235236
fork.Owner.Login,
236237
fork.DefaultBranchRef.Name,
237238
),
238239
)
239-
out, err := cmd.CombinedOutput()
240240
if err != nil {
241-
return nil, fmt.Errorf("error comparing repositories: %v\nOutput: %s", err, string(out))
241+
return nil, fmt.Errorf("error comparing repositories: %w\nOutput: %s", err, stderr.String())
242242
}
243243

244244
var comparison CommitComparison
245-
if err := json.Unmarshal(out, &comparison); err != nil {
246-
return nil, fmt.Errorf("error parsing comparison response: %v", err)
245+
if err := json.Unmarshal(stdout.Bytes(), &comparison); err != nil {
246+
return nil, fmt.Errorf("error parsing comparison response: %w", err)
247247
}
248248

249249
return &comparison, nil
@@ -374,11 +374,11 @@ func cleanupForks(cmd *cobra.Command, args []string) error {
374374
}
375375

376376
color.New(color.FgRed).Printf("🗑️ Deleting %s...\n", fork.NameWithOwner)
377-
deleteCmd := exec.CommandContext(ctx, "gh", "repo", "delete", fork.NameWithOwner, "--yes")
378-
if err := deleteCmd.Run(); err != nil {
379-
fmt.Fprintf(os.Stderr, "Error deleting %s: %v\n", fork.NameWithOwner, err)
377+
stdout, stderr, err := gh.ExecContext(ctx, "repo", "delete", fork.NameWithOwner, "--yes")
378+
if err != nil {
379+
fmt.Fprintf(os.Stderr, "Error deleting %s: %v %s\n", fork.NameWithOwner, err, stderr.String())
380380
} else {
381-
color.New(color.FgGreen).Printf("✅ Successfully deleted %s.\n", fork.NameWithOwner)
381+
color.New(color.FgGreen).Printf("✅ Successfully deleted %s.\n", stdout.String())
382382
}
383383
}
384384
fmt.Println()

0 commit comments

Comments
 (0)