You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2019/12/18 00:04:47 UTC

[mynewt-newt] 05/05: resolve: Only print valid YCfg parse warnings

This is an automated email from the ASF dual-hosted git repository.

ccollins pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-newt.git

commit c52fc7cafc62df75e5a016534f498b1a7c9c72e2
Author: Christopher Collins <cc...@apache.org>
AuthorDate: Thu Nov 7 11:38:39 2019 -0800

    resolve: Only print valid YCfg parse warnings
    
    During dependency resolution retain YCfg parse warnings and only print
    them after resolution is complete.  Clear the previous cycle's warnings
    each time a new cycle starts.  After resolution has completed, print the
    retained warnings.  In this way, none of the printed warnings
    are spurious because they were reported during the final iteration.
    
    See <https://github.com/apache/mynewt-newt/pull/350> for more
    information.
---
 newt/resolve/expr.go    | 24 +++++++++++++++---------
 newt/resolve/resolve.go | 47 +++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 56 insertions(+), 15 deletions(-)

diff --git a/newt/resolve/expr.go b/newt/resolve/expr.go
index 71b282b..533902f 100644
--- a/newt/resolve/expr.go
+++ b/newt/resolve/expr.go
@@ -28,18 +28,24 @@ import (
 
 func getExprMapStringSlice(
 	yc ycfg.YCfg, key string, settings map[string]string) (
-	map[*parse.Node][]string, error) {
+	map[*parse.Node][]string, string, error) {
+
+	var warning string
+
+	entries, getErr := yc.GetSlice(key, settings)
+	if getErr != nil {
+		warning = getErr.Error()
+	}
 
-	entries, _ := yc.GetSlice(key, settings)
 	if len(entries) == 0 {
-		return nil, nil
+		return nil, warning, nil
 	}
 
 	m := make(map[*parse.Node][]string, len(entries))
 	for _, e := range entries {
 		slice, err := cast.ToStringSliceE(e.Value)
 		if err != nil {
-			return nil, util.FmtNewtError(
+			return nil, warning, util.FmtNewtError(
 				"ycfg node \"%s\" contains unexpected type; "+
 					"have=%T want=[]string", e.Value)
 		}
@@ -47,7 +53,7 @@ func getExprMapStringSlice(
 		m[e.Expr] = append(m[e.Expr], slice...)
 	}
 
-	return m, nil
+	return m, warning, nil
 }
 
 func revExprMapStringSlice(
@@ -65,11 +71,11 @@ func revExprMapStringSlice(
 }
 
 func readExprMap(yc ycfg.YCfg, key string, settings map[string]string) (
-	parse.ExprMap, error) {
+	parse.ExprMap, string, error) {
 
-	ems, err := getExprMapStringSlice(yc, key, settings)
+	ems, warning, err := getExprMapStringSlice(yc, key, settings)
 	if err != nil {
-		return nil, err
+		return nil, warning, err
 	}
 
 	em := parse.ExprMap{}
@@ -83,5 +89,5 @@ func readExprMap(yc ycfg.YCfg, key string, settings map[string]string) (
 		em[v] = sub
 	}
 
-	return em, nil
+	return em, warning, nil
 }
diff --git a/newt/resolve/resolve.go b/newt/resolve/resolve.go
index 11495ef..ce058a4 100644
--- a/newt/resolve/resolve.go
+++ b/newt/resolve/resolve.go
@@ -74,6 +74,8 @@ type Resolver struct {
 
 	// [api-name][api-supplier]
 	apiConflicts map[string]map[*ResolvePackage]struct{}
+
+	parseWarnings map[*ResolvePackage][]string
 }
 
 type ResolveDep struct {
@@ -129,6 +131,7 @@ type Resolution struct {
 	ApiMap          map[string]*ResolvePackage
 	UnsatisfiedApis map[string][]*ResolvePackage
 	ApiConflicts    []ApiConflict
+	ParseWarnings   []string
 
 	LpkgRpkgMap map[*pkg.LocalPackage]*ResolvePackage
 
@@ -152,6 +155,7 @@ func newResolver(
 		flashMap:         flashMap,
 		cfg:              syscfg.NewCfg(),
 		apiConflicts:     map[string]map[*ResolvePackage]struct{}{},
+		parseWarnings:    map[*ResolvePackage][]string{},
 	}
 
 	if injectedSettings == nil {
@@ -330,10 +334,13 @@ func (r *Resolver) sortedRpkgs() []*ResolvePackage {
 func (r *Resolver) fillApisFor(rpkg *ResolvePackage) error {
 	settings := r.cfg.AllSettingsForLpkg(rpkg.Lpkg)
 
-	em, err := readExprMap(rpkg.Lpkg.PkgY, "pkg.apis", settings)
+	em, warn, err := readExprMap(rpkg.Lpkg.PkgY, "pkg.apis", settings)
 	if err != nil {
 		return err
 	}
+	if warn != "" {
+		r.parseWarnings[rpkg] = append(r.parseWarnings[rpkg], warn)
+	}
 
 	rpkg.Apis = em
 	return nil
@@ -384,10 +391,13 @@ func (r *Resolver) selectApiSuppliers() {
 func (r *Resolver) calcApiReqsFor(rpkg *ResolvePackage) error {
 	settings := r.cfg.AllSettingsForLpkg(rpkg.Lpkg)
 
-	em, err := readExprMap(rpkg.Lpkg.PkgY, "pkg.req_apis", settings)
+	em, warn, err := readExprMap(rpkg.Lpkg.PkgY, "pkg.req_apis", settings)
 	if err != nil {
 		return err
 	}
+	if warn != "" {
+		r.parseWarnings[rpkg] = append(r.parseWarnings[rpkg], warn)
+	}
 
 	for api, es := range em {
 		rpkg.reqApiMap[api] = resolveReqApi{
@@ -459,22 +469,31 @@ func (r *Resolver) deletePkg(rpkg *ResolvePackage) error {
 //                                  in this case.
 //         error                non-nil on failure.
 func (r *Resolver) loadDepsForPkg(rpkg *ResolvePackage) (bool, error) {
+	// Clear warnings from previous run.
+	if _, ok := r.parseWarnings[rpkg]; ok {
+		delete(r.parseWarnings, rpkg)
+	}
+
 	settings := r.cfg.AllSettingsForLpkg(rpkg.Lpkg)
 
 	changed := false
 
 	var depEm map[*parse.Node][]string
+	var warn string
 	var err error
 
 	if rpkg.Lpkg.Type() == pkg.PACKAGE_TYPE_TRANSIENT {
-		depEm, err = getExprMapStringSlice(rpkg.Lpkg.PkgY, "pkg.link", nil)
+		depEm, warn, err = getExprMapStringSlice(rpkg.Lpkg.PkgY, "pkg.link", nil)
 	} else {
-		depEm, err = getExprMapStringSlice(rpkg.Lpkg.PkgY, "pkg.deps",
+		depEm, warn, err = getExprMapStringSlice(rpkg.Lpkg.PkgY, "pkg.deps",
 			settings)
 	}
 	if err != nil {
 		return false, err
 	}
+	if warn != "" {
+		r.parseWarnings[rpkg] = append(r.parseWarnings[rpkg], warn)
+	}
 
 	depender := rpkg.Lpkg.Name()
 
@@ -1112,6 +1131,17 @@ func ResolveFull(
 	res.PreLinkCmdCfg = r.preLinkCmdCfg
 	res.PostLinkCmdCfg = r.postLinkCmdCfg
 
+	warnMap := map[string]struct{}{}
+	for _, lines := range r.parseWarnings {
+		for _, line := range lines {
+			warnMap[line] = struct{}{}
+		}
+	}
+	for w, _ := range warnMap {
+		res.ParseWarnings = append(res.ParseWarnings, w)
+	}
+	sort.Strings(res.ParseWarnings)
+
 	// Determine which package satisfies each API and which APIs are
 	// unsatisfied.
 	res.ApiMap, res.UnsatisfiedApis = r.apiResolution()
@@ -1131,8 +1161,13 @@ func ResolveFull(
 
 	res.MasterSet.Rpkgs = r.rpkgSlice()
 
-	// We have now resolved all packages so go through them and emit warning
-	// when using link packages
+	// We have now resolved all packages.  Emit all warnings.
+	for _, warn := range res.ParseWarnings {
+		lines := strings.Split(warn, "\n")
+		for _, line := range lines {
+			util.OneTimeWarning("%s", line)
+		}
+	}
 	for _, rpkg := range res.MasterSet.Rpkgs {
 		LogTransientWarning(rpkg.Lpkg)
 	}