diff --git a/gosuv.go b/gosuv.go index 1361291..f5fdb6f 100644 --- a/gosuv.go +++ b/gosuv.go @@ -47,6 +47,16 @@ func equinoxUpdate(channel string) error { return err } + fmt.Println("New version available!") + fmt.Println("Version:", resp.ReleaseVersion) + fmt.Println("Name:", resp.ReleaseTitle) + fmt.Println("Details:", resp.ReleaseDescription) + fmt.Printf("Would you like to update [y/n]? ") + + if !askForConfirmation() { + return nil + } + //fmt.Printf("New version available: %s downloading ... \n", resp.ReleaseVersion) // fetch the update and apply it err = resp.Apply() if err != nil { diff --git a/utils.go b/utils.go index d88acc7..4c61195 100644 --- a/utils.go +++ b/utils.go @@ -2,6 +2,7 @@ package main import ( "errors" + "fmt" "os" "runtime" "time" @@ -49,3 +50,44 @@ func UserHomeDir() string { } return os.Getenv("HOME") } + +// askForConfirmation uses Scanln to parse user input. A user must type in "yes" or "no" and +// then press enter. It has fuzzy matching, so "y", "Y", "yes", "YES", and "Yes" all count as +// confirmations. If the input is not recognized, it will ask again. The function does not return +// until it gets a valid response from the user. Typically, you should use fmt to print out a question +// before calling askForConfirmation. E.g. fmt.Println("WARNING: Are you sure? (yes/no)") +func askForConfirmation() bool { + var response string + _, err := fmt.Scanln(&response) + if err != nil { + log.Fatal(err) + } + okayResponses := []string{"y", "Y", "yes", "Yes", "YES"} + nokayResponses := []string{"n", "N", "no", "No", "NO"} + if containsString(okayResponses, response) { + return true + } else if containsString(nokayResponses, response) { + return false + } else { + fmt.Println("Please type yes or no and then press enter:") + return askForConfirmation() + } +} + +// You might want to put the following two functions in a separate utility package. + +// posString returns the first index of element in slice. +// If slice does not contain element, returns -1. +func posString(slice []string, element string) int { + for index, elem := range slice { + if elem == element { + return index + } + } + return -1 +} + +// containsString returns true iff slice contains element +func containsString(slice []string, element string) bool { + return !(posString(slice, element) == -1) +}