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 617cbec45edf773919efeb77a43ba09aa85fa3ea
Author: Christopher Collins <[email protected]>
AuthorDate: Thu Jan 16 12:23:53 2020 -0800

    Only allow one version per repo dependency
    
    Newt used to allow a repo dependency to specify multiple version using
    a comparison operator, e.g.,
    
        repository.apache-mynewt-core:
            type: git
            vers: '>=1.0.0'     # <------
            url: [email protected]:apache/mynewt-core.git
    
    This commit removes support for this functionality.  Now a repo
    dependency can only specify a single version (or commit string).
---
 newt/deprepo/deprepo.go       |  34 ++++++------
 newt/deprepo/graph.go         |  29 +++++------
 newt/deprepo/matrix.go        |   4 +-
 newt/install/install.go       |  77 +++++++++++++--------------
 newt/newtutil/repo_version.go | 117 ++----------------------------------------
 newt/project/project.go       |   9 ++--
 newt/repo/repo.go             |   6 +--
 newt/repo/version.go          |  15 +++---
 8 files changed, 87 insertions(+), 204 deletions(-)

diff --git a/newt/deprepo/deprepo.go b/newt/deprepo/deprepo.go
index e518e26..56c65ab 100644
--- a/newt/deprepo/deprepo.go
+++ b/newt/deprepo/deprepo.go
@@ -37,7 +37,7 @@ type RepoMap map[string]*repo.Repo
 type VersionMap map[string]newtutil.RepoVersion
 
 // [repo-name] => requirements-for-key-repo
