From: Jamin Lin <jamin_lin@aspeedtech.com>
To: "openembedded-core@lists.openembedded.org"
<openembedded-core@lists.openembedded.org>
Cc: Troy Lee <troy_lee@aspeedtech.com>,
Jamin Lin <jamin_lin@aspeedtech.com>,
Vince Chang <vince_chang@aspeedtech.com>
Subject: [PATCH v1 1/2] externalsrc: Handle nested git repos from multiple SRC_URI entries
Date: Fri, 15 May 2026 09:36:18 +0000 [thread overview]
Message-ID: <20260515093615.126849-2-jamin_lin@aspeedtech.com> (raw)
In-Reply-To: <20260515093615.126849-1-jamin_lin@aspeedtech.com>
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 <jamin_lin@aspeedtech.com>
---
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
next prev parent reply other threads:[~2026-05-15 9:36 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-15 9:36 [PATCH v1 0/2] oe: Fix build failures with multiple git SRC_URI entries Jamin Lin
2026-05-15 9:36 ` Jamin Lin [this message]
2026-05-15 9:36 ` [PATCH v1 2/2] reproducible: Handle nested git repos in find_git_repositories Jamin Lin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260515093615.126849-2-jamin_lin@aspeedtech.com \
--to=jamin_lin@aspeedtech.com \
--cc=openembedded-core@lists.openembedded.org \
--cc=troy_lee@aspeedtech.com \
--cc=vince_chang@aspeedtech.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.