Skip to content

Commit 0e2ab6a

Browse files
committed
use go-gh
1 parent 56e146d commit 0e2ab6a

File tree

4 files changed

+102
-83
lines changed

4 files changed

+102
-83
lines changed

api.go

+41-48
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,60 @@
11
package main
22

33
import (
4-
"bytes"
5-
"encoding/json"
64
"fmt"
7-
"os/exec"
8-
"strings"
95

10-
"github.com/cli/safeexec"
6+
"github.com/cli/go-gh"
117
)
128

13-
func searchRepos(opts *SearchOptions) ([]Repository, error) {
14-
var result []Repository
15-
query := fmt.Sprintf("q=%s", opts.Query)
16-
17-
if opts.Topic != "" {
18-
query += fmt.Sprintf("+topic:%s", opts.Topic)
19-
}
20-
if opts.SearchIn != "name" {
21-
query += fmt.Sprintf("+in:%s", opts.SearchIn)
22-
}
9+
type Repository struct {
10+
NameWithOwner string
11+
Description string
12+
StargazerCount int
13+
PrimaryLanguage struct{ Name string }
14+
}
2315

24-
args := []string{
25-
"api", "-X", "GET", "https://api.github.com/search/repositories",
26-
"--jq", ".items",
27-
"--cache=5m",
28-
"-f", query,
29-
"-f", fmt.Sprintf("per_page=%d", opts.Limit)}
16+
func searchRepos(opts *SearchOptions) ([]Repository, int, error) {
17+
searchQuery := opts.Query
3018

31-
if opts.SortBy != "" {
32-
args = append(args, "-f")
33-
args = append(args, fmt.Sprintf("sort=%s", strings.ToLower(opts.SortBy)))
19+
if opts.Topic != "" {
20+
searchQuery += fmt.Sprintf(" topic:%s", opts.Topic)
3421
}
35-
36-
stdOut, _, err := gh(args...)
37-
if err != nil {
38-
return result, err
22+
if opts.SearchIn != "" {
23+
searchQuery += fmt.Sprintf(" in:%s", opts.SearchIn)
3924
}
40-
41-
err = json.Unmarshal(stdOut.Bytes(), &result)
42-
if err != nil {
43-
return result, err
25+
gqlQuery := `query GetRepos($limit: Int, $query: String!){
26+
search(query: $query, first: $limit, type: REPOSITORY) {
27+
repositoryCount
28+
nodes {
29+
... on Repository {
30+
nameWithOwner,
31+
stargazerCount,
32+
description,
33+
primaryLanguage { name }
34+
}
35+
}
36+
}
37+
}`
38+
39+
variables := map[string]interface{}{
40+
"limit": opts.Limit,
41+
"query": searchQuery,
4442
}
45-
return result, nil
46-
}
43+
fmt.Println(searchQuery)
4744

48-
// call gh and write output to buffer
49-
func gh(args ...string) (stdOut, errOut bytes.Buffer, err error) {
50-
ghBin, err := safeexec.LookPath("gh")
51-
if err != nil {
52-
err = fmt.Errorf("gh not found. error: %w", err)
53-
return
45+
type responseData struct {
46+
Search struct {
47+
RepositoryCount int
48+
Nodes []Repository
49+
}
5450
}
5551

56-
cmd := exec.Command(ghBin, args...)
57-
cmd.Stderr = &errOut
58-
cmd.Stdout = &stdOut
52+
var response responseData
5953

60-
err = cmd.Run()
61-
if err != nil {
62-
err = fmt.Errorf("failed to run gh. error: %w, stderr: %s", err, errOut.String())
63-
return
54+
client, err := gh.GQLClient(nil)
55+
if err = client.Do(gqlQuery, variables, &response); err != nil {
56+
return response.Search.Nodes, response.Search.RepositoryCount, err
6457
}
6558

66-
return
59+
return response.Search.Nodes, response.Search.RepositoryCount, nil
6760
}

go.mod

+11-4
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,24 @@ module github.com/meiji163/gh-search
33
go 1.17
44

55
require (
6-
github.com/AlecAivazis/survey/v2 v2.3.2 // indirect
6+
github.com/AlecAivazis/survey/v2 v2.3.2
7+
github.com/cli/go-gh v0.0.1
8+
github.com/spf13/cobra v1.2.1
9+
)
10+
11+
require (
712
github.com/cli/safeexec v1.0.0 // indirect
8-
github.com/fatih/color v1.13.0 // indirect
13+
github.com/cli/shurcooL-graphql v0.0.1 // indirect
14+
github.com/henvic/httpretty v0.0.6 // indirect
915
github.com/inconshreveable/mousetrap v1.0.0 // indirect
1016
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
1117
github.com/mattn/go-colorable v0.1.9 // indirect
1218
github.com/mattn/go-isatty v0.0.14 // indirect
1319
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
14-
github.com/spf13/cobra v1.2.1 // indirect
1520
github.com/spf13/pflag v1.0.5 // indirect
21+
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
1622
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
1723
golang.org/x/term v0.0.0-20210503060354-a79de5458b56 // indirect
18-
golang.org/x/text v0.3.5 // indirect
24+
golang.org/x/text v0.3.6 // indirect
25+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
1926
)

go.sum

+23-3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ github.com/AlecAivazis/survey/v2 v2.3.2 h1:TqTB+aDDCLYhf9/bD2TwSO8u8jDSmMUd2SUVO
4141
github.com/AlecAivazis/survey/v2 v2.3.2/go.mod h1:TH2kPCDU3Kqq7pLbnCWwZXDBjnhZtmsCle5EiYDJ2fg=
4242
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
4343
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
44+
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
45+
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
46+
github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw=
4447
github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc=
4548
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
4649
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
@@ -52,8 +55,12 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA
5255
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
5356
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
5457
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
58+
github.com/cli/go-gh v0.0.1 h1:Fm1hwNUsxmGzlHymCj6ELb/qTkgH6k0o+9aJ97PUmeA=
59+
github.com/cli/go-gh v0.0.1/go.mod h1:J1eNgrPJYAUy7TwPKj7GW1ibqI+WCiMndtyzrCyZIiQ=
5560
github.com/cli/safeexec v1.0.0 h1:0VngyaIyqACHdcMNWfo6+KdUYnqEr2Sg+bSP1pdF+dI=
5661
github.com/cli/safeexec v1.0.0/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q=
62+
github.com/cli/shurcooL-graphql v0.0.1 h1:/9J3t9O6p1B8zdBBtQighq5g7DQRItBwuwGh3SocsKM=
63+
github.com/cli/shurcooL-graphql v0.0.1/go.mod h1:U7gCSuMZP/Qy7kbqkk5PrqXEeDgtfG5K+W+u8weorps=
5764
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
5865
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
5966
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
@@ -62,6 +69,7 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee
6269
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
6370
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
6471
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
72+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
6573
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6674
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
6775
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -71,8 +79,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
7179
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
7280
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
7381
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
74-
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
75-
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
7682
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
7783
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
7884
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -163,6 +169,9 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
163169
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
164170
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
165171
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
172+
github.com/henvic/httpretty v0.0.6 h1:JdzGzKZBajBfnvlMALXXMVQWxWMF/ofTy8C3/OSUTxs=
173+
github.com/henvic/httpretty v0.0.6/go.mod h1:X38wLjWXHkXT7r2+uK8LjCMne9rsuNaBLJ+5cU2/Pmo=
174+
github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ=
166175
github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A=
167176
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
168177
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
@@ -177,9 +186,12 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:C
177186
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
178187
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
179188
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
189+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
180190
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
181191
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
192+
github.com/kr/pty v1.1.4 h1:5Myjjh3JY/NaAi4IsUbHADytDyl1VE1Y9PXDlL+P/VQ=
182193
github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
194+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
183195
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
184196
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
185197
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
@@ -209,6 +221,7 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI
209221
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
210222
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
211223
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
224+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
212225
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
213226
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
214227
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -235,6 +248,7 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
235248
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
236249
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
237250
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
251+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
238252
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
239253
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
240254
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -334,6 +348,8 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v
334348
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
335349
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
336350
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
351+
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
352+
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
337353
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
338354
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
339355
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -399,6 +415,7 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w
399415
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
400416
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
401417
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
418+
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
402419
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
403420
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
404421
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -411,8 +428,9 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3
411428
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
412429
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
413430
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
414-
golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
415431
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
432+
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
433+
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
416434
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
417435
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
418436
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -574,6 +592,7 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
574592
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
575593
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
576594
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
595+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
577596
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
578597
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
579598
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
@@ -582,6 +601,7 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
582601
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
583602
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
584603
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
604+
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
585605
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
586606
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
587607
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

main.go

+27-28
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,10 @@ import (
88
"strings"
99

1010
"github.com/AlecAivazis/survey/v2"
11-
"github.com/fatih/color"
11+
"github.com/cli/go-gh"
1212
"github.com/spf13/cobra"
1313
)
1414

15-
var blue = color.New(color.FgBlue)
16-
var yellow = color.New(color.FgYellow)
17-
1815
type SearchOptions struct {
1916
Query string
2017
Interactive bool
@@ -70,31 +67,27 @@ $ gh search cli --sort=stars --limit=10`,
7067
return cmd
7168
}
7269

73-
type Repository struct {
74-
Name string `json:"full_name"`
75-
Description string
76-
Stars int `json:"stargazers_count"`
77-
URL string `json:"html_url"`
78-
Language string
79-
}
80-
8170
func runSearch(opts *SearchOptions) error {
82-
results, err := searchRepos(opts)
83-
if len(results) == 0 {
71+
results, total, err := searchRepos(opts)
72+
if err != nil {
73+
return err
74+
}
75+
76+
if total == 0 {
8477
fmt.Printf(`No results found for "%s"%s`, opts.Query, "\n")
8578
}
8679

87-
var repos []string
80+
var repoStrs []string
8881
for i, repo := range results {
89-
repos = append(repos, prettyPrint(i+1, &repo))
82+
repoStrs = append(repoStrs, prettyPrint(i+1, &repo))
9083
}
9184

92-
numResults := len(repos)
85+
numResults := len(repoStrs)
9386

9487
selector := &survey.Select{
95-
Message: fmt.Sprintf("%d Results\n", numResults),
96-
Options: repos,
97-
PageSize: 6,
88+
Message: fmt.Sprintf("%d/%d Results\n", numResults, total),
89+
Options: repoStrs,
90+
PageSize: 10,
9891
}
9992

10093
var selection string
@@ -113,14 +106,18 @@ func runSearch(opts *SearchOptions) error {
113106
return err
114107
}
115108
selectedRepo := results[n-1]
116-
fmt.Printf(`%[1]sFor more info, run "gh repo view %s" or view on the web at %s%[1]s`,
117-
"\n", selectedRepo.Name, color.GreenString(selectedRepo.URL))
109+
args := []string{"repo", "view", selectedRepo.NameWithOwner}
110+
stdOut, _, err := gh.Exec(args...)
111+
if err != nil {
112+
return err
113+
}
114+
fmt.Print(stdOut.String())
118115

119116
return nil
120117
}
121118

122119
func prettyPrint(i int, repo *Repository) string {
123-
out := fmt.Sprintf("%d %s\n", i, color.GreenString(repo.Name))
120+
out := fmt.Sprintf("%d %s\n", i, repo.NameWithOwner)
124121

125122
dscript := repo.Description
126123
if len(dscript) > 100 {
@@ -129,14 +126,16 @@ func prettyPrint(i int, repo *Repository) string {
129126
}
130127
out += fmt.Sprintf("\t%s\n", dscript)
131128

132-
if repo.Language != "" {
133-
out += fmt.Sprintf("\tLanguage: %s\n", blue.Sprintf(repo.Language))
129+
lang := repo.PrimaryLanguage.Name
130+
131+
if lang != "" {
132+
out += fmt.Sprintf("\tLanguage: %s\n", lang)
134133
}
135134

136-
if repo.Stars >= 1000 {
137-
out += yellow.Sprintf("\t★ %.1fk", float32(repo.Stars)/1000.0)
135+
if repo.StargazerCount >= 1000 {
136+
out += fmt.Sprintf("\t★ %.1fk", float32(repo.StargazerCount)/1000.0)
138137
} else {
139-
out += yellow.Sprintf("\t★ %d", repo.Stars)
138+
out += fmt.Sprintf("\t★ %d", repo.StargazerCount)
140139
}
141140
return out
142141
}

0 commit comments

Comments
 (0)