-type RequirementMap map[string][]newtutil.RepoVersionReq
+type RequirementMap map[string]newtutil.RepoVersion
 
 // Indicates an inability to find an acceptable version of a particular repo.
 type Conflict struct {
@@ -113,14 +113,14 @@ func BuildDepGraph(repos RepoMap, rootReqs 
RequirementMap) (DepGraph, error) {
        dg := DepGraph{}
 
        // First, add the hard dependencies expressed in `project.yml`.
-       for repoName, verReqs := range rootReqs {
+       for repoName, verReq := range rootReqs {
                repo := repos[repoName]
-               normalizedReqs, err := repo.NormalizeVerReqs(verReqs)
+               normalizedReq, err := repo.NormalizeVerReq(verReq)
                if err != nil {
                        return nil, err
                }
 
-               if err := dg.AddRootDep(repoName, normalizedReqs); err != nil {
+               if err := dg.AddRootDep(repoName, 
[]newtutil.RepoVersion{normalizedReq}); err != nil {
                        return nil, err
                }
        }
@@ -136,7 +136,7 @@ func BuildDepGraph(repos RepoMap, rootReqs RequirementMap) 
(DepGraph, error) {
                        reqMap := RequirementMap{}
                        for _, d := range deps {
                                depRepo := repos[d.Name]
-                               verReqs, err := 
depRepo.NormalizeVerReqs(d.VerReqs)
+                               verReqs, err := 
depRepo.NormalizeVerReq(d.VerReqs)
                                if err != nil {
                                        return nil, err
                                }
@@ -170,13 +170,13 @@ func PruneMatrix(m *Matrix, repos RepoMap, rootReqs 
RequirementMap) error {
                // Remove versions of this depended-on package that don't 
satisfy the
                // dependency's version requirements.
                r := repos[dep.Name]
-               normalizedReqs, err := r.NormalizeVerReqs(dep.VerReqs)
+               normalizedReq, err := r.NormalizeVerReq(dep.VerReqs)
                if err != nil {
                        return err
                }
                filter := Filter{
                        Name: dependentName,
-                       Reqs: normalizedReqs,
+                       Req:  normalizedReq,
                }
                m.ApplyFilter(dep.Name, filter)
 
@@ -217,16 +217,14 @@ func PruneMatrix(m *Matrix, repos RepoMap, rootReqs 
RequirementMap) error {
        // which doesn't satisfy a requirement in `project.yml` is a
        // known-bad-version and can be removed.  These repos' dependencies can
        // then be pruned in turn.
-       for repoName, reqs := range rootReqs {
-               if len(reqs) > 0 {
-                       dep := &repo.RepoDependency{
-                               Name:    repoName,
-                               VerReqs: reqs,
-                       }
+       for repoName, req := range rootReqs {
+               dep := &repo.RepoDependency{
+                       Name:    repoName,
+                       VerReqs: req,
+               }
 
-                       if err := recurse("project.yml", dep); err != nil {
-                               return err
-                       }
+               if err := recurse("project.yml", dep); err != nil {
+                       return err
                }
        }
 
@@ -271,7 +269,7 @@ func ConflictError(conflicts []Conflict) error {
                lines := []string{}
                for _, f := range c.Filters {
                        lines = append(lines, fmt.Sprintf("\n    %30s requires 
%s %s",
-                               f.Name, c.RepoName, 
newtutil.RepoVerReqsString(f.Reqs)))
+                               f.Name, c.RepoName, f.Req.String()))
                }
                sort.Strings(lines)
                s += strings.Join(lines, "")
@@ -368,7 +366,7 @@ func FindAcceptableVersions(m Matrix, dg DepGraph) 
(VersionMap, []Conflict) {
                        if filterName != "" {
                                conflict.Filters = append(conflict.Filters, 
Filter{
                                        Name: filterName,
-                                       Reqs: node.VerReqs,
+                                       Req:  node.VerReq,
                                })
                        }
                }
diff --git a/newt/deprepo/graph.go b/newt/deprepo/graph.go
index 557b2ce..676b9dd 100644
--- a/newt/deprepo/graph.go
+++ b/newt/deprepo/graph.go
@@ -52,7 +52,7 @@ type DepGraphNode struct {
        // Name of depended-on repo.
        Name string
        // Expresses the versions of the repo that satisfy this dependency.
-       VerReqs []newtutil.RepoVersionReq
+       VerReq newtutil.RepoVersion
 }
 
 // A repo dependency graph.
@@ -67,7 +67,7 @@ type RevdepGraphNode struct {
        // The version of the dependent repo.
        Ver newtutil.RepoVersion
        // The dependent's version requirements that apply to the graph key.
-       VerReqs []newtutil.RepoVersionReq
+       VerReq newtutil.RepoVersion
 }
 
 // A repo reverse dependency graph.
@@ -88,8 +88,7 @@ func (dep *Dependent) String() string {
 }
 
 func (dgn *DepGraphNode) String() string {
-       return fmt.Sprintf("%s,%s", dgn.Name,
-               newtutil.RepoVerReqsString(dgn.VerReqs))
+       return fmt.Sprintf("%s,%s", dgn.Name, dgn.VerReq.String())
 }
 
 func (dg DepGraph) String() string {
@@ -110,7 +109,7 @@ func (dg DepGraph) String() string {
 
 func (rgn *RevdepGraphNode) String() string {
        return fmt.Sprintf("%s,%s", repoNameVerString(rgn.Name, rgn.Ver),
-               newtutil.RepoVerReqsString(rgn.VerReqs))
+               rgn.VerReq.String())
 }
 
 func (rg RevdepGraph) String() string {
@@ -149,10 +148,10 @@ func (dg DepGraph) AddRepoVer(repoName string, repoVer 
newtutil.RepoVersion,
                        repoName, repoVer.String())
        }
 
-       for depName, depReqs := range reqMap {
+       for depName, depReq := range reqMap {
                dg[dep] = append(dg[dep], DepGraphNode{
-                       Name:    depName,
-                       VerReqs: depReqs,
+                       Name:   depName,
+                       VerReq: depReq,
                })
        }
 
@@ -161,7 +160,7 @@ func (dg DepGraph) AddRepoVer(repoName string, repoVer 
newtutil.RepoVersion,
 
 // Adds a root dependency (i.e., required repo specified in `project.yml`).
 func (dg DepGraph) AddRootDep(repoName string,
-       verReqs []newtutil.RepoVersionReq) error {
+       verReqs []newtutil.RepoVersion) error {
 
        rootDeps := dg[rootDependent]
        for _, d := range rootDeps {
@@ -173,8 +172,8 @@ func (dg DepGraph) AddRootDep(repoName string,
        }
 
        dg[rootDependent] = append(dg[rootDependent], DepGraphNode{
-               Name:    repoName,
-               VerReqs: verReqs,
+               Name:   repoName,
+               VerReq: verReqs[0],
        })
 
        return nil
@@ -195,9 +194,9 @@ func (dg DepGraph) Reverse() RevdepGraph {
                        // Nothing depends on project.yml (""), so exclude it 
from the result.
                        if node.Name != "" {
                                rg[node.Name] = append(rg[node.Name], 
RevdepGraphNode{
-                                       Name:    dependent.Name,
-                                       Ver:     dependent.Ver,
-                                       VerReqs: node.VerReqs,
+                                       Name:   dependent.Name,
+                                       Ver:    dependent.Ver,
+                                       VerReq: node.VerReq,
                                })
                        }
                }
@@ -256,7 +255,7 @@ func (dg DepGraph) conflictingRepos(vm VersionMap) []string 
{
                                }
                        }
                        if nodeApplies {
-                               if !dependeeVer.SatisfiesAll(node.VerReqs) {
+                               if !dependeeVer.Satisfies(node.VerReq) {
                                        badRepoMap[dependeeName] = struct{}{}
                                        break
                                }
diff --git a/newt/deprepo/matrix.go b/newt/deprepo/matrix.go
index 97dc982..ca7d99a 100644
--- a/newt/deprepo/matrix.go
+++ b/newt/deprepo/matrix.go
@@ -31,7 +31,7 @@ import (
 // Eliminates non-matching version numbers when applied to a matrix row.
 type Filter struct {
        Name string
-       Reqs []newtutil.RepoVersionReq
+       Req  newtutil.RepoVersion
 }
 
 // Contains all versions of a single repo.  These version numbers are read from
@@ -150,7 +150,7 @@ func (m *Matrix) ApplyFilter(repoName string, filter 
Filter) {
 
        goodVers := []newtutil.RepoVersion{}
        for _, v := range row.Vers {
-               if v.SatisfiesAll(filter.Reqs) {
+               if v.Satisfies(filter.Req) {
                        goodVers = append(goodVers, v)
                }
        }
diff --git a/newt/install/install.go b/newt/install/install.go
index c25cfd1..4105f84 100644
--- a/newt/install/install.go
+++ b/newt/install/install.go
@@ -271,29 +271,29 @@ func (inst *Installer) ensureDepsInList(repos 
[]*repo.Repo,
 // 3. Else, assume 0.0.0.
 func (inst *Installer) inferReqVers(repos []*repo.Repo) error {
        for _, r := range repos {
-               reqs, ok := inst.reqs[r.Name()]
+               req, ok := inst.reqs[r.Name()]
                if ok {
-                       for i, req := range reqs {
-                               if req.Ver.Commit != "" {
-                                       ver, err := 
r.NonInstalledVersion(req.Ver.Commit)
-                                       if err != nil {
-                                               return err
-                                       }
+                       if req.Commit != "" {
+                               ver, err := r.NonInstalledVersion(req.Commit)
+                               if err != nil {
+                                       return err
+                               }
 
-                                       if ver == nil {
-                                               util.OneTimeWarning(
-                                                       "Could not detect 
version of requested repo "+
-                                                               "%s:%s; 
assuming 0.0.0",
-                                                       r.Name(), 
req.Ver.Commit)
+                               if ver == nil {
+                                       util.OneTimeWarning(
+                                               "Could not detect version of 
requested repo "+
+                                                       "%s:%s; assuming 0.0.0",
+                                               r.Name(), req.Commit)
 
-                                               ver = &req.Ver
-                                       }
-                                       reqs[i].Ver = *ver
-                                       reqs[i].Ver.Commit, err = 
r.HashFromVer(reqs[i].Ver)
-                                       if err != nil {
-                                               return err
-                                       }
+                                       ver = &req
                                }
+                               req = *ver
+                               req.Commit, err = r.HashFromVer(req)
+                               if err != nil {
+                                       return err
+                               }
+
+                               inst.reqs[r.Name()] = req
                        }
                }
        }
@@ -314,7 +314,7 @@ func (inst *Installer) detectIllegalRepoReqs(
 
        var lines []string
        for _, r := range repos {
-               reqs, ok := inst.reqs[r.Name()]
+               req, ok := inst.reqs[r.Name()]
                if ok {
                        row := m.FindRow(r.Name())
                        if row == nil {
@@ -323,21 +323,20 @@ func (inst *Installer) detectIllegalRepoReqs(
                        }
 
                        r := inst.repos[r.Name()]
-                       nreqs, err := r.NormalizeVerReqs(reqs)
+                       nreq, err := r.NormalizeVerReq(req)
                        if err != nil {
                                return err
                        }
 
                        anySatisfied := false
                        for _, ver := range row.Vers {
-                               if ver.SatisfiesAll(nreqs) {
+                               if ver.Satisfies(nreq) {
                                        anySatisfied = true
                                        break
                                }
                        }
                        if !anySatisfied {
-                               line := fmt.Sprintf("    %s,%s", r.Name(),
-                                       newtutil.RepoVerReqsString(nreqs))
+                               line := fmt.Sprintf("    %s,%s", r.Name(), 
nreq.String())
                                lines = append(lines, line)
                        }
                }
@@ -570,25 +569,23 @@ func (inst *Installer) versionMapRepos(
 // from `project.yml` and `repository.yml` files.  If override is false,
 // attempting to set a commit for the same repo twice results in an error.
 func (inst *Installer) assignCommits(vm deprepo.VersionMap, repoName string,
-       reqs []newtutil.RepoVersionReq, override bool) error {
+       req newtutil.RepoVersion, override bool) error {
 
-       for _, req := range reqs {
-               curVer := vm[repoName]
-               if curVer.Satisfies(req) {
-                       if req.Ver.Commit != "" {
-                               prevCommit := vm[repoName].Commit
-                               newCommit := req.Ver.Commit
+       curVer := vm[repoName]
+       if curVer.Satisfies(req) {
+               if req.Commit != "" {
+                       prevCommit := vm[repoName].Commit
+                       newCommit := req.Commit
 
-                               if !override && prevCommit != "" && prevCommit 
!= newCommit {
-                                       return util.FmtNewtError(
-                                               "repo %s: multiple commits: %s, 
%s",
-                                               repoName, vm[repoName].Commit, 
req.Ver.Commit)
+                       if !override && prevCommit != "" && prevCommit != 
newCommit {
+                               return util.FmtNewtError(
+                                       "repo %s: multiple commits: %s, %s",
+                                       repoName, vm[repoName].Commit, 
req.Commit)
 
-                               }
-                               ver := vm[repoName]
-                               ver.Commit = req.Ver.Commit
-                               vm[repoName] = ver
                        }
+                       ver := vm[repoName]
+                       ver.Commit = req.Commit
+                       vm[repoName] = ver
                }
        }
 
@@ -674,7 +671,7 @@ func (inst *Installer) calcVersionMap(candidates 
[]*repo.Repo) (
                                // assigned last so that they can override 
inter-repo
                                // dependencies.
                                if node.Name != "" {
-                                       if err := inst.assignCommits(vm, name, 
node.VerReqs, false); err != nil {
+                                       if err := inst.assignCommits(vm, name, 
node.VerReq, false); err != nil {
                                                return nil, err
                                        }
                                }
diff --git a/newt/newtutil/repo_version.go b/newt/newtutil/repo_version.go
index cc1280f..5e64b42 100644
--- a/newt/newtutil/repo_version.go
+++ b/newt/newtutil/repo_version.go
@@ -22,14 +22,11 @@ package newtutil
 import (
        "fmt"
        "math"
-       "regexp"
        "sort"
        "strconv"
        "strings"
 
        "mynewt.apache.org/newt/util"
-
-       log "github.com/sirupsen/logrus"
 )
 
 const (
@@ -48,11 +45,6 @@ const (
 // the minor and revision parts are floating.
 const VERSION_FLOATING = -1
 
-type RepoVersionReq struct {
-       CompareType string
-       Ver         RepoVersion
-}
-
 type RepoVersion struct {
        Major     int64
        Minor     int64
@@ -65,10 +57,6 @@ func (v *RepoVersion) IsNormalized() bool {
        return v.Stability == VERSION_STABILITY_NONE
 }
 
-func (vm *RepoVersionReq) String() string {
-       return vm.CompareType + vm.Ver.String()
-}
-
 func (v *RepoVersion) toComparable() RepoVersion {
        clone := *v
 
@@ -102,50 +90,9 @@ func CompareRepoVersions(v1 RepoVersion, v2 RepoVersion) 
int64 {
        return 0
 }
 
-func (v *RepoVersion) Satisfies(verReq RepoVersionReq) bool {
-       if verReq.Ver.Commit != "" && verReq.CompareType != "==" {
-               log.Warningf("RepoVersion comparison with a tag %s %s %s",
-                       verReq.Ver, verReq.CompareType, v)
-       }
-       r := CompareRepoVersions(verReq.Ver, *v)
-       switch verReq.CompareType {
-       case "<":
-               if r <= 0 {
-                       return false
-               }
-       case "<=":
-               if r < 0 {
-                       return false
-               }
-       case ">":
-               if r >= 0 {
-                       return false
-               }
-       case ">=":
-               if r > 0 {
-                       return false
-               }
-       case "==":
-               if r != 0 {
-                       return false
-               }
-       }
-
-       if verReq.Ver.Stability != v.Stability {
-               return false
-       }
-
-       return true
-}
-
-func (v *RepoVersion) SatisfiesAll(verReqs []RepoVersionReq) bool {
-       for _, r := range verReqs {
-               if !v.Satisfies(r) {
-                       return false
-               }
-       }
-
-       return true
+// XXX: Remove this
+func (v *RepoVersion) Satisfies(verReq RepoVersion) bool {
+       return CompareRepoVersions(verReq, *v) == 0
 }
 
 func (ver *RepoVersion) String() string {
@@ -240,64 +187,6 @@ func ParseRepoVersion(verStr string) (RepoVersion, error) {
        return ver, nil
 }
 
-// Parse a set of version string constraints on a dependency.
-// This function
-// The version string contains a list of version constraints in the following 
format:
-//    - <comparison><version>
-// Where <comparison> can be any one of the following comparison
-//   operators: <=, <, >, >=, ==
-// And <version> is specified in the form: X.Y.Z where X, Y and Z are all
-// int64 types in decimal form
-func ParseRepoVersionReqs(versStr string) ([]RepoVersionReq, error) {
-       var err error
-
-       verReqs := []RepoVersionReq{}
-
-       re, err := regexp.Compile(`(<=|>=|==|>|<)(.+)`)
-       if err != nil {
-               return nil, err
-       }
-
-       matches := re.FindAllStringSubmatch(versStr, -1)
-       if matches != nil {
-               for _, match := range matches {
-                       vm := RepoVersionReq{}
-                       vm.CompareType = match[1]
-                       if vm.Ver, err = ParseRepoVersion(match[2]); err != nil 
{
-                               return nil, err
-                       }
-
-                       verReqs = append(verReqs, vm)
-               }
-       } else {
-               vm := RepoVersionReq{}
-               vm.CompareType = "=="
-               if vm.Ver, err = ParseRepoVersion(versStr); err != nil {
-                       return nil, err
-               }
-
-               verReqs = append(verReqs, vm)
-       }
-
-       if len(verReqs) == 0 {
-               verReqs = nil
-       }
-
-       return verReqs, nil
-}
-
-func RepoVerReqsString(verReqs []RepoVersionReq) string {
-       s := ""
-       for i, r := range verReqs {
-               if i != 0 {
-                       s += " "
-               }
-               s += r.String()
-       }
-
-       return s
-}
-
 type verSorter struct {
        vers []RepoVersion
 }
diff --git a/newt/project/project.go b/newt/project/project.go
index bd5925c..42e4669 100644
--- a/newt/project/project.go
+++ b/newt/project/project.go
@@ -228,7 +228,8 @@ func (proj *Project) RepoIsInstalled(rname string) bool {
 }
 
 func (proj *Project) RepoIsRoot(rname string) bool {
-       return proj.rootRepoReqs[rname] != nil
+       _, ok := proj.rootRepoReqs[rname]
+       return ok == true
 }
 
 func (proj *Project) LocalRepo() *repo.Repo {
@@ -549,7 +550,7 @@ func (proj *Project) loadConfig() error {
                                        return err
                                }
                        }
-                       verReqs, err := 
newtutil.ParseRepoVersionReqs(fields["vers"])
+                       verReq, err := newtutil.ParseRepoVersion(fields["vers"])
                        if err != nil {
                                return util.FmtNewtError(
                                        "Repo \"%s\" contains invalid version 
requirement: "+
@@ -560,7 +561,7 @@ func (proj *Project) loadConfig() error {
                        if err := proj.addRepo(r); err != nil {
                                return err
                        }
-                       proj.rootRepoReqs[repoName] = verReqs
+                       proj.rootRepoReqs[repoName] = verReq
                }
        }
 
@@ -609,7 +610,7 @@ func (proj *Project) Init(dir string) error {
        interfaces.SetProject(proj)
 
        proj.repos = map[string]*repo.Repo{}
-       proj.rootRepoReqs = map[string][]newtutil.RepoVersionReq{}
+       proj.rootRepoReqs = map[string]newtutil.RepoVersion{}
 
        // Load Project configuration
        if err := proj.loadConfig(); err != nil {
diff --git a/newt/repo/repo.go b/newt/repo/repo.go
index 6aedd56..075e0bf 100644
--- a/newt/repo/repo.go
+++ b/newt/repo/repo.go
@@ -67,7 +67,7 @@ type Repo struct {
 
 type RepoDependency struct {
        Name    string
-       VerReqs []newtutil.RepoVersionReq
+       VerReqs newtutil.RepoVersion
        Fields  map[string]string
 }
 
@@ -433,7 +433,7 @@ func parseRepoDepMap(depName string,
        }
 
        for commit, verReqsStr := range versMap {
-               verReqs, err := newtutil.ParseRepoVersionReqs(verReqsStr)
+               verReq, err := newtutil.ParseRepoVersion(verReqsStr)
                if err != nil {
                        return nil, util.FmtNewtError("invalid version string: 
%s: %s",
                                verReqsStr, err.Error())
@@ -441,7 +441,7 @@ func parseRepoDepMap(depName string,
 
                result[commit] = &RepoDependency{
                        Name:    depName,
-                       VerReqs: verReqs,
+                       VerReqs: verReq,
                        Fields:  fields,
                }
        }
diff --git a/newt/repo/version.go b/newt/repo/version.go
index e5a935c..561477e 100644
--- a/newt/repo/version.go
+++ b/newt/repo/version.go
@@ -257,23 +257,22 @@ func (r *Repo) NormalizeVersion(
 }
 
 // Normalizes the version component of a version requirement.
-func (r *Repo) NormalizeVerReq(verReq newtutil.RepoVersionReq) (
-       newtutil.RepoVersionReq, error) {
+func (r *Repo) NormalizeVerReq(verReq newtutil.RepoVersion) (
+       newtutil.RepoVersion, error) {
 
-       ver, err := r.NormalizeVersion(verReq.Ver)
+       ver, err := r.NormalizeVersion(verReq)
        if err != nil {
                return verReq, err
        }
 
-       verReq.Ver = ver
-       return verReq, nil
+       return ver, nil
 }
 
 // Normalizes the version component of each specified version requirement.
-func (r *Repo) NormalizeVerReqs(verReqs []newtutil.RepoVersionReq) (
-       []newtutil.RepoVersionReq, error) {
+func (r *Repo) NormalizeVerReqs(verReqs []newtutil.RepoVersion) (
+       []newtutil.RepoVersion, error) {
 
-       result := make([]newtutil.RepoVersionReq, len(verReqs))
+       result := make([]newtutil.RepoVersion, len(verReqs))
        for i, verReq := range verReqs {
                n, err := r.NormalizeVerReq(verReq)
                if err != nil {

Reply via email to