When a recipe uses multiple git SRC_URI entries with different
destsuffix values (e.g. Zephyr-based recipes with separate repos for
the kernel, modules, and application), each source is unpacked into a
subdirectory of EXTERNALSRC that retains its own .git directory.

srctree_hash_files() calls 'git add -A .' at the EXTERNALSRC root,
which fails with exit code 128 when git encounters these unregistered
nested git repositories, halting the bitbake parse phase.

Fix by scanning for nested git repos before the add. If any are found,
exclude them from the top-level 'git add' using pathspec magic
':(exclude)<path>' and hash each nested repo independently using a
temporary index. This ensures changes in any nested repo still trigger
do_compile/do_configure to re-run.

Signed-off-by: Jamin Lin <[email protected]>
---
 meta/classes/externalsrc.bbclass | 37 +++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/meta/classes/externalsrc.bbclass b/meta/classes/externalsrc.bbclass
index 902ff2604f..0dd57af668 100644
--- a/meta/classes/externalsrc.bbclass
+++ b/meta/classes/externalsrc.bbclass
@@ -234,8 +234,43 @@ def srctree_hash_files(d, srcdir=None):
             # Update our custom index
             env = os.environ.copy()
             env['GIT_INDEX_FILE'] = tmp_index.name
-            subprocess.check_output(['git', 'add', '-A', '.'], cwd=s_dir, 
env=env)
+            # Find nested git repos created by multiple SRC_URI git entries 
with
+            # different destsuffix values. git add -A . exits 128 when it 
encounters
+            # these unregistered nested repos.
+            nested_git_dirs = []
+            for root, dirs, files in os.walk(s_dir):
+                if root == s_dir:
+                    continue
+                if '.git' in dirs or '.git' in files:
+                    nested_git_dirs.append(root)
+                    dirs[:] = []  # don't recurse into nested repos
+            if nested_git_dirs:
+                excludes = [':(exclude)' + os.path.relpath(n, s_dir) for n in 
nested_git_dirs]
+                subprocess.check_output(['git', 'add', '-A', '.'] + excludes, 
cwd=s_dir, env=env)
+            else:
+                subprocess.check_output(['git', 'add', '-A', '.'], cwd=s_dir, 
env=env)
             git_sha1 = subprocess.check_output(['git', 'write-tree'], 
cwd=s_dir, env=env).decode("utf-8")
+            # Hash each nested git repo separately so source changes there 
still
+            # trigger do_compile/do_configure to re-run.
+            for nested in nested_git_dirs:
+                nested_git = os.path.join(nested, '.git')
+                if not os.path.isdir(nested_git):
+                    continue
+                with 
tempfile.NamedTemporaryFile(prefix='oe-devtool-nested-index') as nested_tmp:
+                    nested_index = os.path.join(nested_git, 'index')
+                    if os.path.exists(nested_index):
+                        shutil.copyfile(nested_index, nested_tmp.name)
+                    nested_env = os.environ.copy()
+                    nested_env['GIT_INDEX_FILE'] = nested_tmp.name
+                    proc = subprocess.Popen(['git', 'add', '-A', '.'], 
cwd=nested,
+                                           env=nested_env, 
stdout=subprocess.DEVNULL,
+                                           stderr=subprocess.DEVNULL)
+                    proc.communicate()
+                    proc = subprocess.Popen(['git', 'write-tree'], cwd=nested,
+                                           env=nested_env, 
stdout=subprocess.PIPE,
+                                           stderr=subprocess.DEVNULL)
+                    stdout, _ = proc.communicate()
+                    git_sha1 += stdout.decode("utf-8")
             if os.path.exists(os.path.join(s_dir, ".gitmodules")) and 
os.path.getsize(os.path.join(s_dir, ".gitmodules")) > 0:
                 submodule_helper = subprocess.check_output(["git", "config", 
"--file", ".gitmodules", "--get-regexp", "path"], cwd=s_dir, 
env=env).decode("utf-8")
                 for line in submodule_helper.splitlines():
-- 
2.43.0
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#237074): 
https://lists.openembedded.org/g/openembedded-core/message/237074
Mute This Topic: https://lists.openembedded.org/mt/119327122/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to