From cde904ff08897c0702de54d1dce0e5d21572bc0c Mon Sep 17 00:00:00 2001 From: Chris Cummer Date: Tue, 17 Dec 2019 08:26:16 -0800 Subject: [PATCH] Use errcheck to find unhandled errors (#795) Signed-off-by: Chris Cummer --- Makefile | 25 ++++++++++++++++ cfg/copy.go | 4 +-- flags/flags.go | 8 ++--- go.mod | 2 +- go.sum | 5 ++-- help/help.go | 6 +++- logger/log.go | 2 +- main.go | 3 +- modules/bamboohr/request.go | 2 +- modules/cmdrunner/widget.go | 11 +++++-- modules/cryptoexchanges/bittrex/display.go | 8 +++-- modules/cryptoexchanges/bittrex/widget.go | 12 ++++++-- modules/cryptoexchanges/blockfolio/widget.go | 2 +- .../cryptolive/price/widget.go | 6 ++-- .../cryptolive/toplist/widget.go | 4 ++- modules/digitalocean/widget.go | 21 +++++++++++--- modules/exchangerates/exchangerates.go | 10 +++---- modules/football/widget.go | 4 +-- modules/gcal/client.go | 12 +++++--- modules/gitlab/gitlab_project.go | 5 +++- modules/gspreadsheets/client.go | 19 ++++++++---- modules/hibp/client.go | 5 +++- modules/ipaddresses/ipapi/widget.go | 8 +++-- modules/ipaddresses/ipinfo/widget.go | 8 +++-- modules/logger/widget.go | 2 +- modules/nbascore/widget.go | 7 +++-- modules/newrelic/client/http_helper.go | 2 +- modules/opsgenie/client.go | 2 +- modules/pocket/client.go | 2 +- modules/rollbar/client.go | 5 +++- modules/spotifyweb/keyboard.go | 27 +++++++++++++---- modules/spotifyweb/widget.go | 12 ++++++-- modules/textfile/widget.go | 13 +++++++-- modules/todo/widget.go | 9 ++++-- modules/transmission/widget.go | 14 +++++++-- modules/twitter/request.go | 2 +- modules/twitterstats/client.go | 11 ++++--- modules/victorops/client.go | 2 +- .../weatherservices/prettyweather/widget.go | 2 +- modules/zendesk/client.go | 3 +- modules/zendesk/tickets.go | 6 +++- utils/utils.go | 29 +++++++++++++------ .../google/go-github/v26/github/github.go | 2 +- .../gophercloud/pagination/http.go | 3 +- 44 files changed, 250 insertions(+), 97 deletions(-) diff --git a/Makefile b/Makefile index b4caf1978..92c1b28cf 100644 --- a/Makefile +++ b/Makefile @@ -68,16 +68,41 @@ install: ## lint: runs a number of code quality checks against the source code lint: + # https://github.com/kisielk/errcheck + errcheck ./app + errcheck ./cfg + errcheck ./flags + errcheck ./help + errcheck ./logger + errcheck ./modules/... + errcheck ./utils + errcheck ./view + errcheck ./wtf + errcheck ./main.go + # https://golang.org/cmd/vet/ + go vet ./app + go vet ./cfg + go vet ./flags + go vet ./help + go vet ./logger go vet ./modules/... + go vet ./utils + go vet ./view + go vet ./wtf + go vet ./main.go # https://staticcheck.io/docs/ staticcheck ./app staticcheck ./cfg + staticcheck ./flags + staticcheck ./help + staticcheck ./logger staticcheck ./modules/... staticcheck ./utils staticcheck ./view staticcheck ./wtf + staticcheck ./main.go ## run: executes the locally-installed version run: build diff --git a/cfg/copy.go b/cfg/copy.go index 6cea318d7..b45ac48be 100644 --- a/cfg/copy.go +++ b/cfg/copy.go @@ -34,7 +34,7 @@ func fcopy(src, dest string, info os.FileInfo) error { if err != nil { return err } - defer f.Close() + defer func() { _ = f.Close() }() if err = os.Chmod(f.Name(), info.Mode()); err != nil { return err @@ -44,7 +44,7 @@ func fcopy(src, dest string, info os.FileInfo) error { if err != nil { return err } - defer s.Close() + defer func() { _ = f.Close() }() _, err = io.Copy(f, s) return err diff --git a/flags/flags.go b/flags/flags.go index cc55c35cf..35b1eb94e 100644 --- a/flags/flags.go +++ b/flags/flags.go @@ -35,14 +35,14 @@ func (flags *Flags) ConfigFilePath() string { // RenderIf displays special-case information based on the flags passed // in, if any flags were passed in -func (flags *Flags) RenderIf(version string, config *config.Config) { +func (flags *Flags) RenderIf(version, date string, config *config.Config) { if flags.HasModule() { help.Display(flags.Module, config) os.Exit(0) } if flags.HasVersion() { - fmt.Println(version) + fmt.Println(fmt.Sprintf("%s (%s)", version, date)) os.Exit(0) } } @@ -59,7 +59,7 @@ func (flags *Flags) HasModule() bool { // HasVersion returns TRUE if the version flag was passed in, FALSE if it was not func (flags *Flags) HasVersion() bool { - return flags.Version == true + return flags.Version } // Parse parses the incoming flags @@ -74,7 +74,7 @@ func (flags *Flags) Parse() { // If we have a custom config, then we're done parsing parameters, we don't need to // generate the default value flags.hasCustom = (len(flags.Config) > 0) - if flags.hasCustom == true { + if flags.hasCustom { return } diff --git a/go.mod b/go.mod index 78c45881c..65051a89d 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/xanzy/go-gitlab v0.22.2 github.com/zmb3/spotify v0.0.0-20191010212056-e12fb981aacb github.com/zorkian/go-datadog-api v2.25.0+incompatible - golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529 // indirect + golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 // indirect golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 google.golang.org/api v0.14.0 gopkg.in/jarcoal/httpmock.v1 v1.0.0-20181110093347-3be5f16b70eb // indirect diff --git a/go.sum b/go.sum index fc86fa9e6..6d8179f0f 100644 --- a/go.sum +++ b/go.sum @@ -160,6 +160,7 @@ github.com/json-iterator/go v0.0.0-20180701071628-ab8a2e0c74be/go.mod h1:+SdeFBv github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/kisielk/errcheck v1.2.0 h1:reN85Pxc5larApoH1keMBiu2GWtPqXQ1nc9gx+jOU+E= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -263,8 +264,8 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529 h1:iMGN4xG0cnqj3t+zOM8wUB0BiPKHEwSxEZCvzcbZuvk= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= diff --git a/help/help.go b/help/help.go index 369813d8b..b38abd8a6 100644 --- a/help/help.go +++ b/help/help.go @@ -18,7 +18,11 @@ func Display(moduleName string, cfg *config.Config) { } func helpFor(moduleName string, cfg *config.Config) string { - cfg.Set("wtf.mods."+moduleName+".enabled", true) + err := cfg.Set("wtf.mods."+moduleName+".enabled", true) + if err != nil { + return "" + } + widget := app.MakeWidget(nil, nil, moduleName, cfg) // Since we are forcing enabled config, if no module diff --git a/logger/log.go b/logger/log.go index f72d1aefb..082253304 100644 --- a/logger/log.go +++ b/logger/log.go @@ -17,7 +17,7 @@ func Log(msg string) { if err != nil { log.Fatalf("error opening file: %v", err) } - defer f.Close() + defer func() { _ = f.Close() }() log.SetOutput(f) log.Println(msg) diff --git a/main.go b/main.go index 20a689cc1..970c3e95c 100644 --- a/main.go +++ b/main.go @@ -24,7 +24,6 @@ import ( var tviewApp *tview.Application var ( - commit = "dev" date = "dev" version = "dev" ) @@ -54,7 +53,7 @@ func main() { // Load the configuration file config := cfg.LoadWtfConfigFile(flags.ConfigFilePath()) - flags.RenderIf(version, config) + flags.RenderIf(version, date, config) if flags.Profile { defer profile.Start(profile.MemProfile).Stop() diff --git a/modules/bamboohr/request.go b/modules/bamboohr/request.go index 04de945aa..6801be8b7 100644 --- a/modules/bamboohr/request.go +++ b/modules/bamboohr/request.go @@ -18,7 +18,7 @@ func Request(apiKey string, apiURL string) ([]byte, error) { if err != nil { return nil, err } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() data, err := ParseBody(resp) if err != nil { diff --git a/modules/cmdrunner/widget.go b/modules/cmdrunner/widget.go index 254bde122..6e2f2eff3 100644 --- a/modules/cmdrunner/widget.go +++ b/modules/cmdrunner/widget.go @@ -79,7 +79,7 @@ func (widget *Widget) Write(p []byte) (n int, err error) { // Remove lines that exceed maxLines lines := widget.countLines() if lines > widget.settings.maxLines { - widget.drainLines(lines - widget.settings.maxLines) + err = widget.drainLines(lines - widget.settings.maxLines) } return n, err @@ -93,10 +93,15 @@ func (widget *Widget) countLines() int { } // drainLines removed the first n lines from the buffer -func (widget *Widget) drainLines(n int) { +func (widget *Widget) drainLines(n int) error { for i := 0; i < n; i++ { - widget.buffer.ReadBytes('\n') + _, err := widget.buffer.ReadBytes('\n') + if err != nil { + return err + } } + + return nil } func (widget *Widget) environment() []string { diff --git a/modules/cryptoexchanges/bittrex/display.go b/modules/cryptoexchanges/bittrex/display.go index d23c134af..6ad60b9c2 100644 --- a/modules/cryptoexchanges/bittrex/display.go +++ b/modules/cryptoexchanges/bittrex/display.go @@ -44,7 +44,7 @@ func (widget *Widget) content() (string, string, bool) { formatableText("Open Sell", "OpenSellOrders"), ) - strTemplate.Execute(writer, map[string]string{ + err := strTemplate.Execute(writer, map[string]string{ "nameColor": widget.settings.colors.market.name, "fieldColor": widget.settings.colors.market.field, "valueColor": widget.settings.colors.market.value, @@ -57,7 +57,11 @@ func (widget *Widget) content() (string, string, bool) { "OpenSellOrders": marketCurrency.OpenSellOrders, }) - str += writer.String() + "\n" + if err != nil { + str = err.Error() + } else { + str += writer.String() + "\n" + } } } diff --git a/modules/cryptoexchanges/bittrex/widget.go b/modules/cryptoexchanges/bittrex/widget.go index e3d54197b..721792da7 100644 --- a/modules/cryptoexchanges/bittrex/widget.go +++ b/modules/cryptoexchanges/bittrex/widget.go @@ -90,7 +90,9 @@ func (widget *Widget) Refresh() { func (widget *Widget) updateSummary() { // In case if anything bad happened! defer func() { - recover() + if r := recover(); r != nil { + fmt.Println("recovered in updateSummary()", r) + } }() client := &http.Client{ @@ -120,10 +122,14 @@ func (widget *Widget) updateSummary() { errorText = "" } - defer response.Body.Close() + defer func() { _ = response.Body.Close() }() jsonResponse := summaryResponse{} decoder := json.NewDecoder(response.Body) - decoder.Decode(&jsonResponse) + err = decoder.Decode(&jsonResponse) + if err != nil { + errorText = "Could not parse JSON!" + break + } if !jsonResponse.Success { ok = false diff --git a/modules/cryptoexchanges/blockfolio/widget.go b/modules/cryptoexchanges/blockfolio/widget.go index 1b4447e03..675640c72 100644 --- a/modules/cryptoexchanges/blockfolio/widget.go +++ b/modules/cryptoexchanges/blockfolio/widget.go @@ -115,7 +115,7 @@ func MakeApiRequest(token string, method string) ([]byte, error) { if err != nil { return nil, err } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err diff --git a/modules/cryptoexchanges/cryptolive/price/widget.go b/modules/cryptoexchanges/cryptolive/price/widget.go index 8b77f6c36..999d8ac00 100644 --- a/modules/cryptoexchanges/cryptolive/price/widget.go +++ b/modules/cryptoexchanges/cryptolive/price/widget.go @@ -99,7 +99,9 @@ func (widget *Widget) getToList(symbol string) []*toCurrency { func (widget *Widget) updateCurrencies() { defer func() { - recover() + if r := recover(); r != nil { + fmt.Println("recovered in updateSummary()", r) + } }() for _, fromCurrency := range widget.list.items { @@ -121,7 +123,7 @@ func (widget *Widget) updateCurrencies() { ok = true } - defer response.Body.Close() + defer func() { _ = response.Body.Close() }() _ = json.NewDecoder(response.Body).Decode(&jsonResponse) diff --git a/modules/cryptoexchanges/cryptolive/toplist/widget.go b/modules/cryptoexchanges/cryptolive/toplist/widget.go index 532abbeda..b1a96ad3f 100644 --- a/modules/cryptoexchanges/cryptolive/toplist/widget.go +++ b/modules/cryptoexchanges/cryptolive/toplist/widget.go @@ -68,7 +68,9 @@ func (widget *Widget) Refresh(wg *sync.WaitGroup) { func (widget *Widget) updateData() { defer func() { - recover() + if r := recover(); r != nil { + fmt.Println("recovered in updateSummary()", r) + } }() client := &http.Client{ diff --git a/modules/digitalocean/widget.go b/modules/digitalocean/widget.go index a9c8bc3c6..fa7cf703d 100644 --- a/modules/digitalocean/widget.go +++ b/modules/digitalocean/widget.go @@ -177,7 +177,10 @@ func (widget *Widget) dropletDestroy() { return } - widget.client.Droplets.Delete(context.Background(), currDroplet.ID) + _, err := widget.client.Droplets.Delete(context.Background(), currDroplet.ID) + if err != nil { + return + } widget.dropletRemoveSelected() widget.Refresh() @@ -190,7 +193,11 @@ func (widget *Widget) dropletEnabledPrivateNetworking() { return } - widget.client.DropletActions.EnablePrivateNetworking(context.Background(), currDroplet.ID) + _, _, err := widget.client.DropletActions.EnablePrivateNetworking(context.Background(), currDroplet.ID) + if err != nil { + return + } + widget.Refresh() } @@ -210,7 +217,10 @@ func (widget *Widget) dropletRestart() { return } - widget.client.DropletActions.Reboot(context.Background(), currDroplet.ID) + _, _, err := widget.client.DropletActions.Reboot(context.Background(), currDroplet.ID) + if err != nil { + return + } widget.Refresh() } @@ -221,7 +231,10 @@ func (widget *Widget) dropletShutDown() { return } - widget.client.DropletActions.Shutdown(context.Background(), currDroplet.ID) + _, _, err := widget.client.DropletActions.Shutdown(context.Background(), currDroplet.ID) + if err != nil { + return + } widget.Refresh() } diff --git a/modules/exchangerates/exchangerates.go b/modules/exchangerates/exchangerates.go index e3895a292..0edfaf8e4 100644 --- a/modules/exchangerates/exchangerates.go +++ b/modules/exchangerates/exchangerates.go @@ -16,14 +16,14 @@ func FetchExchangeRates(settings *Settings) (map[string]map[string]float64, erro out := map[string]map[string]float64{} for base, rates := range settings.rates { - res, err := http.Get(fmt.Sprintf("https://api.exchangeratesapi.io/latest?base=%s", base)) + resp, err := http.Get(fmt.Sprintf("https://api.exchangeratesapi.io/latest?base=%s", base)) if err != nil { return nil, err } - defer res.Body.Close() + defer func() { _ = resp.Body.Close() }() - var resp Response - err = utils.ParseJSON(&resp, res.Body) + var data Response + err = utils.ParseJSON(&data, resp.Body) if err != nil { return nil, err } @@ -31,7 +31,7 @@ func FetchExchangeRates(settings *Settings) (map[string]map[string]float64, erro out[base] = map[string]float64{} for _, currency := range rates { - rate, ok := resp.Rates[currency] + rate, ok := data.Rates[currency] if ok { out[base][currency] = rate } diff --git a/modules/football/widget.go b/modules/football/widget.go index 0d162c9e2..7a569a458 100644 --- a/modules/football/widget.go +++ b/modules/football/widget.go @@ -95,7 +95,7 @@ func (widget *Widget) GetStandings(leagueId int) string { if err != nil { return fmt.Sprintf("Error fetching standings: %s", err.Error()) } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() data, err := ioutil.ReadAll(resp.Body) if err != nil { return fmt.Sprintf("Error fetching standings: %s", err.Error()) @@ -141,7 +141,7 @@ func (widget *Widget) GetMatches(leagueId int) string { if err != nil { return fmt.Sprintf("Error fetching matches: %s", err.Error()) } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() data, err := ioutil.ReadAll(resp.Body) if err != nil { return fmt.Sprintf("Error fetching matches: %s", err.Error()) diff --git a/modules/gcal/client.go b/modules/gcal/client.go index 9bb12a13a..84bc60f8b 100644 --- a/modules/gcal/client.go +++ b/modules/gcal/client.go @@ -172,7 +172,8 @@ func tokenFromFile(file string) (*oauth2.Token, error) { } t := &oauth2.Token{} err = json.NewDecoder(f).Decode(t) - defer f.Close() + defer func() { _ = f.Close() }() + return t, err } @@ -182,11 +183,14 @@ func saveToken(file string, token *oauth2.Token) { fmt.Printf("Saving credential file to: %s\n", file) f, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { - log.Fatalf("Unable to cache oauth token: %v", err) + log.Fatalf("unable to cache oauth token: %v", err) } - defer f.Close() + defer func() { _ = f.Close() }() - json.NewEncoder(f).Encode(token) + err = json.NewEncoder(f).Encode(token) + if err != nil { + log.Fatalf("unable to encode oauth token: %v", err) + } } func (widget *Widget) getCalendarIdList(srv *calendar.Service) ([]string, error) { diff --git a/modules/gitlab/gitlab_project.go b/modules/gitlab/gitlab_project.go index 09bfba4e3..0aea009d8 100644 --- a/modules/gitlab/gitlab_project.go +++ b/modules/gitlab/gitlab_project.go @@ -14,7 +14,10 @@ func newContext(settings *Settings) (*context, error) { gitlabClient := glb.NewClient(nil, settings.apiKey) if baseURL != "" { - gitlabClient.SetBaseURL(baseURL) + err := gitlabClient.SetBaseURL(baseURL) + if err != nil { + return nil, err + } } user, _, err := gitlabClient.Users.CurrentUser() diff --git a/modules/gspreadsheets/client.go b/modules/gspreadsheets/client.go index f71acdc4b..22cc4713b 100644 --- a/modules/gspreadsheets/client.go +++ b/modules/gspreadsheets/client.go @@ -112,10 +112,14 @@ func tokenCacheFile() (string, error) { if err != nil { return "", err } + tokenCacheDir := filepath.Join(usr.HomeDir, ".credentials") - os.MkdirAll(tokenCacheDir, 0700) - return filepath.Join(tokenCacheDir, - url.QueryEscape("spreadsheets-go-quickstart.json")), err + err = os.MkdirAll(tokenCacheDir, 0700) + if err != nil { + return "", err + } + + return filepath.Join(tokenCacheDir, url.QueryEscape("spreadsheets-go-quickstart.json")), err } // tokenFromFile retrieves a Token from a given file path. @@ -127,7 +131,7 @@ func tokenFromFile(file string) (*oauth2.Token, error) { } t := &oauth2.Token{} err = json.NewDecoder(f).Decode(t) - defer f.Close() + defer func() { _ = f.Close() }() return t, err } @@ -139,7 +143,10 @@ func saveToken(file string, token *oauth2.Token) { if err != nil { log.Fatalf("Unable to cache oauth token: %v", err) } - defer f.Close() + defer func() { _ = f.Close() }() - json.NewEncoder(f).Encode(token) + err = json.NewEncoder(f).Encode(token) + if err != nil { + log.Fatalf("Unable to encode oauth token: %v", err) + } } diff --git a/modules/hibp/client.go b/modules/hibp/client.go index f3b8800ea..f07a1db98 100644 --- a/modules/hibp/client.go +++ b/modules/hibp/client.go @@ -131,7 +131,10 @@ func (widget *Widget) validateHTTPResponse(responseCode int, body []byte) *hibpE switch responseCode { case 401, 402: - json.Unmarshal(body, hibpErr) + err := json.Unmarshal(body, hibpErr) + if err != nil { + return nil + } default: hibpErr = nil } diff --git a/modules/ipaddresses/ipapi/widget.go b/modules/ipaddresses/ipapi/widget.go index 70aa6e4aa..ace0ef92c 100644 --- a/modules/ipaddresses/ipapi/widget.go +++ b/modules/ipaddresses/ipapi/widget.go @@ -69,7 +69,7 @@ func (widget *Widget) ipinfo() { widget.result = err.Error() return } - defer response.Body.Close() + defer func() { _ = response.Body.Close() }() var info ipinfo err = json.NewDecoder(response.Body).Decode(&info) if err != nil { @@ -96,7 +96,7 @@ func (widget *Widget) setResult(info *ipinfo) { resultBuffer := new(bytes.Buffer) - resultTemplate.Execute(resultBuffer, map[string]string{ + err := resultTemplate.Execute(resultBuffer, map[string]string{ "nameColor": widget.settings.colors.name, "valueColor": widget.settings.colors.value, "Ip": info.Query, @@ -111,6 +111,10 @@ func (widget *Widget) setResult(info *ipinfo) { "Timezone": info.Timezone, }) + if err != nil { + widget.result = err.Error() + } + widget.result = resultBuffer.String() } diff --git a/modules/ipaddresses/ipinfo/widget.go b/modules/ipaddresses/ipinfo/widget.go index 55230414b..94c9d47a8 100644 --- a/modules/ipaddresses/ipinfo/widget.go +++ b/modules/ipaddresses/ipinfo/widget.go @@ -61,7 +61,7 @@ func (widget *Widget) ipinfo() { widget.result = err.Error() return } - defer response.Body.Close() + defer func() { _ = response.Body.Close() }() var info ipinfo err = json.NewDecoder(response.Body).Decode(&info) @@ -86,7 +86,7 @@ func (widget *Widget) setResult(info *ipinfo) { resultBuffer := new(bytes.Buffer) - resultTemplate.Execute(resultBuffer, map[string]string{ + err := resultTemplate.Execute(resultBuffer, map[string]string{ "subheadingColor": widget.settings.common.Colors.Subheading, "valueColor": widget.settings.common.Colors.Text, "Ip": info.Ip, @@ -99,6 +99,10 @@ func (widget *Widget) setResult(info *ipinfo) { "Organization": info.Organization, }) + if err != nil { + widget.result = err.Error() + } + widget.result = resultBuffer.String() } diff --git a/modules/logger/widget.go b/modules/logger/widget.go index 325fdf46e..9f18a04e8 100644 --- a/modules/logger/widget.go +++ b/modules/logger/widget.go @@ -70,7 +70,7 @@ func (widget *Widget) tailFile() []string { if err != nil { return []string{} } - defer file.Close() + defer func() { _ = file.Close() }() stat, err := file.Stat() if err != nil { diff --git a/modules/nbascore/widget.go b/modules/nbascore/widget.go index ed92dbc29..57bbe9441 100644 --- a/modules/nbascore/widget.go +++ b/modules/nbascore/widget.go @@ -67,7 +67,7 @@ func (widget *Widget) nbascore() (string, string, bool) { if err != nil { return title, err.Error(), true } - defer response.Body.Close() + defer func() { _ = response.Body.Close() }() if response.StatusCode != 200 { return title, err.Error(), true } // Get data from data.nba.net and check if successful @@ -77,7 +77,10 @@ func (widget *Widget) nbascore() (string, string, bool) { return title, err.Error(), true } result := map[string]interface{}{} - json.Unmarshal(contents, &result) + err = json.Unmarshal(contents, &result) + if err != nil { + return title, err.Error(), true + } allGame := fmt.Sprintf(" [%s]", widget.settings.common.Colors.Subheading) + (cur.Format(utils.FriendlyDateFormat) + "\n\n") + "[white]" diff --git a/modules/newrelic/client/http_helper.go b/modules/newrelic/client/http_helper.go index afa9c2c4e..f1675c630 100644 --- a/modules/newrelic/client/http_helper.go +++ b/modules/newrelic/client/http_helper.go @@ -31,7 +31,7 @@ func (c *Client) doRequest(req *http.Request, out interface{}) error { if err != nil { return err } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() b, err := ioutil.ReadAll(resp.Body) if err != nil { return err diff --git a/modules/opsgenie/client.go b/modules/opsgenie/client.go index 12e328270..439efea33 100644 --- a/modules/opsgenie/client.go +++ b/modules/opsgenie/client.go @@ -65,7 +65,7 @@ func opsGenieRequest(url string, apiKey string) (*OnCallResponse, error) { if err != nil { return nil, err } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() response := &OnCallResponse{} if err := json.NewDecoder(resp.Body).Decode(response); err != nil { diff --git a/modules/pocket/client.go b/modules/pocket/client.go index 2c598fcd4..812685984 100644 --- a/modules/pocket/client.go +++ b/modules/pocket/client.go @@ -87,7 +87,7 @@ func (client *Client) request(req request, result interface{}) error { if err != nil { return err } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() responseBody, err := ioutil.ReadAll(resp.Body) diff --git a/modules/rollbar/client.go b/modules/rollbar/client.go index 4170c5dd0..b008fa7d6 100644 --- a/modules/rollbar/client.go +++ b/modules/rollbar/client.go @@ -18,7 +18,10 @@ func CurrentActiveItems(accessToken, assignedToName string, activeOnly bool) (*A return items, err } - utils.ParseJSON(&items, resp.Body) + err = utils.ParseJSON(&items, resp.Body) + if err != nil { + return items, err + } return items, nil } diff --git a/modules/spotifyweb/keyboard.go b/modules/spotifyweb/keyboard.go index 1d3fd4d5b..ce08599e8 100644 --- a/modules/spotifyweb/keyboard.go +++ b/modules/spotifyweb/keyboard.go @@ -19,30 +19,47 @@ func (widget *Widget) initializeKeyboardControls() { } func (widget *Widget) selectPrevious() { - widget.client.Previous() + err := widget.client.Previous() + if err != nil { + return + } + time.Sleep(time.Millisecond * 500) widget.Refresh() } func (widget *Widget) selectNext() { - widget.client.Next() + err := widget.client.Next() + if err != nil { + return + } + time.Sleep(time.Millisecond * 500) widget.Refresh() } func (widget *Widget) playPause() { + var err error if widget.playerState.CurrentlyPlaying.Playing { - widget.client.Pause() + err = widget.client.Pause() } else { - widget.client.Play() + err = widget.client.Play() } + if err != nil { + return + } + time.Sleep(time.Millisecond * 500) widget.Refresh() } func (widget *Widget) toggleShuffle() { widget.playerState.ShuffleState = !widget.playerState.ShuffleState - widget.client.Shuffle(widget.playerState.ShuffleState) + err := widget.client.Shuffle(widget.playerState.ShuffleState) + if err != nil { + return + } + time.Sleep(time.Millisecond * 500) widget.Refresh() } diff --git a/modules/spotifyweb/widget.go b/modules/spotifyweb/widget.go index 20e28b6f9..0ed95156e 100644 --- a/modules/spotifyweb/widget.go +++ b/modules/spotifyweb/widget.go @@ -53,7 +53,10 @@ func authHandler(w http.ResponseWriter, r *http.Request) { } // use the token to get an authenticated client client := auth.NewClient(tok) - fmt.Fprintf(w, "Login Completed!") + _, err = fmt.Fprintf(w, "Login Completed!") + if err != nil { + return + } tempClientChan <- &client } @@ -81,7 +84,12 @@ func NewWidget(app *tview.Application, pages *tview.Pages, settings *Settings) * } http.HandleFunc("/callback", authHandler) - go http.ListenAndServe(":"+callbackPort, nil) + go func() { + err := http.ListenAndServe(":"+callbackPort, nil) + if err != nil { + return + } + }() go func() { // wait for auth to complete diff --git a/modules/textfile/widget.go b/modules/textfile/widget.go index 236560d69..51d39e9cc 100644 --- a/modules/textfile/widget.go +++ b/modules/textfile/widget.go @@ -95,7 +95,7 @@ func (widget *Widget) formattedText() string { if err != nil { return err.Error() } - defer file.Close() + defer func() { _ = file.Close() }() lexer := lexers.Match(filePath) if lexer == nil { @@ -115,7 +115,10 @@ func (widget *Widget) formattedText() string { iterator, _ := lexer.Tokenise(nil, string(contents)) var buf bytes.Buffer - formatter.Format(&buf, style, iterator) + err = formatter.Format(&buf, style, iterator) + if err != nil { + return err.Error() + } return tview.TranslateANSI(buf.String()) } @@ -152,7 +155,11 @@ func (widget *Widget) watchForFileChanges() { for _, source := range widget.Sources { fullPath, err := utils.ExpandHomeDir(source) if err == nil { - watch.Add(fullPath) + e := watch.Add(fullPath) + if e != nil { + fmt.Println(e) + os.Exit(1) + } } } diff --git a/modules/todo/widget.go b/modules/todo/widget.go index e2fd00b22..f11b2d6cf 100644 --- a/modules/todo/widget.go +++ b/modules/todo/widget.go @@ -91,11 +91,11 @@ func (widget *Widget) SetList(list checklist.Checklist) { func (widget *Widget) init() { _, err := cfg.CreateFile(widget.filePath) if err != nil { - panic(err) + return } } -// isItemSelected returns weather any item of the todo is selected or not +// isItemSelected returns whether any item of the todo is selected or not func (widget *Widget) isItemSelected() bool { return widget.Selected >= 0 && widget.Selected < len(widget.list.Items) } @@ -107,7 +107,10 @@ func (widget *Widget) load() { fileData, _ := utils.ReadFileBytes(filePath) - yaml.Unmarshal(fileData, &widget.list) + err := yaml.Unmarshal(fileData, &widget.list) + if err != nil { + return + } widget.ScrollableWidget.SetItemCount(len(widget.list.Items)) widget.setItemChecks() diff --git a/modules/transmission/widget.go b/modules/transmission/widget.go index 85fa5f340..907ebcf52 100644 --- a/modules/transmission/widget.go +++ b/modules/transmission/widget.go @@ -158,7 +158,10 @@ func (widget *Widget) deleteSelectedTorrent() { DeleteLocalData: false, } - widget.client.TorrentRemove(removePayload) + err := widget.client.TorrentRemove(removePayload) + if err != nil { + return + } widget.display() } @@ -176,10 +179,15 @@ func (widget *Widget) pauseUnpauseTorrent() { ids := []int64{*currTorrent.ID} + var err error if *currTorrent.Status == transmissionrpc.TorrentStatusStopped { - widget.client.TorrentStartIDs(ids) + err = widget.client.TorrentStartIDs(ids) } else { - widget.client.TorrentStopIDs(ids) + err = widget.client.TorrentStopIDs(ids) + } + + if err != nil { + return } widget.display() diff --git a/modules/twitter/request.go b/modules/twitter/request.go index 8c4ee9158..4f9dacf36 100644 --- a/modules/twitter/request.go +++ b/modules/twitter/request.go @@ -10,7 +10,7 @@ func Request(httpClient *http.Client, apiURL string) ([]byte, error) { if err != nil { return nil, err } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() data, err := ParseBody(resp) if err != nil { diff --git a/modules/twitterstats/client.go b/modules/twitterstats/client.go index 6955b024b..10213584c 100644 --- a/modules/twitterstats/client.go +++ b/modules/twitterstats/client.go @@ -73,19 +73,22 @@ func (client *Client) GetStatsForUser(username string) TwitterStats { } url := fmt.Sprintf("%s?screen_name=%s", userTimelineURL, username) - res, err := client.httpClient.Get(url) + resp, err := client.httpClient.Get(url) if err != nil { return stats } - defer res.Body.Close() + defer func() { _ = resp.Body.Close() }() - body, err := ioutil.ReadAll(res.Body) + body, err := ioutil.ReadAll(resp.Body) if err != nil { return stats } // If there is an error while parsing, just discard the error and return the empty stats - json.Unmarshal(body, &stats) + err = json.Unmarshal(body, &stats) + if err != nil { + return stats + } return stats } diff --git a/modules/victorops/client.go b/modules/victorops/client.go index 060693131..126a881af 100644 --- a/modules/victorops/client.go +++ b/modules/victorops/client.go @@ -38,7 +38,7 @@ func victorOpsRequest(url string, apiID string, apiKey string) ([]OnCallTeam, er if resp.StatusCode != 200 { return nil, fmt.Errorf("%s", resp.Status) } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() response := &OnCallResponse{} if err := json.NewDecoder(resp.Body).Decode(response); err != nil { diff --git a/modules/weatherservices/prettyweather/widget.go b/modules/weatherservices/prettyweather/widget.go index 824cb945e..d97991536 100644 --- a/modules/weatherservices/prettyweather/widget.go +++ b/modules/weatherservices/prettyweather/widget.go @@ -55,7 +55,7 @@ func (widget *Widget) prettyWeather() { return } - defer response.Body.Close() + defer func() { _ = response.Body.Close() }() contents, err := ioutil.ReadAll(response.Body) if err != nil { diff --git a/modules/zendesk/client.go b/modules/zendesk/client.go index 1541e04d7..a149d6f35 100644 --- a/modules/zendesk/client.go +++ b/modules/zendesk/client.go @@ -36,8 +36,7 @@ func (widget *Widget) api(meth string, path string, params string) (*Resource, e if err != nil { return nil, err } - - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() data, err := ioutil.ReadAll(resp.Body) if err != nil { diff --git a/modules/zendesk/tickets.go b/modules/zendesk/tickets.go index 6bc3bbfa4..007209815 100644 --- a/modules/zendesk/tickets.go +++ b/modules/zendesk/tickets.go @@ -55,12 +55,16 @@ func (widget *Widget) listTickets(pag ...string) (*TicketArray, error) { } else { path = pag[0] } + resource, err := widget.api("GET", path, "") if err != nil { return nil, err } - json.Unmarshal([]byte(resource.Raw), TicketStruct) + err = json.Unmarshal([]byte(resource.Raw), TicketStruct) + if err != nil { + return nil, err + } return TicketStruct, err diff --git a/utils/utils.go b/utils/utils.go index 9fc0a07fe..953d9c1d8 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -92,26 +92,37 @@ func OpenFile(path string) { if (strings.HasPrefix(path, "http://")) || (strings.HasPrefix(path, "https://")) { if len(OpenUrlUtil) > 0 { commands := append(OpenUrlUtil, path) - exec.Command(commands[0], commands[1:]...).Start() + cmd := exec.Command(commands[0], commands[1:]...) + err := cmd.Start() + if err != nil { + return + } return } + var cmd *exec.Cmd switch runtime.GOOS { case "linux": - exec.Command("xdg-open", path).Start() + cmd = exec.Command("xdg-open", path) case "windows": - exec.Command("rundll32", "url.dll,FileProtocolHandler", path).Start() + cmd = exec.Command("rundll32", "url.dll,FileProtocolHandler", path) case "darwin": - exec.Command("open", path).Start() + cmd = exec.Command("open", path) default: // for the BSDs - exec.Command("xdg-open", path).Start() + cmd = exec.Command("xdg-open", path) } - } else { - filePath, _ := ExpandHomeDir(path) - cmd := exec.Command(OpenFileUtil, filePath) - ExecuteCommand(cmd) + + err := cmd.Start() + if err != nil { + return + } + return } + + filePath, _ := ExpandHomeDir(path) + cmd := exec.Command(OpenFileUtil, filePath) + ExecuteCommand(cmd) } // ReadFileBytes reads the contents of a file and returns those contents as a slice of bytes diff --git a/vendor/github.com/google/go-github/v26/github/github.go b/vendor/github.com/google/go-github/v26/github/github.go index 7a82677c4..c1769b8b6 100644 --- a/vendor/github.com/google/go-github/v26/github/github.go +++ b/vendor/github.com/google/go-github/v26/github/github.go @@ -527,7 +527,7 @@ func (c *Client) Do(ctx context.Context, req *http.Request, v interface{}) (*Res return nil, err } - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() response := newResponse(resp) diff --git a/vendor/github.com/gophercloud/gophercloud/pagination/http.go b/vendor/github.com/gophercloud/gophercloud/pagination/http.go index 757295c42..4d0a958ba 100644 --- a/vendor/github.com/gophercloud/gophercloud/pagination/http.go +++ b/vendor/github.com/gophercloud/gophercloud/pagination/http.go @@ -21,7 +21,8 @@ type PageResult struct { func PageResultFrom(resp *http.Response) (PageResult, error) { var parsedBody interface{} - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() + rawBody, err := ioutil.ReadAll(resp.Body) if err != nil { return PageResult{}, err