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)
}