From patchwork Fri May 15 09:36:18 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jamin Lin X-Patchwork-Id: 88155 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id AA4E0CD343F for ; Fri, 15 May 2026 09:36:31 +0000 (UTC) Received: from OS8PR02CU002.outbound.protection.outlook.com (OS8PR02CU002.outbound.protection.outlook.com [40.107.75.139]) by mx.groups.io with SMTP id smtpd.msgproc01-g2.31466.1778837783378980676 for ; Fri, 15 May 2026 02:36:25 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@aspeedtech.com header.s=selector1 header.b=XnlELaHZ; spf=pass (domain: aspeedtech.com, ip: 40.107.75.139, mailfrom: jamin_lin@aspeedtech.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HMjwcq5/aPNCxZMW6XAJXfk+a0XH01utax2o55qP/eFrQEOK1Y+P9NDnnWcWjzuP8mODOdo3pOTGhEUAsaEzVg1ddrFFSse5qADjTcZV7hyIVuCzzV4u1zrPS9+B6OdWfWdPXkz3ugElPhlVKlQ1SuAoeBvFZaiJAos427hTEV1bxs6TG/fxy6th9zZiS0c8ksiEAHzWmyQjXeGi7lMGWGY23Ns8XbfO9KwuWVQ9fLVjEz2wDAU7IAw+6Zv6mtCbZfKTTVPFlRv4non7VrYslYCP+4uvDhhg6tJlpDFgCfaGiTSKhRH0E5lr5gdJvIwr2XyMAz4jEHtmvaf2TOnZEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=xYxRRwg1HC7aD5PKHVihFP/HrT8q/x+Z9Lt4pL22cg4=; b=IjbDcImF4q0/+tkTMXjnOGBKbeq4zidpbbHm+mKFbc0ESH2rnzhbSeH3v5MAMfj6IwQ2TQcw6ajZ0lK02ZCMTC2DrHmcdeyj/hDLDzIFjc5Keq6stCTXtoQVHFjz0k2pthtW395TipxY9PwhNEfIVazSR4IKMVmAm+kGpUVOpMQ+R7k9BXbTtad3Hr4E525iWuPvSdgpxE2tG2isJOcRNtM9rCLeU4/QXxuEM3AmwzP1f1KoBb5JCLF5fAUMOBAigTTA/k5Q/4KHnj8GkZSQFK5ekqCw0sFpAj9DBmJHT+ODQor0MXwDExUTlzZX5wD/d7AegOBQ6nHJkDpqnbbnzg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=aspeedtech.com; dmarc=pass action=none header.from=aspeedtech.com; dkim=pass header.d=aspeedtech.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aspeedtech.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xYxRRwg1HC7aD5PKHVihFP/HrT8q/x+Z9Lt4pL22cg4=; b=XnlELaHZn3IIzczpigtNU/H8hkv4SO7526OWVWfYe53fdrOT64iQ2eVlpbe3PYtN0czH4mnp79R6T+Bjks49jFR9dS8Pz54SSGHEgxIaFEQR+fjyQRR5jPtpoJQZdCFw2/7n4yAvf5ixQJqVnkam+dnHGQ2zYwBO0Abm3JYN2KKSGj/cC3xU0BSKytjQIGF+A6jDv0pcSYZLVKpOzrfERd8HHyqOyIkW0eQpxXmvOXPiH3KihKyoecFoy2pUvTAAhnTGEw6WA79KoHWdUcTeqUWmMs8KuvFRSMxFckRvZ4n73omZJvp4HoC5ezDOtUjgfzxfj+wCKUivpw9b0Qh65Q== Received: from TYPPR06MB8206.apcprd06.prod.outlook.com (2603:1096:405:383::19) by SEZPR06MB5176.apcprd06.prod.outlook.com (2603:1096:101:73::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9913.11; Fri, 15 May 2026 09:36:18 +0000 Received: from TYPPR06MB8206.apcprd06.prod.outlook.com ([fe80::e659:1ead:77cb:f6d3]) by TYPPR06MB8206.apcprd06.prod.outlook.com ([fe80::e659:1ead:77cb:f6d3%2]) with mapi id 15.20.9913.009; Fri, 15 May 2026 09:36:18 +0000 From: Jamin Lin To: "openembedded-core@lists.openembedded.org" CC: Troy Lee , Jamin Lin , Vince Chang Subject: [PATCH v1 1/2] externalsrc: Handle nested git repos from multiple SRC_URI entries Thread-Topic: [PATCH v1 1/2] externalsrc: Handle nested git repos from multiple SRC_URI entries Thread-Index: AQHc5E5IWG4WbSnYm0WaLzDNjO9OhQ== Date: Fri, 15 May 2026 09:36:18 +0000 Message-ID: <20260515093615.126849-2-jamin_lin@aspeedtech.com> References: <20260515093615.126849-1-jamin_lin@aspeedtech.com> In-Reply-To: <20260515093615.126849-1-jamin_lin@aspeedtech.com> Accept-Language: zh-TW, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=aspeedtech.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: TYPPR06MB8206:EE_|SEZPR06MB5176:EE_ x-ms-office365-filtering-correlation-id: 2380c589-3348-4408-2c37-08deb2656ad5 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|366016|1800799024|376014|18002099003|22082099003|56012099003|38070700021|3023799003; x-microsoft-antispam-message-info: A7/OitlGRKdx/LAJLWK00HMXQR8WNQcvC5BeIUjgpOpCpgZ/cgGCSWGf87kh8zdII8iDDKje5+fGheWQAId2w0aFebUk8/YRebnJmz1+awz/EJjfNQh+7auu03p6aH7eX0L2XzSYRvt3wJhUzFMJtXK6rcNhdn6/IcpO/xbyYXnNQTo0aFlBmtJ824xVPhZSzd5ct3UJM7nRDCdtS50nKzNmlbbehguHKxsAARF2ZwltMEJqpPzKtM87NKbP9tUiHOXCQR0T2JcX09GicXUoAvUigJBBd/UwAsnX3ntdE0ib49soRqX0tj+7VSGskyd+G3LM447u+zlLd6mCNkTtipns29BHx8UWw24fDwU9ktMtcXmeueBkYuth7tAuQyyB80xVxmk726uCzX1VV4fZ9NJfSwNNZ7+BmJ/p1X+c52YnumZXFrFBzLK0xJ7AlmrDrZ5Ctyyixc2cudhdSTe3vlPRz5uFfju0eYe5AUAVduOfJLjEwRFIjiNDijbjK2VLjARkeCk5m9H8MCqabZgQdutPGltRF9MhklnCcgAHnJKluk1jhUMWmNm9WtRITPf/PXASwCvJ0HYpMwrHxVdT5rfWGoQ4LxhgeyBCBk02DyhLBmpLDxrlEgxpZVB0ac2eDDx0hk0kpG3m1l7h1MrlIHta14tqZyoGiBdI3G9BWw679uzudrmGtXy8owlKJwpQKv3+i0y1RFQd8P3KjJ0A0RAnSWGlc83siwCr6C8dmBjQBtMeT25FsaNMxXJF5EGN x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TYPPR06MB8206.apcprd06.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(18002099003)(22082099003)(56012099003)(38070700021)(3023799003);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: DQs4Ij6H2oLAPNxw8CWdKLGdxDMlezXizeMqtaIntVetEIqctXchZaedG5+vCTrpMYdLI3GQB0yzcbc4A6Kg4j3CCco8IWRhaXlgcurgr4NVwUh3kWIYEOuBHn/KHutfh2A80rM6JS/3ldpDiUgG2S6Fi2YD37kRA2D3j7l7pekd0sNLL4MALa8x9ngfFySKK2hfg9pSTWvpH+kZdQwVMk9KtSEnax2HuHPdTJO3BFj22aKIPiROO4Yfeo2ZM0XFU5mKIL+c/Unr423aYaIWxCIfExMWlbspRftIATaZl1u5bmqegt4AiO93GcEf5wMPSZ2kaTZ1dEOsCP2AV2oZ3JSAMuNWznxXE/A2NTV2hqx9ngbTxeectT//P9JspHhd3Lm8DTlPiNprvMg7G+EmrvSpXyOybJrPWj5pQPkvtqUBHs07mYQ3q/xbbxgpOgRs8HqNvzlEaIKGI7Cngs+UVZ1B7uIUf+x30XVUEDQWxadFFFJTYrwqi8Co/pzIgTtjjcrL1R4U44CfbUU/icy10M4mgieN5saQir7XYc0XHv/SHsoz1GjRwRCZju2IMW58qtyfH03+gaeijLy1zJ2/4q+U+aMIRSOcB9LSOhXXNt3pFvNl24/CVfx/tjxVUWSitnZN7uTus4cnn6+Nec76nsAvPE6YGt9sQDIReCtMZVpxu1f6F6U8KRJYQzUk5QHpiQyTS5f/4U6WTf3bDLjytR6SqAL560857kgZOrlD0AUJNFR/lmd0EOzrkpIDPB1r3GqVQ/JnrLnqHj+hMXis9wO7hKIiTCfh/Id7JyWt1CeC7Gw/0OJQiAmLwslInzloZwli0rQiQHnNZB4OU6H+PyL40M65ZOiv9pycJiUFHC87KyqllBT5RSCbepIiYAYmrGAwCdmIET6sl32AsNaO+X5+yDxtfOD6TIzjQy5r8NDk/KBEhhILbplxnCEXQ6o2NckL8Ppe/myt0gWPrGotAoYal3cVypla6SgyORlNgFXHl8skQG208ahpHmqYkwImGcg7jnbhzG+iZikltrQIdiKhbsJi6MNWIrBAYh/p7lqfdRtDec89mYDcaGS0aVVFdhn1FmFGUbVAzwnT2XOVXLkFv+4QeoTIs798CG8USSMNkyuNDZu6qbdyhPcwLNOre1z9kL1dBkP9xysJ5sotqYRfzDoWPuFRDyg+Bpk+TS5+pKONp8+3EjVuzhBZDL8+VitzvhRS48DdT1v9fD/U00/KQrVVwmv4gMwBe2zqDi6FAZNs0hUTdZx5z/mm8UGGEIVwETHZqaSXP7VSzPW6NSkvUu1jsnv20zTaugAVadi8wSLoCBuLLMEzDCRUUlIEYF2zegIo3Nc9vzE4pqge63nHJ7Yhh76yQd4vN1MoSVBRNfpqssVdkeYuNh3kt+qbsBZxA0mKrsxAcL2ZRNRqRtU7eJ4ddRaAA4/h4WajBFxJOpHUWhHadsey7TLk/WxubO4W3XD2EC3cFIfv8BZZiZ01XgIqInM8WDV3DDXOkNySlimwaBKv+YBPC1ICYlDJkQ9IkuliMJ1IJ07ci++Yb5D46hLuDwAphPz4rQWpCXaAMOjO4raC8MeWn5imGav+iWQG5uhht4ImK+8QSBy5kL1NBKU4vLmS06B1L1+Ca3Ee8ZfFuVVEM20CmS3WFAutug6p0ZiFJGZHkMTumEmmw74oQ6E9gOAZYTQK1OGJpi7PWNy7a8n+AXXIMb8wTPPuuB80MgoTLgwWhWY1Eky5MQ== MIME-Version: 1.0 X-OriginatorOrg: aspeedtech.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: TYPPR06MB8206.apcprd06.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2380c589-3348-4408-2c37-08deb2656ad5 X-MS-Exchange-CrossTenant-originalarrivaltime: 15 May 2026 09:36:18.1513 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 43d4aa98-e35b-4575-8939-080e90d5a249 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 2gcIwT1MyqS0AWsDr9CA9WZls19+72DWIoCKgMhbwcEPvOFVD0TR+InGbg+yXKa8O9CZEU4weNlomjuQ+OznbpUdqWSvoqZf1IODJGgRXcw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEZPR06MB5176 List-Id: X-Webhook-Received: from 45-33-107-173.ip.linodeusercontent.com [45.33.107.173] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 15 May 2026 09:36:31 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/openembedded-core/message/237074 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)' 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 --- 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():