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
 }

Reply via email to