diff --git a/main.go b/main.go index c9959df68..7481e24d6 100644 --- a/main.go +++ b/main.go @@ -52,6 +52,9 @@ func main() { } if err != nil { + if errorMessage, known := app.KnownError(err); known { + log.Fatal(errorMessage) + } newErr := errors.Wrap(err, 0) stackTrace := newErr.ErrorStack() app.Log.Error(stackTrace) diff --git a/pkg/app/app.go b/pkg/app/app.go index 85caa446d..b364936ae 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -33,6 +33,11 @@ type App struct { ClientContext string } +type errorMapping struct { + originalError string + newError string +} + func newProductionLogger(config config.AppConfigurer) *logrus.Logger { log := logrus.New() log.Out = ioutil.Discard @@ -158,7 +163,8 @@ func (app *App) Run() error { os.Exit(0) } - return app.Gui.RunWithSubprocesses() + err := app.Gui.RunWithSubprocesses() + return err } // Rebase contains logic for when we've been run in demon mode, meaning we've @@ -192,3 +198,22 @@ func (app *App) Close() error { } return nil } + +// KnownError takes an error and tells us whether it's an error that we know about where we can print a nicely formatted version of it rather than panicking with a stack trace +func (app *App) KnownError(err error) (string, bool) { + errorMessage := err.Error() + + mappings := []errorMapping{ + { + originalError: "fatal: not a git repository (or any of the parent directories): .git", + newError: app.Tr.SLocalize("notARepository"), + }, + } + + for _, mapping := range mappings { + if strings.Contains(errorMessage, mapping.originalError) { + return mapping.newError, true + } + } + return "", false +} diff --git a/pkg/i18n/dutch.go b/pkg/i18n/dutch.go index d736e2771..7d93b051c 100644 --- a/pkg/i18n/dutch.go +++ b/pkg/i18n/dutch.go @@ -748,6 +748,9 @@ func addDutch(i18nObject *i18n.Bundle) error { }, &i18n.Message{ ID: "stashOptions", Other: "Stash options", + }, &i18n.Message{ + ID: "notARepository", + Other: "Error: must be run inside a repository", }, ) } diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 82ba1b505..50a6e30a6 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -771,6 +771,9 @@ func addEnglish(i18nObject *i18n.Bundle) error { }, &i18n.Message{ ID: "stashOptions", Other: "Stash options", + }, &i18n.Message{ + ID: "notARepository", + Other: "Error: must be run inside a repository", }, ) } diff --git a/pkg/i18n/polish.go b/pkg/i18n/polish.go index bd5fed9d5..7b32b3eaa 100644 --- a/pkg/i18n/polish.go +++ b/pkg/i18n/polish.go @@ -731,6 +731,9 @@ func addPolish(i18nObject *i18n.Bundle) error { }, &i18n.Message{ ID: "stashOptions", Other: "Stash options", + }, &i18n.Message{ + ID: "notARepository", + Other: "Error: must be run inside a repository", }, ) }