diff --git a/pkg/recipe/recipe.go b/pkg/recipe/recipe.go index c5067ece..1042d042 100644 --- a/pkg/recipe/recipe.go +++ b/pkg/recipe/recipe.go @@ -2,6 +2,7 @@ package recipe import ( "encoding/json" + "errors" "fmt" "io/ioutil" "os" @@ -665,13 +666,21 @@ func CheckoutDefaultBranch(repo *git.Repository, recipeName string) (plumbing.Re return branch, nil } +type CatalogueOfflineError struct { + msg string +} + +func (e *CatalogueOfflineError) Error() string { + return fmt.Sprintf("catalogue offline: %s", e.msg) +} + // recipeCatalogueFSIsLatest checks whether the recipe catalogue stored locally // is up to date. func recipeCatalogueFSIsLatest() (bool, error) { httpClient := web.NewHTTPRetryClient() res, err := httpClient.Head(RecipeCatalogueURL) if err != nil { - return false, err + return false, &CatalogueOfflineError{err.Error()} } lastModified := res.Header["Last-Modified"][0] @@ -712,17 +721,21 @@ func ReadRecipeCatalogue() (RecipeCatalogue, error) { recipeFSIsLatest, err := recipeCatalogueFSIsLatest() if err != nil { - logrus.Error(err) - logrus.Error("failed to access last recipe catalogue") + var offlineErr *CatalogueOfflineError + if errors.As(err, &offlineErr) { + logrus.Error(err) + logrus.Error("unable to retrieve catalogue from internet, using local copy.") + recipeFSIsLatest = true + } else { + return nil, err + } } if !recipeFSIsLatest { if err := readRecipeCatalogueWeb(&recipes); err != nil { - logrus.Error(err) - logrus.Error("failed to access web recipe catalogue") - } else { - return recipes, nil + return nil, err } + return recipes, nil } if err := readRecipeCatalogueFS(&recipes); err != nil {