You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2024/06/20 09:38:07 UTC

(mynewt-newt) branch master updated: Add ignored repositories list

This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-newt.git


The following commit(s) were added to refs/heads/master by this push:
     new 06b3c08a Add ignored repositories list
06b3c08a is described below

commit 06b3c08a7fe2187584b491b4f3fb36792c07aac4
Author: Michal Gorecki <mi...@codecoup.pl>
AuthorDate: Mon May 13 15:28:43 2024 +0200

    Add ignored repositories list
    
    This allows to specify a list of repositories names that
    will be ignored by upgrade command. The list should be placed
    inside project.yml file and look for example like this:
    
    project.repositories.ignored:
        - apache-mynewt-nimble
        - stm-cmsis_device_f3
        - stm-stm32f3xx_hal_driver
    
    apache-mynewt-core repository can't be ignored.
---
 newt/builder/build.go   | 11 +----------
 newt/project/project.go | 22 +++++++++++++++++-----
 newt/repo/repo.go       | 13 ++++++++-----
 util/util.go            | 18 ++++++++++++++++++
 4 files changed, 44 insertions(+), 20 deletions(-)

diff --git a/newt/builder/build.go b/newt/builder/build.go
index 287ef0b2..6ce3fb4c 100644
--- a/newt/builder/build.go
+++ b/newt/builder/build.go
@@ -944,18 +944,9 @@ func (b *Builder) CleanArtifacts() {
 	}
 }
 
