From 30e7e83a3e0ed278bbd4d335afa2018681488649 Mon Sep 17 00:00:00 2001 From: Fabio Utzig Date: Mon, 21 Aug 2023 15:37:29 -0300 Subject: [PATCH 1/4] Fix function name in header doc Signed-off-by: Fabio Utzig --- newt/install/install.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newt/install/install.go b/newt/install/install.go index f3380e01e..7b86fac53 100644 --- a/newt/install/install.go +++ b/newt/install/install.go @@ -725,7 +725,7 @@ func (inst *Installer) remoteRepoInfo(r *repo.Repo, vm *deprepo.VersionMap) { util.StatusMessage(util.VERBOSITY_DEFAULT, "%s\n", s) } -// remoteRepoInfo prints information about the specified local repo (i.e., the +// localRepoInfo prints information about the specified local repo (i.e., the // project itself). It does nothing if the project is not a git repo. func (inst *Installer) localRepoInfo(r *repo.Repo) { ri := inst.gatherInfo(r, nil) From 66be85fe537836ced5b8af4d8245a68ff1f69de8 Mon Sep 17 00:00:00 2001 From: Fabio Utzig Date: Mon, 21 Aug 2023 15:38:16 -0300 Subject: [PATCH 2/4] Enable upgrading only specified repos Reimplement support for `newt upgrade ...`. Not specifying repos upgrades everything; specifying repos update only the ones given, without upgrading/installing its dependencies, etc. This should allow advanced users to install only what is required, eg. if developing an app for nrf52x one could simply run: `newt upgrade --depth=1 apache-mynewt-core apache-mynewt-nimble nordic-nrfx` This is also useful for CI, eg, for MCUboot it's possible to use MCUboot as the root project and run: `newt upgrade --depth=1 apache-mynewt-core nordic-nrfx mbedtls` And this brings down the complete download from 1GB to just around 250MB. Signed-off-by: Fabio Utzig --- newt/cli/project_cmds.go | 6 ++-- newt/cli/util.go | 4 +-- newt/deprepo/deprepo.go | 19 +++++++++-- newt/install/install.go | 10 ++++-- newt/project/project.go | 73 +++++++++++++++++++++++++--------------- 5 files changed, 74 insertions(+), 38 deletions(-) diff --git a/newt/cli/project_cmds.go b/newt/cli/project_cmds.go index 2d5f57f87..e7508f8cd 100644 --- a/newt/cli/project_cmds.go +++ b/newt/cli/project_cmds.go @@ -121,14 +121,14 @@ func makeRepoPredicate(repoNames []string) func(r *repo.Repo) bool { } func upgradeRunCmd(cmd *cobra.Command, args []string) { - proj := TryGetOrDownloadProject() + proj := TryGetOrDownloadProject(args) interfaces.SetProject(proj) - proj.GetPkgRepos() + proj.GetPkgRepos(args) pred := makeRepoPredicate(args) if err := proj.UpgradeIf( - newtutil.NewtForce, newtutil.NewtAsk, pred); err != nil { + newtutil.NewtForce, newtutil.NewtAsk, args, pred); err != nil { NewtUsage(nil, err) } diff --git a/newt/cli/util.go b/newt/cli/util.go index 75f60282f..cecf94be0 100644 --- a/newt/cli/util.go +++ b/newt/cli/util.go @@ -210,11 +210,11 @@ func TryGetProject() *project.Project { return p } -func TryGetOrDownloadProject() *project.Project { +func TryGetOrDownloadProject(okRepos []string) *project.Project { var p *project.Project var err error - if p, err = project.TryGetOrDownloadProject(); err != nil { + if p, err = project.TryGetOrDownloadProject(okRepos); err != nil { NewtUsage(nil, err) } diff --git a/newt/deprepo/deprepo.go b/newt/deprepo/deprepo.go index 159bac0cb..0edab8c1e 100644 --- a/newt/deprepo/deprepo.go +++ b/newt/deprepo/deprepo.go @@ -107,6 +107,15 @@ func (vm VersionMap) String() string { return s } +func isInReqs(repo string, reqs RequirementMap) bool { + for r, _ := range reqs { + if repo == r { + return true + } + } + return false +} + // Builds a repo dependency graph from the repo requirements expressed in the // `project.yml` file. func BuildDepGraph(repos RepoMap, rootReqs RequirementMap) (DepGraph, error) { @@ -114,7 +123,10 @@ func BuildDepGraph(repos RepoMap, rootReqs RequirementMap) (DepGraph, error) { // First, add the hard dependencies expressed in `project.yml`. for repoName, verReq := range rootReqs { - repo := repos[repoName] + repo, ok := repos[repoName] + if !ok { + continue + } normalizedReq, err := repo.NormalizeVerReq(verReq) if err != nil { return nil, err @@ -128,13 +140,16 @@ func BuildDepGraph(repos RepoMap, rootReqs RequirementMap) (DepGraph, error) { // Add inter-repo dependencies to the graph. for _, r := range repos.Sorted() { nvers, err := r.NormalizedVersions() - if err != nil { + if err != nil && isInReqs(r.Name(), rootReqs) { return nil, err } for _, v := range nvers { deps := r.DepsForVersion(v) reqMap := RequirementMap{} for _, d := range deps { + if !isInReqs(d.Name, rootReqs) { + continue + } depRepo := repos[d.Name] verReqs, err := depRepo.NormalizeVerReq(d.VerReqs) if err != nil { diff --git a/newt/install/install.go b/newt/install/install.go index 7b86fac53..c3be104c5 100644 --- a/newt/install/install.go +++ b/newt/install/install.go @@ -198,8 +198,10 @@ func (inst *Installer) ensureDepsInList(repos []*repo.Repo, deps = r.DepsForVersion(vm[r.Name()]) } for _, d := range deps { - depRepo := inst.repos[d.Name] - result = append(result, recurse(depRepo)...) + depRepo, ok := inst.repos[d.Name] + if ok { + result = append(result, recurse(depRepo)...) + } } return result @@ -706,12 +708,14 @@ func (inst *Installer) remoteRepoInfo(r *repo.Repo, vm *deprepo.VersionMap) { ri := inst.gatherInfo(r, vm) s := fmt.Sprintf(" * %s:", r.Name()) - s += fmt.Sprintf(" %s", ri.commitHash) if ri.installedVer == nil { + s += fmt.Sprintf(" ?") s += ", (not installed)" } else if ri.errorText != "" { + s += fmt.Sprintf(" %s", ri.commitHash) s += fmt.Sprintf(", (unknown: %s)", ri.errorText) } else { + s += fmt.Sprintf(" %s", ri.commitHash) if ri.installedVer.Commit == "" { s += fmt.Sprintf(", %s", ri.installedVer.String()) } diff --git a/newt/project/project.go b/newt/project/project.go index 45ecaf327..bb6b69f84 100644 --- a/newt/project/project.go +++ b/newt/project/project.go @@ -85,10 +85,10 @@ type Project struct { yc ycfg.YCfg } -func initProject(dir string, download bool) error { +func initProject(dir string, download bool, okRepos []string) error { var err error - globalProject, err = LoadProject(dir, download) + globalProject, err = loadProject(dir, download, okRepos) if err != nil { return err } @@ -99,14 +99,14 @@ func initProject(dir string, download bool) error { return nil } -func initialize(download bool) error { +func initialize(download bool, okRepos []string) error { if globalProject == nil { wd, err := os.Getwd() wd = filepath.ToSlash(wd) if err != nil { return util.NewNewtError(err.Error()) } - if err := initProject(wd, download); err != nil { + if err := initProject(wd, download, okRepos); err != nil { return err } } @@ -114,14 +114,14 @@ func initialize(download bool) error { } func TryGetProject() (*Project, error) { - if err := initialize(false); err != nil { + if err := initialize(false, nil); err != nil { return nil, err } return globalProject, nil } -func TryGetOrDownloadProject() (*Project, error) { - if err := initialize(true); err != nil { +func TryGetOrDownloadProject(okRepos []string) (*Project, error) { + if err := initialize(true, okRepos); err != nil { return nil, err } return globalProject, nil @@ -153,24 +153,36 @@ func ResetDeps(newList interfaces.PackageList) interfaces.PackageList { return oldList } -func NewProject(dir string, download bool) (*Project, error) { +func newProject(dir string, download bool, okRepos []string) (*Project, error) { proj := &Project{} - if err := proj.Init(dir, download); err != nil { + if err := proj.Init(dir, download, okRepos); err != nil { return nil, err } return proj, nil } -func (proj *Project) GetPkgRepos() error { +func isOkRepo(repo string, okRepos []string) bool { + if okRepos == nil || len(okRepos) == 0 { + return true + } + for _, v := range okRepos { + if repo == v { + return true + } + } + return false +} + +func (proj *Project) GetPkgRepos(okRepos []string) error { for _, pkgList := range proj.packages { for _, pkg := range *pkgList { if pkg.PkgConfig().HasKey("repository") { for k, _ := range pkg.PkgConfig().AllSettings() { repoName := strings.TrimPrefix(k, "repository.") - if repoName != k { + if repoName != k && isOkRepo(repoName, okRepos) { fields, err := pkg.PkgConfig().GetValStringMapString(k, nil) util.OneTimeWarningError(err) @@ -190,7 +202,7 @@ func (proj *Project) GetPkgRepos() error { repoName, fields["vers"], err.Error()) } r.SetPkgName(pkg.Name()) - if err := proj.addRepo(r, true); err != nil { + if err := proj.addRepo(r, true, false); err != nil { return err } proj.rootRepoReqs[repoName] = verReq @@ -302,10 +314,10 @@ func (proj *Project) SelectRepos(pred func(r *repo.Repo) bool) []*repo.Repo { // Installs or upgrades repos matching the specified predicate. func (proj *Project) UpgradeIf( - force bool, ask bool, predicate func(r *repo.Repo) bool) error { + force bool, ask bool, okRepos []string, predicate func(r *repo.Repo) bool) error { // Make sure we have an up to date copy of all `repository.yml` files. - if err := proj.downloadRepositoryYmlFiles(); err != nil { + if err := proj.downloadRepositoryYmlFiles(okRepos); err != nil { return err } @@ -328,7 +340,7 @@ func (proj *Project) InfoIf(predicate func(r *repo.Repo) bool, if remote { // Make sure we have an up to date copy of all `repository.yml` files. - if err := proj.downloadRepositoryYmlFiles(); err != nil { + if err := proj.downloadRepositoryYmlFiles(nil); err != nil { return err } } @@ -425,7 +437,7 @@ func (proj *Project) checkNewtVer() error { } // Loads the `repository.yml` file for each depended-on repo. This -func (proj *Project) loadRepoDeps(download bool) error { +func (proj *Project) loadRepoDeps(download bool, okRepos []string) error { seen := map[string]struct{}{} loadDeps := func(r *repo.Repo) ([]*repo.Repo, error) { @@ -434,6 +446,11 @@ func (proj *Project) loadRepoDeps(download bool) error { depMap := r.CommitDepMap() for _, depSlice := range depMap { for _, dep := range depSlice { + if !isOkRepo(dep.Name, okRepos) { + log.Debugf("Skipping repo %s", dep.Name) + continue + } + if _, ok := seen[dep.Name]; !ok { seen[r.Name()] = struct{}{} @@ -448,7 +465,7 @@ func (proj *Project) loadRepoDeps(download bool) error { return nil, err } } - if err := proj.addRepo(depRepo, download); err != nil { + if err := proj.addRepo(depRepo, download, true); err != nil { return nil, err } } @@ -485,7 +502,7 @@ func (proj *Project) loadRepoDeps(download bool) error { return nil } -func (proj *Project) downloadRepositoryYmlFiles() error { +func (proj *Project) downloadRepositoryYmlFiles(okRepos []string) error { // Download the `repository.yml` file for each root-level repo (those // specified in the `project.yml` file). for _, r := range proj.repos.Sorted() { @@ -500,7 +517,7 @@ func (proj *Project) downloadRepositoryYmlFiles() error { } // Download the `repository.yml` file for each depended-on repo. - if err := proj.loadRepoDeps(true); err != nil { + if err := proj.loadRepoDeps(true, okRepos); err != nil { return err } @@ -548,13 +565,13 @@ func (proj *Project) verifyNewtCompat() error { // addRepo Adds an entry to the project's repo map. It clones the repo if it // does not exist locally. -func (proj *Project) addRepo(r *repo.Repo, download bool) error { +func (proj *Project) addRepo(r *repo.Repo, download bool, isDep bool) error { if download { if err := r.EnsureExists(); err != nil { return err } } else { - if !r.CheckExists() { + if !r.CheckExists() && !isDep { return util.NewNewtError( fmt.Sprintf( "Repo \"%s\" is not installed, please run `newt upgrade`!", @@ -566,7 +583,7 @@ func (proj *Project) addRepo(r *repo.Repo, download bool) error { return nil } -func (proj *Project) loadConfig(download bool) error { +func (proj *Project) loadConfig(download bool, okRepos []string) error { yc, err := config.ReadFile(proj.BasePath + "/" + PROJECT_FILE_NAME) if err != nil { return util.NewNewtError(err.Error()) @@ -615,7 +632,7 @@ func (proj *Project) loadConfig(download bool) error { repoName, fields["vers"], err.Error()) } - if err := proj.addRepo(r, download); err != nil { + if err := proj.addRepo(r, download, false); err != nil { return err } proj.rootRepoReqs[repoName] = verReq @@ -625,7 +642,7 @@ func (proj *Project) loadConfig(download bool) error { // Read `repository.yml` files belonging to dependee repos from disk. // These repos might not be specified in the `project.yml` file, but they // are still part of the project. - if err := proj.loadRepoDeps(download); err != nil { + if err := proj.loadRepoDeps(download, okRepos); err != nil { return err } @@ -662,7 +679,7 @@ func (proj *Project) loadConfig(download bool) error { return nil } -func (proj *Project) Init(dir string, download bool) error { +func (proj *Project) Init(dir string, download bool, okRepos []string) error { proj.BasePath = filepath.ToSlash(filepath.Clean(dir)) // Only one project per system, when created, set it as the global project @@ -672,7 +689,7 @@ func (proj *Project) Init(dir string, download bool) error { proj.rootRepoReqs = map[string]newtutil.RepoVersion{} // Load Project configuration - if err := proj.loadConfig(download); err != nil { + if err := proj.loadConfig(download, okRepos); err != nil { return err } @@ -813,13 +830,13 @@ func (proj *Project) PackagesOfType(pkgType interfaces.PackageType) []interfaces return matches } -func LoadProject(dir string, download bool) (*Project, error) { +func loadProject(dir string, download bool, okRepos []string) (*Project, error) { projDir, err := findProjectDir(dir) if err != nil { return nil, err } - proj, err := NewProject(projDir, download) + proj, err := newProject(projDir, download, okRepos) return proj, err } From affb566d4caa4b14cdccc0db5f977a0343aaccb8 Mon Sep 17 00:00:00 2001 From: Fabio Utzig Date: Mon, 21 Aug 2023 17:22:19 -0300 Subject: [PATCH 3/4] [TESTING] Fix dependency graph when no repos given Fix dependency graph build when no repos were given to `upgrade`. FIXME: squash later Signed-off-by: Fabio Utzig --- newt/cli/project_cmds.go | 6 +++++- newt/deprepo/deprepo.go | 8 ++++---- newt/install/install.go | 10 +++++----- newt/newtutil/newtutil.go | 1 + newt/project/project.go | 5 +++-- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/newt/cli/project_cmds.go b/newt/cli/project_cmds.go index e7508f8cd..67e908abf 100644 --- a/newt/cli/project_cmds.go +++ b/newt/cli/project_cmds.go @@ -128,7 +128,8 @@ func upgradeRunCmd(cmd *cobra.Command, args []string) { pred := makeRepoPredicate(args) if err := proj.UpgradeIf( - newtutil.NewtForce, newtutil.NewtAsk, args, pred); err != nil { + newtutil.NewtForce, newtutil.NewtAsk, newtutil.NewtNoDeps, + args, pred); err != nil { NewtUsage(nil, err) } @@ -207,6 +208,9 @@ func AddProjectCommands(cmd *cobra.Command) { "Force upgrade of the repositories to latest state in project.yml") upgradeCmd.PersistentFlags().BoolVarP(&newtutil.NewtAsk, "ask", "a", false, "Prompt user before upgrading any repos") + upgradeCmd.PersistentFlags().BoolVarP(&newtutil.NewtNoDeps, + "no-deps", "n", false, + "Don't upgrade dependencies when repos are provided") cmd.AddCommand(upgradeCmd) diff --git a/newt/deprepo/deprepo.go b/newt/deprepo/deprepo.go index 0edab8c1e..542df6e76 100644 --- a/newt/deprepo/deprepo.go +++ b/newt/deprepo/deprepo.go @@ -118,13 +118,13 @@ func isInReqs(repo string, reqs RequirementMap) bool { // Builds a repo dependency graph from the repo requirements expressed in the // `project.yml` file. -func BuildDepGraph(repos RepoMap, rootReqs RequirementMap) (DepGraph, error) { +func BuildDepGraph(repos RepoMap, rootReqs RequirementMap, noDeps bool) (DepGraph, error) { dg := DepGraph{} // First, add the hard dependencies expressed in `project.yml`. for repoName, verReq := range rootReqs { repo, ok := repos[repoName] - if !ok { + if !ok && noDeps { continue } normalizedReq, err := repo.NormalizeVerReq(verReq) @@ -140,14 +140,14 @@ func BuildDepGraph(repos RepoMap, rootReqs RequirementMap) (DepGraph, error) { // Add inter-repo dependencies to the graph. for _, r := range repos.Sorted() { nvers, err := r.NormalizedVersions() - if err != nil && isInReqs(r.Name(), rootReqs) { + if err != nil && noDeps && isInReqs(r.Name(), rootReqs) { return nil, err } for _, v := range nvers { deps := r.DepsForVersion(v) reqMap := RequirementMap{} for _, d := range deps { - if !isInReqs(d.Name, rootReqs) { + if noDeps && !isInReqs(d.Name, rootReqs) { continue } depRepo := repos[d.Name] diff --git a/newt/install/install.go b/newt/install/install.go index c3be104c5..26a4222da 100644 --- a/newt/install/install.go +++ b/newt/install/install.go @@ -416,7 +416,7 @@ func (inst *Installer) versionMapRepos( // Calculates a map of repos and version numbers that should be included in an // install or upgrade operation. -func (inst *Installer) calcVersionMap(candidates []*repo.Repo) ( +func (inst *Installer) calcVersionMap(candidates []*repo.Repo, noDeps bool) ( deprepo.VersionMap, error) { // Repos that depend on any specified repos must also be considered during @@ -463,7 +463,7 @@ func (inst *Installer) calcVersionMap(candidates []*repo.Repo) ( // Construct a repo dependency graph from the `project.yml` version // requirements and from each repo's dependency list. - dg, err := deprepo.BuildDepGraph(inst.repos, inst.reqs) + dg, err := deprepo.BuildDepGraph(inst.repos, inst.reqs, noDeps) if err != nil { return nil, err } @@ -550,13 +550,13 @@ func verifyNewtCompat(repos []*repo.Repo, vm deprepo.VersionMap) error { // Installs or upgrades the specified set of repos. func (inst *Installer) Upgrade(candidates []*repo.Repo, force bool, - ask bool) error { + ask bool, noDeps bool) error { if err := verifyRepoDirtyState(candidates, force); err != nil { return err } - vm, err := inst.calcVersionMap(candidates) + vm, err := inst.calcVersionMap(candidates, noDeps) if err != nil { return err } @@ -682,7 +682,7 @@ func (inst *Installer) Info(repos []*repo.Repo, remote bool) error { } } - vm, err := inst.calcVersionMap(repos) + vm, err := inst.calcVersionMap(repos, false) if err != nil { return err } diff --git a/newt/newtutil/newtutil.go b/newt/newtutil/newtutil.go index 85fe22527..0fef2a46a 100644 --- a/newt/newtutil/newtutil.go +++ b/newt/newtutil/newtutil.go @@ -39,6 +39,7 @@ var NewtBlinkyTag string = "mynewt_1_11_0_tag" var NewtNumJobs int var NewtForce bool var NewtAsk bool +var NewtNoDeps bool const CORE_REPO_NAME string = "apache-mynewt-core" const ARDUINO_ZERO_REPO_NAME string = "mynewt_arduino_zero" diff --git a/newt/project/project.go b/newt/project/project.go index bb6b69f84..882890431 100644 --- a/newt/project/project.go +++ b/newt/project/project.go @@ -314,7 +314,8 @@ func (proj *Project) SelectRepos(pred func(r *repo.Repo) bool) []*repo.Repo { // Installs or upgrades repos matching the specified predicate. func (proj *Project) UpgradeIf( - force bool, ask bool, okRepos []string, predicate func(r *repo.Repo) bool) error { + force bool, ask bool, noDeps bool, okRepos []string, + predicate func(r *repo.Repo) bool) error { // Make sure we have an up to date copy of all `repository.yml` files. if err := proj.downloadRepositoryYmlFiles(okRepos); err != nil { @@ -332,7 +333,7 @@ func (proj *Project) UpgradeIf( return err } - return inst.Upgrade(specifiedRepoList, force, ask) + return inst.Upgrade(specifiedRepoList, force, ask, noDeps && len(okRepos) > 0) } func (proj *Project) InfoIf(predicate func(r *repo.Repo) bool, From 02096552484b433ca0de45bdb4872b616d07db22 Mon Sep 17 00:00:00 2001 From: Fabio Utzig Date: Mon, 21 Aug 2023 19:38:15 -0300 Subject: [PATCH 4/4] FIXUP: testing --- newt/cli/project_cmds.go | 4 ++-- newt/cli/util.go | 4 ++-- newt/deprepo/deprepo.go | 2 +- newt/project/project.go | 47 ++++++++++++++++++++-------------------- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/newt/cli/project_cmds.go b/newt/cli/project_cmds.go index 67e908abf..5c41237c9 100644 --- a/newt/cli/project_cmds.go +++ b/newt/cli/project_cmds.go @@ -121,10 +121,10 @@ func makeRepoPredicate(repoNames []string) func(r *repo.Repo) bool { } func upgradeRunCmd(cmd *cobra.Command, args []string) { - proj := TryGetOrDownloadProject(args) + proj := TryGetOrDownloadProject(newtutil.NewtNoDeps, args) interfaces.SetProject(proj) - proj.GetPkgRepos(args) + proj.GetPkgRepos(newtutil.NewtNoDeps, args) pred := makeRepoPredicate(args) if err := proj.UpgradeIf( diff --git a/newt/cli/util.go b/newt/cli/util.go index cecf94be0..ccd745381 100644 --- a/newt/cli/util.go +++ b/newt/cli/util.go @@ -210,11 +210,11 @@ func TryGetProject() *project.Project { return p } -func TryGetOrDownloadProject(okRepos []string) *project.Project { +func TryGetOrDownloadProject(noDeps bool, okRepos []string) *project.Project { var p *project.Project var err error - if p, err = project.TryGetOrDownloadProject(okRepos); err != nil { + if p, err = project.TryGetOrDownloadProject(noDeps, okRepos); err != nil { NewtUsage(nil, err) } diff --git a/newt/deprepo/deprepo.go b/newt/deprepo/deprepo.go index 542df6e76..a6b681933 100644 --- a/newt/deprepo/deprepo.go +++ b/newt/deprepo/deprepo.go @@ -140,7 +140,7 @@ func BuildDepGraph(repos RepoMap, rootReqs RequirementMap, noDeps bool) (DepGrap // Add inter-repo dependencies to the graph. for _, r := range repos.Sorted() { nvers, err := r.NormalizedVersions() - if err != nil && noDeps && isInReqs(r.Name(), rootReqs) { + if err != nil && !noDeps && isInReqs(r.Name(), rootReqs) { return nil, err } for _, v := range nvers { diff --git a/newt/project/project.go b/newt/project/project.go index 882890431..e1161967e 100644 --- a/newt/project/project.go +++ b/newt/project/project.go @@ -85,10 +85,10 @@ type Project struct { yc ycfg.YCfg } -func initProject(dir string, download bool, okRepos []string) error { +func initProject(dir string, download bool, noDeps bool, okRepos []string) error { var err error - globalProject, err = loadProject(dir, download, okRepos) + globalProject, err = loadProject(dir, download, noDeps, okRepos) if err != nil { return err } @@ -99,14 +99,14 @@ func initProject(dir string, download bool, okRepos []string) error { return nil } -func initialize(download bool, okRepos []string) error { +func initialize(download bool, noDeps bool, okRepos []string) error { if globalProject == nil { wd, err := os.Getwd() wd = filepath.ToSlash(wd) if err != nil { return util.NewNewtError(err.Error()) } - if err := initProject(wd, download, okRepos); err != nil { + if err := initProject(wd, download, noDeps, okRepos); err != nil { return err } } @@ -114,14 +114,14 @@ func initialize(download bool, okRepos []string) error { } func TryGetProject() (*Project, error) { - if err := initialize(false, nil); err != nil { + if err := initialize(false, false, nil); err != nil { return nil, err } return globalProject, nil } -func TryGetOrDownloadProject(okRepos []string) (*Project, error) { - if err := initialize(true, okRepos); err != nil { +func TryGetOrDownloadProject(noDeps bool, okRepos []string) (*Project, error) { + if err := initialize(true, noDeps, okRepos); err != nil { return nil, err } return globalProject, nil @@ -153,10 +153,10 @@ func ResetDeps(newList interfaces.PackageList) interfaces.PackageList { return oldList } -func newProject(dir string, download bool, okRepos []string) (*Project, error) { +func newProject(dir string, download bool, noDeps bool, okRepos []string) (*Project, error) { proj := &Project{} - if err := proj.Init(dir, download, okRepos); err != nil { + if err := proj.Init(dir, download, noDeps, okRepos); err != nil { return nil, err } @@ -175,14 +175,14 @@ func isOkRepo(repo string, okRepos []string) bool { return false } -func (proj *Project) GetPkgRepos(okRepos []string) error { +func (proj *Project) GetPkgRepos(noDeps bool, okRepos []string) error { for _, pkgList := range proj.packages { for _, pkg := range *pkgList { if pkg.PkgConfig().HasKey("repository") { for k, _ := range pkg.PkgConfig().AllSettings() { repoName := strings.TrimPrefix(k, "repository.") - if repoName != k && isOkRepo(repoName, okRepos) { + if repoName != k && (!noDeps || isOkRepo(repoName, okRepos)) { fields, err := pkg.PkgConfig().GetValStringMapString(k, nil) util.OneTimeWarningError(err) @@ -318,7 +318,7 @@ func (proj *Project) UpgradeIf( predicate func(r *repo.Repo) bool) error { // Make sure we have an up to date copy of all `repository.yml` files. - if err := proj.downloadRepositoryYmlFiles(okRepos); err != nil { + if err := proj.downloadRepositoryYmlFiles(noDeps, okRepos); err != nil { return err } @@ -341,7 +341,7 @@ func (proj *Project) InfoIf(predicate func(r *repo.Repo) bool, if remote { // Make sure we have an up to date copy of all `repository.yml` files. - if err := proj.downloadRepositoryYmlFiles(nil); err != nil { + if err := proj.downloadRepositoryYmlFiles(false, nil); err != nil { return err } } @@ -438,7 +438,7 @@ func (proj *Project) checkNewtVer() error { } // Loads the `repository.yml` file for each depended-on repo. This -func (proj *Project) loadRepoDeps(download bool, okRepos []string) error { +func (proj *Project) loadRepoDeps(download bool, noDeps bool, okRepos []string) error { seen := map[string]struct{}{} loadDeps := func(r *repo.Repo) ([]*repo.Repo, error) { @@ -447,7 +447,7 @@ func (proj *Project) loadRepoDeps(download bool, okRepos []string) error { depMap := r.CommitDepMap() for _, depSlice := range depMap { for _, dep := range depSlice { - if !isOkRepo(dep.Name, okRepos) { + if !isOkRepo(dep.Name, okRepos) && noDeps { log.Debugf("Skipping repo %s", dep.Name) continue } @@ -503,7 +503,8 @@ func (proj *Project) loadRepoDeps(download bool, okRepos []string) error { return nil } -func (proj *Project) downloadRepositoryYmlFiles(okRepos []string) error { +func (proj *Project) downloadRepositoryYmlFiles(noDeps bool, + okRepos []string) error { // Download the `repository.yml` file for each root-level repo (those // specified in the `project.yml` file). for _, r := range proj.repos.Sorted() { @@ -518,7 +519,7 @@ func (proj *Project) downloadRepositoryYmlFiles(okRepos []string) error { } // Download the `repository.yml` file for each depended-on repo. - if err := proj.loadRepoDeps(true, okRepos); err != nil { + if err := proj.loadRepoDeps(true, noDeps, okRepos); err != nil { return err } @@ -584,7 +585,7 @@ func (proj *Project) addRepo(r *repo.Repo, download bool, isDep bool) error { return nil } -func (proj *Project) loadConfig(download bool, okRepos []string) error { +func (proj *Project) loadConfig(download bool, noDeps bool, okRepos []string) error { yc, err := config.ReadFile(proj.BasePath + "/" + PROJECT_FILE_NAME) if err != nil { return util.NewNewtError(err.Error()) @@ -643,7 +644,7 @@ func (proj *Project) loadConfig(download bool, okRepos []string) error { // Read `repository.yml` files belonging to dependee repos from disk. // These repos might not be specified in the `project.yml` file, but they // are still part of the project. - if err := proj.loadRepoDeps(download, okRepos); err != nil { + if err := proj.loadRepoDeps(download, noDeps, okRepos); err != nil { return err } @@ -680,7 +681,7 @@ func (proj *Project) loadConfig(download bool, okRepos []string) error { return nil } -func (proj *Project) Init(dir string, download bool, okRepos []string) error { +func (proj *Project) Init(dir string, download bool, noDeps bool, okRepos []string) error { proj.BasePath = filepath.ToSlash(filepath.Clean(dir)) // Only one project per system, when created, set it as the global project @@ -690,7 +691,7 @@ func (proj *Project) Init(dir string, download bool, okRepos []string) error { proj.rootRepoReqs = map[string]newtutil.RepoVersion{} // Load Project configuration - if err := proj.loadConfig(download, okRepos); err != nil { + if err := proj.loadConfig(download, noDeps, okRepos); err != nil { return err } @@ -831,13 +832,13 @@ func (proj *Project) PackagesOfType(pkgType interfaces.PackageType) []interfaces return matches } -func loadProject(dir string, download bool, okRepos []string) (*Project, error) { +func loadProject(dir string, download bool, noDeps bool, okRepos []string) (*Project, error) { projDir, err := findProjectDir(dir) if err != nil { return nil, err } - proj, err := newProject(projDir, download, okRepos) + proj, err := newProject(projDir, download, noDeps, okRepos) return proj, err }