Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Never prune seed packages from build #295

Merged
merged 3 commits into from
May 2, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 0 additions & 3 deletions newt/builder/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,6 @@ func NewBuilder(
for api, rpkg := range apiMap {
bpkg := b.PkgMap[rpkg]
if bpkg == nil {
for _, rpkg := range b.SortedRpkgs() {
log.Debugf(" * %s", rpkg.Lpkg.Name())
}
return nil, util.FmtNewtError(
"Unexpected unsatisfied API: %s; required by: %s", api,
rpkg.Lpkg.Name())
Expand Down
46 changes: 44 additions & 2 deletions newt/resolve/resolve.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,25 @@ func NewResolvePkg(lpkg *pkg.LocalPackage) *ResolvePackage {
}
}

// useMasterPkgs replaces a resolve set's packages with their equivalents from
// the master set. This function is necessary to ensure only a single copy of
// each package exists among all resolve sets in a split build.
func (rs *ResolveSet) useMasterPkgs() error {
for i, rdst := range rs.Rpkgs {
rsrc := rs.Res.LpkgRpkgMap[rdst.Lpkg]
if rsrc == nil {
return util.FmtNewtError(
"cannot use master packages in resolve set; "+
"package \"%s\" missing",
rdst.Lpkg.FullName())
}

rs.Rpkgs[i] = rsrc
}

return nil
}

func (r *Resolver) resolveDep(dep *pkg.Dependency,
depender string) (*pkg.LocalPackage, error) {

Expand Down Expand Up @@ -387,6 +406,16 @@ func (r *Resolver) calcApiReqs() error {
// Completely removes a package from the resolver. This is used to prune
// packages when newly-discovered syscfg values nullify dependencies.
func (r *Resolver) deletePkg(rpkg *ResolvePackage) error {
i := 0
for i < len(r.seedPkgs) {
lpkg := r.seedPkgs[i]
if lpkg == rpkg.Lpkg {
fmt.Printf("DELETING SEED: %s (%p)\n", lpkg.FullName(), lpkg)
r.seedPkgs = append(r.seedPkgs[:i], r.seedPkgs[i+1:]...)
} else {
i++
}
}
delete(r.pkgMap, rpkg.Lpkg)

// Delete the package from syscfg.
Expand Down Expand Up @@ -727,9 +756,16 @@ func (r *Resolver) pruneImposters() (bool, error) {
errCh := make(chan error, newtutil.NewtNumJobs)
defer close(errCh)

seedMap := map[*pkg.LocalPackage]struct{}{}
for _, lpkg := range r.seedPkgs {
seedMap[lpkg] = struct{}{}
}

// Enqueue all packages to the jobs channel.
for _, rpkg := range r.pkgMap {
jobsCh <- rpkg
if _, ok := seedMap[rpkg.Lpkg]; !ok {
jobsCh <- rpkg
}
}

// Iterate through all packages with a collection of go routines.
Expand Down Expand Up @@ -790,7 +826,7 @@ func (r *Resolver) pruneOrphans() (bool, error) {
for _, lpkg := range r.seedPkgs {
rpkg := r.pkgMap[lpkg]
if rpkg == nil {
panic("Resolver lacks mapping for seed package " + lpkg.FullName())
panic(fmt.Sprintf("Resolver lacks mapping for seed package %s (%p)", lpkg.FullName(), lpkg))
}

visit(rpkg)
Expand Down Expand Up @@ -1112,6 +1148,9 @@ func ResolveFull(
if err != nil {
return nil, err
}
if err := res.LoaderSet.useMasterPkgs(); err != nil {
return nil, err
}

// Resolve app dependencies. The app automtically gets all the packages
// from the loader except for the loader-app-package.
Expand All @@ -1128,6 +1167,9 @@ func ResolveFull(
if err != nil {
return nil, err
}
if err := res.AppSet.useMasterPkgs(); err != nil {
return nil, err
}

res.Cfg.DetectErrors(flashMap)

Expand Down