Repository: incubator-mynewt-newt Updated Branches: refs/heads/master da27d98ee -> 24a7b8beb
MYNEWT-583; newt - allow use of specific tag/repository revision. Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/commit/26b618f3 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/tree/26b618f3 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/diff/26b618f3 Branch: refs/heads/master Commit: 26b618f3df44c01a721ec59df3120f1ed758e06e Parents: da27d98 Author: Marko Kiiskila <[email protected]> Authored: Thu Mar 23 20:29:52 2017 -0700 Committer: Christopher Collins <[email protected]> Committed: Mon May 15 13:26:36 2017 -0700 ---------------------------------------------------------------------- newt/interfaces/interfaces.go | 1 + newt/project/projectstate.go | 7 +++- newt/repo/repo.go | 85 ++++++++++++++++++++++++++++++++++++-- newt/repo/version.go | 31 +++++++++++++- 4 files changed, 119 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/26b618f3/newt/interfaces/interfaces.go ---------------------------------------------------------------------- diff --git a/newt/interfaces/interfaces.go b/newt/interfaces/interfaces.go index c12b58b..12826d0 100644 --- a/newt/interfaces/interfaces.go +++ b/newt/interfaces/interfaces.go @@ -48,6 +48,7 @@ type VersionInterface interface { Minor() int64 Revision() int64 Stability() string + Tag() string String() string } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/26b618f3/newt/project/projectstate.go ---------------------------------------------------------------------- diff --git a/newt/project/projectstate.go b/newt/project/projectstate.go index 2c14359..0e0cc3b 100644 --- a/newt/project/projectstate.go +++ b/newt/project/projectstate.go @@ -57,7 +57,12 @@ func (ps *ProjectState) Save() error { defer file.Close() for k, v := range ps.installedRepos { - str := fmt.Sprintf("%s,%d.%d.%d\n", k, v.Major(), v.Minor(), v.Revision()) + str := "" + if v.Tag() == "" { + str = fmt.Sprintf("%s,%d.%d.%d\n", k, v.Major(), v.Minor(), v.Revision()) + } else { + str = fmt.Sprintf("%s,%s-tag\n", k, v.Tag()) + } file.WriteString(str) } http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/26b618f3/newt/repo/repo.go ---------------------------------------------------------------------- diff --git a/newt/repo/repo.go b/newt/repo/repo.go index e058466..3a6e1de 100644 --- a/newt/repo/repo.go +++ b/newt/repo/repo.go @@ -20,10 +20,12 @@ package repo import ( + "bufio" "fmt" "io/ioutil" "os" "path/filepath" + "strconv" "strings" "time" @@ -68,6 +70,20 @@ type RepoDependency struct { Storerepo *Repo } +func (rd *RepoDependency) String() string { + rstr := "<" + + for idx, vr := range rd.versreq { + if idx != 0 { + rstr = rstr + " " + vr.Version().String() + } else { + rstr = rstr + vr.Version().String() + } + } + rstr = rstr + ">" + return rstr +} + func (r *Repo) Deps() []*RepoDependency { return r.deps } @@ -157,6 +173,32 @@ func NewRepoDependency(rname string, verstr string) (*RepoDependency, error) { return rd, nil } +func pickVersion(repo *Repo, versions []*Version) ([]*Version, error) { + fmt.Printf("Dependency list for %s contains a specific commit tag, " + + "so normal version number/stability comparison cannot be done.\n", + repo.Name()) + fmt.Printf("If the following list does not contain the requirement to use, "+ + "then modify your project.yml so that it does.\n") + for { + for i, vers := range versions { + fmt.Printf(" %d) %s\n", i, vers) + } + fmt.Printf("Pick the index of a version to use from above list: ") + line, _, err := bufio.NewReader(os.Stdin).ReadLine() + if err != nil { + return nil, util.NewNewtError(fmt.Sprintf("Couldn't read "+ + "response: %s", err.Error())) + } + idx, err := strconv.ParseUint(string(line), 10, 8) + if err != nil { + fmt.Printf("Error: could not parse the response.\n") + } else { + repo.versreq, err = LoadVersionMatches(versions[idx].String()) + return []*Version{versions[idx]}, nil + } + } +} + func CheckDeps(upgrade bool, checkRepos map[string]*Repo) error { // For each dependency, get it's version depArray := map[string][]*Version{} @@ -181,6 +223,27 @@ func CheckDeps(upgrade bool, checkRepos map[string]*Repo) error { } for repoName, depVersList := range depArray { + if len(depVersList) <= 1 { + continue + } + + pickVer := false + for _, depVers := range depVersList { + if depVers.Tag() != "" { + pickVer = true + break + } + } + if pickVer { + newArray, err := pickVersion(checkRepos[repoName], + depArray[repoName]) + depArray[repoName] = newArray + if err != nil { + return err + } + } + } + for repoName, depVersList := range depArray { for _, depVers := range depVersList { for _, curVers := range depVersList { if depVers.CompareVersions(depVers, curVers) != 0 || @@ -208,8 +271,9 @@ func (rd *RepoDesc) MatchVersion(searchVers *Version) (string, *Version, bool) { } func (rd *RepoDesc) Match(r *Repo) (string, *Version, bool) { + log.Debugf("Requires repository version %s for %s\n", r.VersionRequirements(), + r.Name()) for vers, branch := range rd.vers { - log.Debugf("Repository version requires for %s are %s\n", r.Name(), r.VersionRequirements()) if vers.SatisfiesVersion(r.VersionRequirements()) { log.Debugf("Found matching version %s for repo %s", vers.String(), r.Name()) @@ -234,9 +298,24 @@ func (rd *RepoDesc) Match(r *Repo) (string, *Version, bool) { } return branch, vers, true + } else { + log.Debugf("Rejected version %s for repo %s", + vers.String(), r.Name()) } } + /* + * No match so far. See if requirements have a repository tag directly. + * If so, then return that as the branch. + */ + for _, versreq := range r.VersionRequirements() { + tag := versreq.Version().Tag() + if tag != "" { + log.Debugf("Requirements for %s have a tag option %s\n", + r.Name(), tag) + return tag, NewTag(tag), true + } + } return "", nil, false } @@ -442,8 +521,8 @@ func (r *Repo) Install(force bool) (*Version, error) { branchName, vers, found := r.rdesc.Match(r) if !found { - return nil, util.NewNewtError(fmt.Sprintf("No repository matching description %s found", - r.rdesc.String())) + return nil, util.NewNewtError(fmt.Sprintf("No repository " + + "matching description %s found", r.rdesc.String())) } // if the repo is already cloned, try to cleanup and checkout the requested branch http://git-wip-us.apache.org/repos/asf/incubator-mynewt-newt/blob/26b618f3/newt/repo/version.go ---------------------------------------------------------------------- diff --git a/newt/repo/version.go b/newt/repo/version.go index bbf5b56..f09d38c 100644 --- a/newt/repo/version.go +++ b/newt/repo/version.go @@ -28,6 +28,8 @@ import ( "mynewt.apache.org/newt/newt/interfaces" "mynewt.apache.org/newt/newt/newtutil" "mynewt.apache.org/newt/util" + + log "github.com/Sirupsen/logrus" ) const VERSION_FORMAT = "%d.%d.%d-%s" @@ -37,6 +39,7 @@ const ( VERSION_STABILITY_STABLE = "stable" VERSION_STABILITY_DEV = "dev" VERSION_STABILITY_LATEST = "latest" + VERSION_STABILITY_TAG = "tag" ) type VersionMatch struct { @@ -49,6 +52,7 @@ type Version struct { minor int64 revision int64 stability string + tag string } func (vm *VersionMatch) CompareType() string { @@ -79,6 +83,10 @@ func (v *Version) Stability() string { return v.stability } +func (v *Version) Tag() string { + return v.tag +} + func (v *Version) CompareVersions(vers1 interfaces.VersionInterface, vers2 interfaces.VersionInterface) int64 { if r := vers1.Major() - vers2.Major(); r != 0 { @@ -93,6 +101,10 @@ func (v *Version) CompareVersions(vers1 interfaces.VersionInterface, return r } + if vers1.Tag() != vers2.Tag() { + return 1 + } + return 0 } @@ -102,6 +114,10 @@ func (v *Version) SatisfiesVersion(versMatches []interfaces.VersionReqInterface) } for _, match := range versMatches { + if match.Version().Tag() != "" && match.CompareType() != "==" { + log.Warningf("Version comparison with a tag %s %s %s", + match.Version(), match.CompareType(), v) + } r := v.CompareVersions(match.Version(), v) switch match.CompareType() { case "<": @@ -135,6 +151,9 @@ func (v *Version) SatisfiesVersion(versMatches []interfaces.VersionReqInterface) } func (vers *Version) String() string { + if vers.tag != "" { + return fmt.Sprintf("%s-tag", vers.tag) + } return fmt.Sprintf(VERSION_FORMAT, vers.Major(), vers.Minor(), vers.Revision(), vers.Stability()) } @@ -155,6 +174,8 @@ func LoadVersion(versStr string) (*Version, error) { if len(sparts) > 1 { stability = strings.Trim(sparts[1], " ") switch stability { + case VERSION_STABILITY_TAG: + return NewTag(strings.Trim(sparts[0], " ")), nil case VERSION_STABILITY_STABLE: fallthrough case VERSION_STABILITY_DEV: @@ -165,7 +186,6 @@ func LoadVersion(versStr string) (*Version, error) { fmt.Sprintf("Unknown stability (%s) in version ", stability) + versStr) } } - parts := strings.Split(sparts[0], ".") if len(parts) > 3 { return nil, util.NewNewtError(fmt.Sprintf("Invalid version string: %s", versStr)) @@ -202,6 +222,15 @@ func NewVersion(major int64, minor int64, rev int64) *Version { vers.major = major vers.minor = minor vers.revision = rev + vers.tag = "" + + return vers +} + +func NewTag(tag string) *Version { + vers := &Version{} + vers.tag = tag + vers.stability = VERSION_STABILITY_NONE return vers }
