From patchwork Mon Aug 24 11:29:57 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fredrik Svensson (svsvenss)" X-Patchwork-Id: 96156 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 C6EFAC5DF81 for ; Mon, 24 Aug 2026 11:30:05 +0000 (UTC) Received: from alln-iport-6.cisco.com (alln-iport-6.cisco.com [173.37.142.93]) by mx.groups.io with SMTP id smtpd.msgproc02-g2.14422.1787571000067750022 for ; Mon, 24 Aug 2026 04:30:00 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="dkim: message contains an insecure body length tag" header.i=@cisco.com header.s=iport01 header.b=HVtbNU7f; spf=pass (domain: cisco.com, ip: 173.37.142.93, mailfrom: svsvenss@cisco.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cisco.com; i=@cisco.com; l=5385; q=dns/txt; s=iport01; t=1787571000; x=1788780600; h=from:to:subject:date:message-id: content-transfer-encoding:mime-version; bh=eCQC98pI7XUP4Wr89RBc9pnhsYSnbppDdyHuuczgLnQ=; b=HVtbNU7fiUO+665JAaLLcmbw8kAaqMqaWo0Nko5gVAVtv79n5dA0TGzK X/BF/4k3alcnQ9rBpAmi+0FLkEHCi0HJ4rk9G/djiNXwIKd1EUVqXm9uD 5cGDNMs094ohl4uUbz1RAdxASTrR54DPNdM6NPnJlxL1KMlbHJmKU70Pg kDc5e1NzlroxXClN5DEyMQK+8geazrpv9Ph8v2iB7rwRPVHvL928sFTgH yn3AusZ8ylYOnR3uaJxZ/2YjuVpHGAWRWnaR0QPge40MnOEr349vA/0TD 4L9/RNWVArekXOu9Yb//EJMXBT2dLC5ODcAZ4lmdaKxQcA7cv5YV0omCY w==; X-CSE-ConnectionGUID: 7GUZzpq6TWiTxqv2eHLZBw== X-CSE-MsgGUID: XcV59yqeSuaU9kGYTN9wJQ== X-IPAS-Result: A0BcAgAMKoxq/4oQJK1agS6BK4FuUxZyAoEhSYgjA4UrhliCIZ4egX4PAQEBDQIxIAQBAYUFAo1sAiY0CQ4BAgQDAgMBAQEBAQEBAQEBAQsBAQUBAQECAQcFgQ4Thk8BDIdsAX8nBBMIgnuCdAMBArcFAolLGjd4gTSBAeAtAQsUAYE4iF4BhXiEfCcbgg2BFUKDJ4RFhBOCMASDLoREgReNf4FKHANZLAFVExcLBwWBZgMqLy1uMh2BIz4XNVgbBgWBHYEohBAjGTZ8gQlegSspZRIXgQmCBwKCWoIFAgFJQw4HRyILbT03FBkDBIE1BY5UH4F6RgcBFV4aASsXOUEHCCM6Qg8spDyhewqEHowilXAXhVulEZkII6NohQ0CBAIEBQIQAQEGgWg8gVlwFYMiCUoZD5gHxjV5PQEBBwIHDgMLgWiRfgEB IronPort-PHdr: A9a23:jcpFLRYGwvv8WoT6hK/QS/H/LTAchN3EVzX9orIuj7ZIN6O78IunY ArU5O5mixnCWoCIo/5Hiu+Dq6n7QiRA+peOtnkebYZBHwEIk8QYngEsQYaFBET3IeSsbnkSF 8VZX1gj9Ha+WXU= IronPort-Data: A9a23:EqRxjKB59egauRVW/3Xiw5YqxClBgxIJ4kV8jS/XYbTApGh0hWBRn DNOCmuAOKuKa2T0ctB0Ydu+8koFupWGyoBqOVdlrnsFo1CmBibm6XV1Cm+qYkt+++WaFBoPA /02M4eGdIZvCCeA+n9BC5C5xVFkz6aEW7HgP+DNPyF1VGdMRTwo4f5Zs7ZRbrVA357jXmthh fuo+5eBYA//h2YtWo4pw/vrRC1H7ayaVAww5jTSVdgT1HfCmn8cCo4oJK3ZBxPQXolOE+emc P3Ixbe/83mx109F5gSNy+uTnuUiG9Y+DCDW4pZkc/HKbitq+kTe5p0G2M80Mi+7vdkmc+dZk 72hvbToIesg0zaldO41C3G0GAkmVUFKFSOuzXWX6aSuI0P6n3TEnNpTPlMuJNMkxedLEXhQr /E4DAIncUXW7w626OrTpuhEj8AnKozveYgYoHwllWifBvc9SpeFSKLPjTNa9G5v3YYVQ7CHO YxAMmoHgBfoO3WjPn8MFokgkeGznVH0ciZTrxSeoq9fD237nFUvjeewb4CIEjCMbfVeoBvJt 3vLxHnwP0AZG+2j72ua0Ev504cjmgu+Aur+DoaQ/P92ilSQyykfBQMbUXO/oOKlkQi5Q99ZJ kke9yYioKR081akJuQRRDWxpHqC+xpZUN1KHqhisUeGy7Hf5ECSAW1soiN9VeHKffQeHFQC/ lSIhNjuQzdotdWopbi1r994cRva1fApEFI/ IronPort-HdrOrdr: A9a23:dtTIL6xGttBjdeTAs8ZOKrPxP+gkLtp133Aq2lEZdPULSL36qy n+ppQmPEHP6Qr5AEtQ5OxoWJPtfZquz+8I3WB3B8buYOCGghrjEGgM1/qY/9SNIVybygc/79 YtT0EdMqyLMbESt6+Ti2fIcadE/DDtytHPuQ6q9QYUcegcUdAY0+4WMHf9LmRGACN9Kd4SEp 2a6sBbpzymV0g2Q62AbEUtbqzonfGOsIjpTyInKncchTWmvHeF+bT6Gx+X0lMkVS9TwbAtyG 7BkwbozKSuufO2x3bnpiDuBpJt9+fJ+59mPoihm8IVIjLjhkKDf4J6QYCPuzgzvaWG9EsquM OkmWZgA+1Dr1fqOk2lqxrk3AftlBw07WX59FOeiXz/5eTkWTMBDdZbj44xSGqY16NghqA+7E t45RPdi3NlN2KFoM073amOa/herDv3nZPlq59Us5UQa/pGVFYbl/1hwKocKuZ/IMu90vFoLM BeSOfB+f1RbVSWK1rdvmVp3ZiQe05bJGbffqDH0fbliQS/WxtCvhAlLMBzpAZwyLstD5ZD/O jKKaJuifVHSdIXd7t0AKMbTdKwEXGle2OEDIu+GyWRKEg8AQO6l7fnpLEuoO26cp0By5U/3J zHTVNDrGY3P0bjE9eH0pFH+g3EBDzVZ0Wn9uhOo5xi/rHsTrviNiOODFgojsu7uv0aRsnWQe y6Np5aC+LqaWHuBYFK1QvjXIQ6EwhXbOQF/tIgH16eqMPCLYPn8uTdbfbIPbLoVS0pX2vua0 FzKAQb5P8wm3xDdkWI8iQ5AUmdCnAX1agAY5Tnww== X-Talos-CUID: 9a23:5ykc3mPBS/EKqO5DBwZaxlwMA54ZTXzh3G7OeUKYLVRDV+jA X-Talos-MUID: 9a23:tn5PBQhhyRa6CrAMwSsviMMpBMxWvvW/EU02jJw76sqrBBBWaii/tWHi X-IronPort-Anti-Spam-Filtered: true Received: from alln-l-core-01.cisco.com ([173.36.16.138]) by alln-iport-6.cisco.com with ESMTP/TLS/TLS_AES_256_GCM_SHA384; 24 Aug 2026 11:29:59 +0000 Received: from alln-opgw-4.cisco.com (alln-opgw-4.cisco.com [173.37.147.252]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by alln-l-core-01.cisco.com (Postfix) with ESMTPS id 05453180001AD for ; Mon, 24 Aug 2026 11:29:59 +0000 (GMT) X-CSE-ConnectionGUID: hpNafb4kQMqPY5tTp6XekA== X-CSE-MsgGUID: 9byEg1+ySuueZYZUUGHSTg== Authentication-Results: alln-opgw-4.cisco.com; dkim=pass (signature verified) header.i=@cisco.com X-IronPort-AV: E=Sophos;i="6.25,240,1779148800"; d="scan'208";a="84435369" Received: from mail-westus3azon11012023.outbound.protection.outlook.com (HELO PH8PR06CU001.outbound.protection.outlook.com) ([40.107.209.23]) by alln-opgw-4.cisco.com with ESMTP/TLS/TLS_AES_256_GCM_SHA384; 24 Aug 2026 11:29:58 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=m7ccCTA+yG+3zzXZIE0dBMEEtMxoCjnn+P9wjFgqvyOb3Mwmx6e4Xoc5cGJrqO7sfyPYZ4FnS/LSDtkcTELlFA4ga6Z+Oy9bytWC0wf7rOQfnfQhvEsQCRBnLtU0VcP2E0qJfoDbzWsIhWzb4W9GobBSxFM9NEafrZIOoRIYt67ReBF1GTIPBWfIX9CA9im4K+gusAUcZGJCWWqul8NOetBV/QHagba4s5AeSpoJXQ6/5QLY7Y+AJ06AKElxmqN45WNydKq9WmqwlNZZU1CKBx6sQydQJ1pgLtx+yzZ+MCdfPlEHz/EIEg3ZBRnqB9/tpxgAIbsHxUFY427j9tgGAQ== 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=eCQC98pI7XUP4Wr89RBc9pnhsYSnbppDdyHuuczgLnQ=; b=qflJTD0g6LVEj0RTbiun9aZrdOmRLYYjQkZo04szEqmuLK3UMx/j1b5WU2rpEArNkzqXD2YyPe/O8bdZGzqU9eAvsZ2ndEeQx26p7ZaTUb1Q4uMy9MEHPnXHh17EJ5KcHVO1523VIcH2XT1Q9sMPy69HWdbRIYQ4xbzfulUi/sGuy5iDv3lX9wHY+sFLTGGfSkJWtk16un7+CIvGIaQxUgAq3qc6ZaFtvppr6MVZC+mqSeW26q3uNLZ20yU7PlC0Idk4rpgY44itULT7luT0y8LGMCzT7oUjbO2TW84RLMHQ2Tb+VFxdwlyw3ztBPKtg/reuuNu+Vvr0s2osV+G+fA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=cisco.com; dmarc=pass action=none header.from=cisco.com; dkim=pass header.d=cisco.com; arc=none Received: from DM6PR11MB3962.namprd11.prod.outlook.com (2603:10b6:5:192::26) by MN2PR11MB4584.namprd11.prod.outlook.com (2603:10b6:208:264::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.339.8; Mon, 24 Aug 2026 11:29:57 +0000 Received: from DM6PR11MB3962.namprd11.prod.outlook.com ([fe80::47f3:254:87ca:5161]) by DM6PR11MB3962.namprd11.prod.outlook.com ([fe80::47f3:254:87ca:5161%5]) with mapi id 15.21.0339.012; Mon, 24 Aug 2026 11:29:57 +0000 From: "Fredrik Svensson (svsvenss)" To: "bitbake-devel@lists.openembedded.org" Subject: [PATCH v2] fetch2/git: replace stale clones when using premirrors Thread-Topic: [PATCH v2] fetch2/git: replace stale clones when using premirrors Thread-Index: AQHdM7u93YDDR9xguEGYgLnSEPKwPw== Date: Mon, 24 Aug 2026 11:29:57 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: x-ms-publictraffictype: Email x-ms-traffictypediagnostic: DM6PR11MB3962:EE_|MN2PR11MB4584:EE_ x-ms-office365-filtering-correlation-id: 7004c82e-fe20-4943-7843-08df01d306ca x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|23010399003|366016|376014|1800799024|38070700021|10067099003|56012099006|11063799006|3023799007|18002099003; x-microsoft-antispam-message-info: ZvsUE5f3Kq8joIeXN2X5Sc2eXYjCDR4+g/mFqJRXRYXNwziVRnvjuJh6FzvQof6A5o7ZS2ciDuN1+vgPQ04pc/SShYZVuVbQtoDeL3HAGKkIa+zWfeLqjYk+ZkSTpLrUBkrWcYYvh03Rktq0siDn6Q7pn6027YMZER7k7Nud/ggvyYUVODMSXsZMm0NQFfDMdGySAHg4KET/c/B0UFlhESmwvYRVW/dZACtXqkRxCqTGF3O5m1+KcqYDVV8MqJlJpdUniyWeFD1tYKmDbxgCr1eVoST81cy4QPK8W070tZN3GTL7pkwZEfY45qMywgGsek1EFiM9ZkpuvrDNswJ33eoIRoUTbOC04KRi/YGIlaICToHBKnHrzpzwPXb6VVf2XrA6SOxIf3Jb47du7xSh56BgtAOlHarHYeDirRVICzSOgZ/6xvyzTimimZs58eTdconB4JresvlAhw6KkFRpV/PQsqlSO+J2QmNkVl9GMpqIqj5/+wUs4kzC7KGK3e7fhPPiKkHe3nW/O5j79HYQEHMIWELgsE2/t0Jsol2+ODOhWaEufBFfgZ0myYZX1QwD2FSzuFPXXwqh7qC6heViZczmMQLu3KTkmQ15ozxWVOHOkA11auH8JKahJDSrkecIIzSH9oES6q+kL0L5m5Sa0CL/B0duGFj9OhX65tm0ac2P1+Gj7V4M0zpEHY8ADZ1ctAeAvTFe8jvvgxWIGGTWsxY4LAfSgJY3a1029bRd84E= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR11MB3962.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(366016)(376014)(1800799024)(38070700021)(10067099003)(56012099006)(11063799006)(3023799007)(18002099003);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?q?LsOmNxyFYdDbo8P2d7lJsfH?= =?iso-8859-1?q?QiGrVSJJnCZnAr5OwGHIgueeFWz/TsSCgSxdFrK5AZScIQTWNeI37o1lThza?= =?iso-8859-1?q?5PF6kRD+MOBgbvA6NE9bPwSnWkrnFg7IAL37Fmo21TyvYXQ9gO93y+agvQB3?= =?iso-8859-1?q?zL/+b/UmKVINc122/jhElWXMPs8humX1p/KsF8+9neZBdlmYLRw58Y4eW9bN?= =?iso-8859-1?q?pjZtZ1Y7+v0ETOuVIf3FAJMeF3o+5EGUHCaJdBTxa0n91nDubBCiJ6BxUAK6?= =?iso-8859-1?q?LSVqljJC+VX42aBaub8/o4ImuT/rNJDFIs/nidcEvrKlhIPN9d1bouJR5yd9?= =?iso-8859-1?q?jSqArfbPHopvRmni8RGQQzLmYSkekLHTWi9Z/lj9TTdN8vSfQzgqZkxZdWA/?= =?iso-8859-1?q?jGmSjEjnwiLRiZvatfl9FEKnkTrb98hJa50IBFydfNO8ioB0RIKCcJdChPcK?= =?iso-8859-1?q?IJk51r+Cjf6SZGRnIbwYdOKph+o/MQBL4XbL3LQkVydaijo7i3kBOX4mEbHw?= =?iso-8859-1?q?eUmgu2fvgzOULkhKtIkO2UcVi6mP5WihhiVODtkuCA3cdt4/XllJSqSXh5CV?= =?iso-8859-1?q?yYIFnXRCp+62KuAEvR5UpoHbVD0k+j1b9jB/t68Ve62icgb7FP1T+gbLrqYP?= =?iso-8859-1?q?g5SFWwQLrtAfrqtsTmmgJ/es5brLqotSuQ9KTqzrRV7d+hzKImXlrDUOaXcK?= =?iso-8859-1?q?Nc3/Tf2R+m8ZudXTOiXpw+kHYxZZ3STcXEGMBf5xEL1A4Qd7uDDhoymfpCgQ?= =?iso-8859-1?q?Pmgbtaun4MF+/RRSinM7xUJ1WtgAjlZKO4uVCtOu0TFPhpqf+wt/SpPBocDA?= =?iso-8859-1?q?P4pYdexQjrfDt5oGf7NKnrc1vy8dPTvJ69xnSHFj8oiHKEM9hOtdoIzYau9T?= =?iso-8859-1?q?bZR/M/A/BmVY/Bx20YM//YLs6JqjDFzkqGBC8e30mIQGIIRdq6ZQBJER6vsa?= =?iso-8859-1?q?zEaSPHsnoCrfMQtAa+Ym/A0AvcJMrOrGKDUQh/HZqS3eHv38gtK1VRFVoJ6w?= =?iso-8859-1?q?Kpy1Qv3k5HJId9urHwW1ZCIHj+05z7M/qouHKEf8qy52x9vW+g4enhmmgzOY?= =?iso-8859-1?q?1dOT0ZpiKGKqQQaYqhS1TVAri11VTpwJez6K8kHqOzbAOrU+XmmO4d5XLHzE?= =?iso-8859-1?q?v2Nwizay/48unpcznMXBodzGqkmMqqD5O5xI0byjWLKgopbuxhXLiL7mCTi7?= =?iso-8859-1?q?+ROKz8iRsxaiDjfZfD6HvOpEyeln07oa6wL4S+qba4QbPJtfNgdxr6GNi9Ir?= =?iso-8859-1?q?2eh6P1BsZddnjGBs/IrnHUmUns4w5nQDFw8JJc6YIn+FMow5AB+aUoIpUuW9?= =?iso-8859-1?q?6SC7vh5il28OAQuifwHfEAlCDrnn9v85+j3A/2NRPIQ4isWMqCDaP27exeEm?= =?iso-8859-1?q?HpspyVsNOBhj52TiswzlCRz3uUCFUMA2HGT4z17TuHP4ng0dR2maubufuP2q?= =?iso-8859-1?q?5NdJSaDvx99vidvuaRoh8zUZHOuAXJrHKHmLw16ZrBVLGP6OrPdOS0ZSY9P7?= =?iso-8859-1?q?VmWTI5dlsQalB3bV2b9KZhnC1naimwFIUt6JqI7x2edHDULFYVgg3uerLhQz?= =?iso-8859-1?q?cJ1dhSpRbLAbhbE6D9YMgEk1xtcPqK6JTuRoSINpwbiW28C/3bsZsrx6IHA4?= =?iso-8859-1?q?QMbrC7rrVMN7nTZQioUpTQOpPsikma07XW0skNNc3Ub5Q9aSoEL5UWXXfTEs?= =?iso-8859-1?q?7/R8Au0jVHVcWksYuD/SfDlab1CZEB79uDpiqpH2of08bThgop8S9+xMMl12?= =?iso-8859-1?q?2ElRoV0+zERomXwTgb/SI22PC?= MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: g4o9F6i/SEnAW+BX/Ho8O3a2v7Qgt5K0OZ2BdYCaNRxDusxK5S0jMAKZF4yg56vUMU6PBEF4sjoioQsq6Zn2woDpPzXs7HU1bjQPzzd/HnsnvoJ8EZd3D/NsPkx1h/6KRRdVV+7rQ+O6l4ms3ijdNMZyHvNa5b/EFLutQ2aAOg/VmnXiUxT1YJ9n6Zyrg7ngCeFxco/PwsgVIRfG2FXyiVxyIdYOdT5PzF7WBNJXd7VAkoBn1AIquVsVVSCcKb2bcEQF8pLd/RTlWdt1tBtiA8T/oMrNEgekHz4QXUnDKDeO9hAnM/WdS0vZyJvoC6wUuvtWi2V8/C393HcOWi55Yw== X-OriginatorOrg: cisco.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM6PR11MB3962.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7004c82e-fe20-4943-7843-08df01d306ca X-MS-Exchange-CrossTenant-originalarrivaltime: 24 Aug 2026 11:29:57.2999 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 5ae1af62-9505-4097-a69a-c1553ef7840e X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 7NF6a0QM5jCsGSrBSOfj8EIhN7t+5UO5QG/OgVRxD6V+fOML+BsE7vwznY5sCOLh0aNiB+RZ/gotOC9jPcGgQg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR11MB4584 X-Outbound-Client-TLS: ANONYMOUS;alln-opgw-4.cisco.com [173.37.147.252];TLSv1.3;TLS_AES_256_GCM_SHA384;256 X-Outbound-SMTP-Client: 173.37.147.252, alln-opgw-4.cisco.com X-Outbound-Node: alln-l-core-01.cisco.com 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 ; Mon, 24 Aug 2026 11:30:05 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/20025 A successful premirror fetch can leave an existing clone at the original download path even when it lacks SRCREV. The fetch is then stamped complete before unpack rejects the stale clone. Pass the datastore to update_mirror_links() and remove the original clone only when the Git validity check says it needs updating, allowing the successful mirror to be linked. The new self-test creates a stale clone at the original download path and a local premirror containing a newer SRCREV. Without the fix it reproduces the UnpackError; with the fix it verifies that the mirror is linked and the requested revision is unpacked. Tested with bitbake-selftest on Python 3.11, 3.12, 3.13, and 3.14. AI-Generated: OpenAI Codex Signed-off-by: Fredrik Svensson --- lib/bb/fetch2/__init__.py | 4 ++-- lib/bb/fetch2/git.py | 8 ++++++-- lib/bb/tests/fetch.py | 42 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/lib/bb/fetch2/__init__.py b/lib/bb/fetch2/__init__.py index 9cb268be..68a0225f 100644 --- a/lib/bb/fetch2/__init__.py +++ b/lib/bb/fetch2/__init__.py @@ -1150,7 +1150,7 @@ def try_mirror_url(fetch, origud, ud, ld, check = False): # This may also be a link to a shallow archive # When using shallow mode, add a symlink to the original fullshallow # path to ensure a valid symlink even in the `PREMIRRORS` case - origud.method.update_mirror_links(ud, origud) + origud.method.update_mirror_links(ud, origud, ld) update_stamp(origud, ld) return ud.localpath @@ -1692,7 +1692,7 @@ class FetchMethod(object): except FileExistsError: pass - def update_mirror_links(self, ud, origud): + def update_mirror_links(self, ud, origud, d): # For local file:// results, create a symlink to them # This may also be a link to a shallow archive self.ensure_symlink(ud.localpath, origud.localpath) diff --git a/lib/bb/fetch2/git.py b/lib/bb/fetch2/git.py index 0bb2ea39..a1f9cb33 100644 --- a/lib/bb/fetch2/git.py +++ b/lib/bb/fetch2/git.py @@ -353,8 +353,12 @@ class Git(FetchMethod): def tarball_need_update(self, ud): return ud.write_tarballs and not os.path.exists(ud.fullmirror) - def update_mirror_links(self, ud, origud): - super().update_mirror_links(ud, origud) + def update_mirror_links(self, ud, origud, d): + # Replace a stale clone which would prevent linking the successful mirror. + if self.clonedir_need_update(origud, d) and os.path.exists(origud.localpath) \ + and not os.path.samefile(ud.localpath, origud.localpath): + bb.utils.remove(origud.localpath, recurse=True) + super().update_mirror_links(ud, origud, d) # When using shallow mode, add a symlink to the original fullshallow # path to ensure a valid symlink even in the `PREMIRRORS` case if origud.shallow and not os.path.exists(origud.fullshallow): diff --git a/lib/bb/tests/fetch.py b/lib/bb/tests/fetch.py index a1e4b45f..65483570 100644 --- a/lib/bb/tests/fetch.py +++ b/lib/bb/tests/fetch.py @@ -616,6 +616,48 @@ class GitDownloadDirectoryNamingTest(FetcherTest): self.assertIn(self.recipe_dir, dir) +class GitPremirrorStaleCloneTest(FetcherTest): + + def test_premirror_replaces_stale_clone(self): + source = os.path.join(self.tempdir, "source") + os.mkdir(source) + self.git_init(cwd=source) + + testfile = os.path.join(source, "testfile") + with open(testfile, "w") as f: + f.write("first\n") + self.git(["add", "testfile"], cwd=source) + self.git(["commit", "-m", "first commit"], cwd=source) + + recipe_url = "git://upstream.invalid/project.git;branch=master;protocol=https" + self.d.setVar("SRCREV", self.git(["rev-parse", "HEAD"], cwd=source).strip()) + fetcher = bb.fetch.Fetch([recipe_url], self.d) + ud = fetcher.ud[recipe_url] + ud.setup_localpath(self.d) + os.makedirs(os.path.dirname(ud.clonedir), exist_ok=True) + self.git(["clone", "--bare", "--mirror", source, ud.clonedir], cwd=self.tempdir) + + with open(testfile, "a") as f: + f.write("second\n") + self.git(["commit", "-am", "second commit"], cwd=source) + revision = self.git(["rev-parse", "HEAD"], cwd=source).strip() + + self.d.setVar("SRCREV", revision) + self.d.setVar("BB_FETCH_PREMIRRORONLY", "1") + self.d.setVar("BB_NO_NETWORK", "1") + self.d.setVar("PREMIRRORS", "%s git://%s;protocol=file" % (recipe_url, source)) + + fetcher = bb.fetch.Fetch([recipe_url], self.d) + ud = fetcher.ud[recipe_url] + fetcher.download() + fetcher.unpack(self.unpackdir) + + self.assertTrue(os.path.islink(ud.clonedir)) + unpack_revision = self.git(["rev-parse", "HEAD"], + cwd=os.path.join(self.unpackdir, "git")).strip() + self.assertEqual(revision, unpack_revision) + + class TarballNamingTest(FetcherTest): def setUp(self): super(TarballNamingTest, self).setUp()