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 {
