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

jerzy 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 f95aa661 newt: Add external repos patches support
f95aa661 is described below

commit f95aa661cb745d97c4cbe8a6eadb7b8307787e0f
Author: Michal Gorecki <[email protected]>
AuthorDate: Wed Mar 27 10:44:31 2024 +0100

    newt: Add external repos patches support
    
    Now if package that adds external repository contains directory
    patches/*external_repo_name*, newt will try to apply patches
    inside this directory to the external repo.
---
 newt/cli/project_cmds.go      |  1 +
 newt/downloader/downloader.go | 24 ++++++++++++++++++++++++
 newt/install/install.go       | 10 ++++++++++
 newt/project/project.go       | 32 ++++++++++++++++++++++++++++++--
 newt/repo/repo.go             | 18 ++++++++++++++++++
 5 files changed, 83 insertions(+), 2 deletions(-)

diff --git a/newt/cli/project_cmds.go b/newt/cli/project_cmds.go
index 92d40a57..9a742462 100644
--- a/newt/cli/project_cmds.go
+++ b/newt/cli/project_cmds.go
@@ -131,6 +131,7 @@ func upgradeRunCmd(cmd *cobra.Command, args []string) {
        interfaces.SetProject(proj)
 
        proj.GetPkgRepos()
+       proj.SetGitEnvVariables()
 
        pred := makeRepoPredicate(args)
        if err := proj.UpgradeIf(
diff --git a/newt/downloader/downloader.go b/newt/downloader/downloader.go
index eea3249a..2be323a1 100644
--- a/newt/downloader/downloader.go
+++ b/newt/downloader/downloader.go
@@ -97,6 +97,10 @@ type Downloader interface {
        // If such a commit exists, it is returned.  Otherwise, "" is returned.
        LatestRc(path string, base string) (string, error)
 
+       // Applies patches provided inside "patches" directory.
+       // If no patch is provided function does nothing
+       ApplyPatches(path string, patches []string) error
+
        // Returns the branch that contains the YAML control files; this option
        // allows implementers to override "master" as the main branch.
        MainBranch() string
@@ -451,6 +455,26 @@ func (gd *GenericDownloader) Checkout(repoDir string, 
commit string) error {
        return err
 }
 
+func (gd *GenericDownloader) ApplyPatches(repoDir string, patches []string) 
error {
+       cmd := []string{
+               "am",
+       }
+       cmd = append(cmd, patches...)
+
+       _, err := executeGitCommand(repoDir, cmd, true)
+       if err != nil {
+               // Abort git am if applying patches failed
+               cmd = []string{
+                       "am",
+                       "--abort",
+               }
+               executeGitCommand(repoDir, cmd, true)
+
+               return err
+       }
+       return nil
+}
+
 // Update one submodule tree in a repo (under path)
 func (gd *GenericDownloader) UpdateSubmodule(path string, submodule string) 
error {
        cmd := []string{
diff --git a/newt/install/install.go b/newt/install/install.go
index 8eebff09..aa63fd65 100644
--- a/newt/install/install.go
+++ b/newt/install/install.go
@@ -602,6 +602,16 @@ func (inst *Installer) Upgrade(candidates []*repo.Repo, 
force bool,
                        r.Name(), destVer.String())
        }
 
+       for _, r := range candidates {
+               err = r.ApplyPatches()
+               if err != nil {
+                       util.StatusMessage(util.VERBOSITY_DEFAULT,
+                               "Applying patches in repository %s failed\n", 
r.Name())
+
+                       return err
+               }
+       }
+
        return nil
 }
 
diff --git a/newt/project/project.go b/newt/project/project.go
index 78651f57..b285e664 100644
--- a/newt/project/project.go
+++ b/newt/project/project.go
@@ -44,6 +44,7 @@ import (
 var globalProject *Project = nil
 
 const PROJECT_FILE_NAME = "project.yml"
+const PATCHES_DIR = "patches"
 
 var ignoreSearchDirs []string = []string{
        "bin",
@@ -95,7 +96,7 @@ func initProject(dir string, download bool) error {
 
        if download {
                err = globalProject.UpgradeIf(newtutil.NewtForce, 
newtutil.NewtAsk,
-                                             func(r *repo.Repo) bool { return 
!r.IsExternal(r.Path()) })
+                       func(r *repo.Repo) bool { return 
!r.IsExternal(r.Path()) })
                if err != nil {
                        return err
                }
@@ -182,7 +183,6 @@ func (proj *Project) isRepoAdded(r *repo.Repo) bool {
 }
 
 func (proj *Project) GetPkgRepos() error {
-
        for _, pkgList := range proj.packages {
                for _, pkg := range *pkgList {
                        if pkg.PkgConfig().HasKey("repository") {
@@ -215,6 +215,21 @@ func (proj *Project) GetPkgRepos() error {
                                                        }
                                                        
proj.rootRepoReqs[repoName] = verReq
                                                }
+
+                                               if _, err := 
os.Stat(pkg.BasePath() + "/" + PATCHES_DIR + "/" + r.Name()); 
os.IsNotExist(err) {
+                                                       continue
+                                               } else {
+                                                       dirEntries, err := 
os.ReadDir(pkg.BasePath() + "/" + PATCHES_DIR + "/" + r.Name())
+                                                       if err != nil {
+                                                               return err
+                                                       }
+
+                                                       for _, e := range 
dirEntries {
+                                                               if 
strings.HasSuffix(e.Name(), ".patch") {
+                                                                       
r.AddPatch(pkg.BasePath() + "/" + PATCHES_DIR + "/" + r.Name() + "/" + e.Name())
+                                                               }
+                                                       }
+                                               }
                                        }
                                }
                        }
@@ -223,6 +238,19 @@ func (proj *Project) GetPkgRepos() error {
        return nil
 }
 
+func (proj *Project) SetGitEnvVariables() error {
+       err := os.Setenv("GIT_COMMITTER_NAME", "newt")
+       if err != nil {
+               return err
+       }
+
+       err = os.Setenv("GIT_COMMITTER_EMAIL", "[email protected]")
+       if err != nil {
+               return err
+       }
+       return nil
+}
+
 func (proj *Project) Path() string {
        return proj.BasePath
 }
diff --git a/newt/repo/repo.go b/newt/repo/repo.go
index e1b5e6e0..79165671 100644
--- a/newt/repo/repo.go
+++ b/newt/repo/repo.go
@@ -44,6 +44,7 @@ const REPO_DEFAULT_PERMS = 0755
 
 const REPO_FILE_NAME = "repository.yml"
 const REPOS_DIR = "repos"
+const PATCHES_DIR = "patches"
 
 type Repo struct {
        name       string
@@ -76,6 +77,10 @@ type Repo struct {
 
        hasSubmodules bool
        submodules    []string
+
+       // Used with external repos. If package that adds external repository 
provides patches for it,
+       // the paths to them are going to be stored here.
+       patches []string
 }
 
 type RepoDependency struct {
@@ -124,6 +129,19 @@ func (r *Repo) Downloader() downloader.Downloader {
        return r.downloader
 }
 
+func (r *Repo) AddPatch(path string) {
+       r.patches = append(r.patches, path)
+}
+
+func (r *Repo) ApplyPatches() error {
+       if len(r.patches) == 0 {
+               return nil
+       }
+
+       err := r.Downloader().ApplyPatches(r.Path(), r.patches)
+       return err
+}
+
 func (repo *Repo) FilteredSearchList(
        curPath string, searchedMap map[string]struct{}) ([]string, error) {
 

Reply via email to