-func Contains(elements []string, val string) bool {
-	for _, s := range elements {
-		if val == s {
-			return true
-		}
-	}
-	return false
-}
-
 func (b *Builder) AppendModifiedRepos(modifiedRepos []string) {
 	for _, repo := range modifiedRepos {
-		if !Contains(b.modifiedExtRepos, repo) {
+		if !util.SliceContains(b.modifiedExtRepos, repo) {
 			b.modifiedExtRepos = append(b.modifiedExtRepos, repo)
 		}
 	}
diff --git a/newt/project/project.go b/newt/project/project.go
index b285e664..e4f4bae9 100644
--- a/newt/project/project.go
+++ b/newt/project/project.go
@@ -70,6 +70,9 @@ type Project struct {
 	//                read.
 	repos deprepo.RepoMap
 
+	// Contains names of repositories that will not be upgraded/downloaded.
+	reposIgnored []string
+
 	// The local repository at the top-level of the project.  This repo is
 	// excluded from most repo operations.
 	localRepo *repo.Repo
@@ -188,7 +191,7 @@ func (proj *Project) GetPkgRepos() error {
 			if pkg.PkgConfig().HasKey("repository") {
 				for k, _ := range pkg.PkgConfig().AllSettings() {
 					repoName := strings.TrimPrefix(k, "repository.")
-					if repoName != k {
+					if repoName != k && !util.SliceContains(proj.reposIgnored, repoName) {
 						fields, err := pkg.PkgConfig().GetValStringMapString(k, nil)
 						util.OneTimeWarningError(err)
 
@@ -429,7 +432,7 @@ func (proj *Project) loadRepo(name string, fields map[string]string) (
 	}
 
 	// Read the full repo definition from its `repository.yml` file.
-	if err := r.Read(); err != nil {
+	if err := r.Read(proj.reposIgnored); err != nil {
 		return r, err
 	}
 
@@ -504,7 +507,7 @@ func (proj *Project) loadRepoDeps(download bool) error {
 					newRepos = append(newRepos, depRepo)
 
 					if download {
-						if _, err := depRepo.UpdateDesc(); err != nil {
+						if _, err := depRepo.UpdateDesc(proj.reposIgnored); err != nil {
 							return nil, err
 						}
 					}
@@ -539,7 +542,7 @@ func (proj *Project) downloadRepositoryYmlFiles() error {
 	// specified in the `project.yml` file).
 	for _, r := range proj.repos.Sorted() {
 		if !r.IsLocal() && !r.IsExternal(r.Path()) {
-			if _, err := r.UpdateDesc(); err != nil {
+			if _, err := r.UpdateDesc(proj.reposIgnored); err != nil {
 				return err
 			}
 		}
@@ -628,6 +631,15 @@ func (proj *Project) loadConfig(download bool) error {
 	proj.name, err = yc.GetValString("project.name", nil)
 	util.OneTimeWarningError(err)
 
+	proj.reposIgnored = make([]string, 0)
+	proj.reposIgnored, err = yc.GetValStringSlice("project.repositories.ignored", nil)
+	util.OneTimeWarningError(err)
+
+	if util.SliceContains(proj.reposIgnored, "apache-mynewt-core") {
+		return util.NewNewtError("apache-mynewt-core repository can't be ignored. " +
+			"Please remove it from the ignored repositories list.")
+	}
+
 	// Local repository always included in initialization
 	r, err := repo.NewLocalRepo(proj.name)
 	if err != nil {
@@ -644,7 +656,7 @@ func (proj *Project) loadConfig(download bool) error {
 	// and try to load it.
 	for k, _ := range yc.AllSettings() {
 		repoName := strings.TrimPrefix(k, "repository.")
-		if repoName != k {
+		if repoName != k && !util.SliceContains(proj.reposIgnored, repoName) {
 			fields, err := yc.GetValStringMapString(k, nil)
 			util.OneTimeWarningError(err)
 
diff --git a/newt/repo/repo.go b/newt/repo/repo.go
index 79165671..b5f6c1c0 100644
--- a/newt/repo/repo.go
+++ b/newt/repo/repo.go
@@ -397,7 +397,7 @@ func (r *Repo) Upgrade(ver newtutil.RepoVersion) error {
 // from master.  The repo object is then populated with the contents of the
 // downladed file.  If this repo has already had its descriptor updated, this
 // function is a no-op.
-func (r *Repo) UpdateDesc() (bool, error) {
+func (r *Repo) UpdateDesc(reposIgnored []string) (bool, error) {
 	if r.updated {
 		return false, nil
 	}
@@ -417,7 +417,7 @@ func (r *Repo) UpdateDesc() (bool, error) {
 	}
 
 	// Read `repository.yml` and populate this repo object.
-	if err := r.Read(); err != nil {
+	if err := r.Read(reposIgnored); err != nil {
 		return false, err
 	}
 
@@ -555,11 +555,14 @@ func parseRepoDepMap(depName string,
 	return result, nil
 }
 
-func (r *Repo) readDepRepos(yc ycfg.YCfg) error {
+func (r *Repo) readDepRepos(yc ycfg.YCfg, reposIgnored []string) error {
 	depMap, err := yc.GetValStringMap("repo.deps", nil)
 	util.OneTimeWarningError(err)
 
 	for depName, repoMapYml := range depMap {
+		if util.SliceContains(reposIgnored, depName) {
+			continue
+		}
 		rdm, err := parseRepoDepMap(depName, repoMapYml)
 		if err != nil {
 			return util.FmtNewtError(
@@ -577,7 +580,7 @@ func (r *Repo) readDepRepos(yc ycfg.YCfg) error {
 
 // Reads a `repository.yml` file and populates the receiver repo with its
 // contents.
-func (r *Repo) Read() error {
+func (r *Repo) Read(reposIgnored []string) error {
 	r.Init(r.Name(), r.downloader)
 
 	yc, err := config.ReadFile(r.repoFilePath() + "/" + REPO_FILE_NAME)
@@ -604,7 +607,7 @@ func (r *Repo) Read() error {
 		r.vers[vers] = commit
 	}
 
-	if err := r.readDepRepos(yc); err != nil {
+	if err := r.readDepRepos(yc, reposIgnored); err != nil {
 		return err
 	}
 
diff --git a/util/util.go b/util/util.go
index 5823762a..b1b2101f 100644
--- a/util/util.go
+++ b/util/util.go
@@ -30,6 +30,7 @@ import (
 	"os/exec"
 	"os/signal"
 	"path/filepath"
+	"reflect"
 	"runtime"
 	"sort"
 	"strconv"
@@ -1026,3 +1027,20 @@ func DirsAreEqual(dira string, dirb string) (bool, error) {
 
 	return true, nil
 }
+
+// Function that checks if the slice of any type contains a
+// specified value
+func SliceContains(slice interface{}, elem interface{}) bool {
+	s := reflect.ValueOf(slice)
+
+	if s.Kind() != reflect.Slice {
+		panic("SliceContains() called with non-slice type")
+	}
+
+	for i := 0; i < s.Len(); i++ {
+		if reflect.DeepEqual(s.Index(i).Interface(), elem) {
+			return true
+		}
+	}
+	return false
+}