newt upgrade: Fix Repo Commit Checkout
Checking out various repositories to a particular set of commit versions
is broken. Fix this by looking at the dependency graph's node's
required versions.
Example Usage in repository.yml
```
repo.versions:
"0.0.0" : "master"
"1.0.0" : "release_1_0_0"
repo.deps:
apache-mynewt-core:
type: git
url: git@github.com:apache/mynewt-core.git
vers:
master: 0-dev
release_1_0_0: 'f3d0ff2ab8db0da99f6b35938caf25c36950e181-commit'
apache-mynewt-nimble:
type: git
url: git@github.com:apache/mynewt-nimble.git
vers:
master: 0-dev
release_1_0_0: '7624744d90c159b8c9ab0bf3d890b0c3a3c43928-commit'
```
Note that the version specifier (such as `release_1_0_0`) can be a tag.
The project that houses this repository.yml gets checked out to
`release_1_0_0` and the dependencies get checked out to the versions
specified as shown above.
Signed-off-by: Naveen Kaje <naveen.kaje@juul.com>
diff --git a/newt/install/install.go b/newt/install/install.go
index 9d25b27..b71a265 100644
--- a/newt/install/install.go
+++ b/newt/install/install.go
@@ -646,18 +646,29 @@
return nil, deprepo.ConflictError(conflicts)
}
- // If project.yml specified any specific git commits, ensure we get them.
+ // Check all repo dependencies for specified git commits, ensure we get them.
+ rg := dg.Reverse()
for name, ver := range vm {
- reqs := inst.reqs[name]
- if len(reqs) > 0 {
- keep, err := inst.shouldKeepCommit(name, reqs[0].Ver.Commit)
- if err != nil {
- return nil, err
+ for _, node := range rg[name] {
+ if len(node.VerReqs) > 0 {
+ for _, vreq := range node.VerReqs {
+ if vreq.Ver.Commit != "" {
+ keep, err := inst.shouldKeepCommit(name, vreq.Ver.Commit)
+ if err != nil {
+ return nil, err
+ }
+ if keep {
+ if ver.Commit == "" {
+ ver.Commit = vreq.Ver.Commit
+ } else {
+ return nil, util.FmtNewtError("repo %s: multiple commits %s and %s",
+ name, ver.Commit, vreq.Ver.Commit)
+ }
+ }
+ vm[name] = ver
+ }
+ }
}
- if keep {
- ver.Commit = reqs[0].Ver.Commit
- }
- vm[name] = ver
}
}