diff --git a/pkg/recipe/recipe.go b/pkg/recipe/recipe.go index 57f840fb..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,7 +721,14 @@ func ReadRecipeCatalogue() (RecipeCatalogue, error) { recipeFSIsLatest, err := recipeCatalogueFSIsLatest() if err != nil { - return nil, err + 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 {