From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from shymkent.ilbers.de ([unix socket]) by shymkent (Cyrus 2.5.10-Debian-2.5.10-3+deb9u2) with LMTPA; Mon, 27 Jul 2026 14:36:51 +0200 X-Sieve: CMU Sieve 2.4 Received: from mail-ot1-f61.google.com (mail-ot1-f61.google.com [209.85.210.61]) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8+deb9u1) with ESMTPS id 66RCanDe002757 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Mon, 27 Jul 2026 14:36:50 +0200 Received: by mail-ot1-f61.google.com with SMTP id 46e09a7af769-7e9fbcd3a0esf2683052a34.1 for ; Mon, 27 Jul 2026 05:36:50 -0700 (PDT) ARC-Seal: i=3; a=rsa-sha256; t=1785155804; cv=pass; d=google.com; s=arc-20260327; b=PI+UQWS+4WHTHBKe3jd86vgvHUZKZinrWrJDIMwvVifA9zDTEjnONSn3XzouOOYa8M afJtqFYdIH75g5iba1ybQc6jmZ4XE3TUf43k6jnsbq8zwpAt+e6lDOzbCxRJmS/eXRgS TN5jLFEnqMX12bdde/QfriocVvpJ0Hk/xGUh3TmHxGCnCQi0OQfZSW121dfSUqbHYT3r GM2VOv7F24wMBOmi+3uUOhaNV2yBca3yi6VB+760x5g6H51F025qQyiEMLpcUZmH82oJ q7lf20xWOfofW/BCPwhswlY21OzJhVlh/t0cDQIM1QgQ+aEMeN/ltFHZ4gTSA+w24fYa pZNw== ARC-Message-Signature: i=3; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:reply-to:mime-version:in-reply-to :autocrypt:content-language:from:references:cc:to:subject:user-agent :date:message-id:dkim-signature; bh=WG99yvonzTCrnp5dhT0GwdcJkTtTcQxWfCTQzapJyJc=; fh=/xK2fBWZEwxx9aamT0mqv52wMuAD5Q2mYgl/qSLKDcU=; b=GqKnWKBYD45Te/5s/twOaUewUjfZ1BiHw68cKSIguy3SyF+294snJnFil8vLJuYjS8 Uw0fQHuy8T6iUNVnETORmiudk21lQcb+BiSjKFnzu6wsAXKOs8rbScFemwH2pPsZRGDb wzurnVEl0IMJ0ikSHdB1KCDhcrW3BogYmRH5etlKX5xvz9BbdhAci/BTdrj/HaI2gLRj YJz6B4v0gkzSmREdYYWaYdz/kNs55lrV85Vy6ek3stbb241o7lV83xTsjbWNzTEzVhHJ o/DuOQjR2Mpb/HLtecRrl6L98VDslqLCO9r6u+PN3/ckZDDZ0o9/5kbVA59yI4KEiHRc GghQ==; darn=ilbers.de ARC-Authentication-Results: i=3; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=selector2 header.b=ji5tPNjr; arc=pass (i=1 spf=pass spfdomain=siemens.com dkim=pass dkdomain=siemens.com dmarc=pass fromdomain=siemens.com); spf=pass (google.com: domain of quirin.gylstorff@siemens.com designates 2a01:111:f403:c200::1 as permitted sender) smtp.mailfrom=quirin.gylstorff@siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20251104; t=1785155804; x=1785760604; darn=ilbers.de; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:reply-to :x-original-authentication-results:x-original-sender:mime-version :content-type:in-reply-to:autocrypt:content-language:from:references :cc:to:subject:user-agent:date:message-id:from:to:cc:subject:date :message-id:reply-to:content-type; bh=WG99yvonzTCrnp5dhT0GwdcJkTtTcQxWfCTQzapJyJc=; b=GxjQkWLaaSDZ/NtLDno9oItuly3NvhyRpK4aKsqBtH7q/TON/B3G3DUxZL17wXtevG VBZ95aBEBRnuFzaAQQ5Gs7dGF0ZZ+QxHhot9xdp1TRdeOBZRqPZfV8r8RQqTRSilgWrD Jw1SWaU9gf/VRUtV/PS8lwEOf34FMQxlyVyiErmOrUECon8cWbZSEf9E91IYP9Ylup/C 3zy9mRu4Vz9SuRIty97d+BDD4p6g4XK4DfdFKZ6hlt/LsX4e+bf7mnrkgkMgmi7qima6 Sy9+bctPM5msR80FD2GeEqIoRT5Y253CBAPuzVKsAtyYIbQtdFJKOb/U+w5HRD8Ir3VF FBQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785155804; x=1785760604; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence:reply-to :x-original-authentication-results:x-original-sender:mime-version :content-type:in-reply-to:autocrypt:content-language:from:references :cc:to:subject:user-agent:date:message-id:x-beenthere :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=WG99yvonzTCrnp5dhT0GwdcJkTtTcQxWfCTQzapJyJc=; b=Xvz6UrV/k0uy7TpJsCNNJ4HfEC0uvhAatzJ7tphY2L52UT8zQgKKj48CYwEnS2w5yC 7GKN9IXYu4k3vdjR8UlejiiXXzY4yYpqSyaptQDJ1IkxzvnnwwCAp9KDaqZ9IQ7vKqY8 jD0pAAwvBeSwNADt4flMPdAF7ZIQJtyM41vTJZrS0Rp59iZ+UsztfRUHij+N3EGDQa2r OmUpABPv2MhXsmjPEKa0fyN9Z8+uc9kgvxk9Di3kmp6F9A1QH0Ngb3QqnnkQ2Qn9cTRS T3J7zsDbeBxGQywUpdyuYI86kADiBJGTTc44f1GfVq6KnzAXyNuhFVtn+K0B2RIaot63 Kd8w== X-Forwarded-Encrypted: i=3; AHgh+RoxJeM2D2c+CWPgOxX6vtZxAA5Dgf5eeEOIoCZY/1S02F0v14LMvNEWYNCmpxNLeCbFI4dJ@ilbers.de X-Gm-Message-State: AOJu0YxLoIqR37DBDtlb03X8JvhNwD/jflRuip7HqmzsbZHsPfhLajuF tJ9gIXVgeq/Z9uvxB3haSN0CvtkhwnEYiSaykWwnrZqGvSSmgnqb+8m3 X-Received: by 2002:a05:6820:4dec:b0:6aa:fe39:4c9f with SMTP id 006d021491bc7-6aaffd0f2e9mr6174625eaf.47.1785155804085; Mon, 27 Jul 2026 05:36:44 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com; h="Aa7YSPQkhgh6hRUd0dS8tXb2+0LStR3kneyGrqAAtLzAS/DSLA==" Received: by 2002:a05:6820:168c:b0:6aa:edca:e179 with SMTP id 006d021491bc7-6ab189a361dls466978eaf.1.-pod-prod-07-us; Mon, 27 Jul 2026 05:36:43 -0700 (PDT) X-Forwarded-Encrypted: i=3; AHgh+RptzTOQaGYkmDpFCYIP4D1nczIwdq44t6dQP96T2iu3Avv4HzSK+MD63dLcUah3eE36xKoHSR+nTu1Z@googlegroups.com X-Received: by 2002:a05:6820:2906:b0:6aa:e13e:ba39 with SMTP id 006d021491bc7-6aaffcb3724mr6434331eaf.43.1785155802989; Mon, 27 Jul 2026 05:36:42 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1785155802; cv=pass; d=google.com; s=arc-20260327; b=Ed100eU+f3SfOCIB5pXWeQiwTJDNyxSOSRiRhJFO2YrHbwY24v2RiPe/bmA7DuPLqd agQBK9jDsWxy0QDFL/iWL9KBdnLqvsxGtu1qNVxuiEpK5E5g9SkML6T05pDVXP+fiUla +MiTufUUbQPLhvCHwj7DHYLg/2llN7KcgKQxep3ZJN+Jv2rShvNPatb7xwq3p8WbKCxN JY3Sd+PoL9fkF/6cIH9Tx5Lr26r8MGnC8QY5DoO6UCeTL60rzbCW5DZPm4F7tbp/deOw zhxTFnS4diQyOdVG30APAdHz11UHbLTiFqm/xHpuOlJfYn4/7SsPYVqh9zU7nyaVxx0e Emhg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=mime-version:content-transfer-encoding:in-reply-to:autocrypt :content-language:from:references:cc:to:subject:user-agent:date :message-id:dkim-signature; bh=ecgd9/vt8ECcS/68WqhqFawuUB1P1VfEUZWgAlyibWk=; fh=/OeViBSLkmUJS7ximLEeJodBQEVkPsKhqoGgGrMAVt8=; b=dzC81U9ZyZX/XR6rtuZhoNdsy1532bRGOYCd+i+yCZkwZZSyZ51QNHl3nE+QQHkK6I UD7hDcreexS928gBNCGILdxDKwP1iBHS1Qg+YSvi37hVe3TEQ2CtKGdFg1y2/wZZjY+l XdW+555hffYCGh/R8m/YkH6kU/ljkjiRZv0rui0kR/myE2BQI/31qO2Txm1l5Oo/roc+ gAD+LK7bdeRgrb0kM3MFnQDqPk3av12uPcQxMy+gNZ9RL/x6QT50r5C3Cs7wtYkiYIHm H/26X/XxYMv/tiCyfoA1ewRSHZ/HrYyrbZagzjHKeQXaY1NKjIzMQ5vRlMdzj0+b6SJ7 hJbw==; dara=google.com ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=selector2 header.b=ji5tPNjr; arc=pass (i=1 spf=pass spfdomain=siemens.com dkim=pass dkdomain=siemens.com dmarc=pass fromdomain=siemens.com); spf=pass (google.com: domain of quirin.gylstorff@siemens.com designates 2a01:111:f403:c200::1 as permitted sender) smtp.mailfrom=quirin.gylstorff@siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazlp170100001.outbound.protection.outlook.com. [2a01:111:f403:c200::1]) by gmr-mx.google.com with ESMTPS id 586e51a60fabf-45767276c90si532073fac.3.2026.07.27.05.36.42 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Jul 2026 05:36:42 -0700 (PDT) Received-SPF: pass (google.com: domain of quirin.gylstorff@siemens.com designates 2a01:111:f403:c200::1 as permitted sender) client-ip=2a01:111:f403:c200::1; ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=uihkGgcJjrYbPQ4oAgANLMbP2gRq0/SjD4kr/H5HkKl6jMkhRAYSLKfBhfk/73PFl/VTyzyX6RZLiIoyq4vdWZ+c4q9BhEwmcg9/WR3XC7v++QPljrAm/BNKxNiXwzqMfKxeUgI0BY70VkfJbjlMCx2Q6JT/LsWWOuVwkV8S76vmrlA7TZxEfWh/aqiPEcbDLTK5bLtQYQ+FuAFiuP/HA7X27gZn4YBaAAs3eJXku22wr7yIbNK/pQvUkmaqyrlw5LJDckQR97xdB8xLcZmV+UvHCndGRnAl10Bts7N5/bujSF+bXHtE5EqewTc2+9jHZXWp+7PllaLCEyGiEIgXKg== 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=ecgd9/vt8ECcS/68WqhqFawuUB1P1VfEUZWgAlyibWk=; b=N054rV96kDRqb1fMgBpFmSIxg82tjw0Lji8tQZcGj+Y7x/mcIYqutdMX7fu8TafjFl66Oxir39cIvRFyfdKAWfYdzTRSL4DSGukEPkvZNqLSW98HftxC+9QJZ3gmaOFgBUqY3oFVvZExq5NLbHpg6FZOiNMJNvHACvB1P8cZ+2if5upLaU3Y231hh/AxKCYgg/fn1upNX71matELGIYOkfUjyFSzkx8OhmrzQjoutu2bIhCPCtQ0x6kHAkee7QHmpmOO4En+jTDJp26RUGn9xpbukQ0XE+akdyego2jZR722VA4nLkl7sPkbqdQddB8pZkzxeCqDyUch1UlIeXu15g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=siemens.com; dmarc=pass action=none header.from=siemens.com; dkim=pass header.d=siemens.com; arc=none Received: from DB8PR10MB3178.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:10:113::12) by PA2PR10MB8327.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:102:41c::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.245.13; Mon, 27 Jul 2026 12:36:39 +0000 Received: from DB8PR10MB3178.EURPRD10.PROD.OUTLOOK.COM ([fe80::ae26:d131:7cff:4001]) by DB8PR10MB3178.EURPRD10.PROD.OUTLOOK.COM ([fe80::ae26:d131:7cff:4001%5]) with mapi id 15.21.0245.012; Mon, 27 Jul 2026 12:36:39 +0000 Message-ID: <0bb0f167-54b7-4f11-abde-ec3ee6c44c8f@siemens.com> Date: Mon, 27 Jul 2026 14:36:38 +0200 User-Agent: Mozilla Thunderbird Subject: Re: [v8 01/14] scripts: Add debrepo python script handling base-apt To: Aliaksei Karpovich , isar-users@googlegroups.com Cc: Uladzimir Bely References: <20260727112812.2255297-1-akarpovich@ilbers.de> <20260727112812.2255297-2-akarpovich@ilbers.de> From: "'Quirin Gylstorff' via isar-users" Content-Language: en-US Autocrypt: addr=quirin.gylstorff@siemens.com; keydata= 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 Z2NBPBZUysw= In-Reply-To: <20260727112812.2255297-2-akarpovich@ilbers.de> Content-Type: text/plain; charset="UTF-8"; format=flowed X-ClientProxiedBy: FR0P281CA0189.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:ab::20) To DB8PR10MB3178.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:10:113::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DB8PR10MB3178:EE_|PA2PR10MB8327:EE_ X-MS-Office365-Filtering-Correlation-Id: 3853b9e3-b7b9-4fe4-57c3-08deebdbb470 X-MS-Exchange-AtpMessageProperties: SA X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|23010399003|366016|1800799024|6133799003|10067099003|56012099006|5023799004|11063799006|4143699003|18002099003|22082099003|55112099003|3023799007; X-Microsoft-Antispam-Message-Info: T6iw53p1imjjrTZuQt2Htx/1pafjPeP1W8hZwYnvD2CT40Uu9ViHAFAt4pIK8jRtI/mlB3Cs8U8KEUqX8MLjV8PFVfvG1kCc/QamOWuIg3KD1VMi3H0PyNT219VjmUMr9/1I57RW8D1IfdLjnQXZRMdB3umlRmOW6nzyTNHUr6rWpBTrA6mbF9eN9SJE5pTDznuLj1YHSwdtugWBYmMpOExVxR+JQnI9fF8IAwm8BWOePRvhJxYeDOrS/+Ibo5HX2/NP/1X9pwhsKZzTgqVRzP4xNUZM65qgi93a0bOhTqbauHYuazb6No/xU8nl72vYG0ctzTWVkCdbd34Txxj9gjbdlRcZ/mEyUDIneIQEy/0pDLmwX4oAAhqzKQ1J0qzZ0CcWGb3ZaJCMWUsjeCsw90oFldUVmN+ZwEat0xy+u76ciebLakYWqH578s3ntRRABwMpdpx/I9CUxM5Xzypn3+JFyrzlVqaiFrJ9Ow+9IVDbMZ2BOcBeV0Zeomwegz414mNNp8frU/RhzCH1ru0XhK2NLpotLs8oCSAQjb03vVW8XBWiv4YxSZBSHzclbgubFda8vV3V9edzWbwwePHEPy/XV48JkctEZv9GzymyK2XHuZpIlWQW2A5hx8h2lNRNprK+hDJlsvJIFiePw51GSa0yQxQN5/XvZ7zKX97lJVM= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB8PR10MB3178.EURPRD10.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(23010399003)(366016)(1800799024)(6133799003)(10067099003)(56012099006)(5023799004)(11063799006)(4143699003)(18002099003)(22082099003)(55112099003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?c0t2eHdxVnNxYmMzN1VxL0tWZG9kN0xheGVuWFg3ZUZCT2VMODdOeGVZcjE0?= =?utf-8?B?ZDROS2xBRmg2UjhLUGhnNE1HM25PMTVYd3ZGWExRL0htWnA0MU1ySDZxVUpz?= =?utf-8?B?SWR2S0l1MFpVZFJVV3E5dzRNbFBnRmtVQXhUWGRmR3lMRTlDTWFJbkpyWExQ?= =?utf-8?B?aGlMK0Z4aDZlbXhkaDdwVENvaUtGa3VDcnZxTGJGU3crU1RvczFyOVhWQ3Ni?= =?utf-8?B?S0FNS3V5cklhZCtwcUtpZGRIOHV5YXl2SG1vSHYya29JRU9QcXpDK3JmblFq?= =?utf-8?B?cGZRNzB6T0ZqUEFEcUFhWWJTaGJmM1RvTHlSU0hvWDViYlZZVk4wY2xiSUZo?= =?utf-8?B?K3g3RytMVUIyQzlYakxpV2VjUVRHc08vYWd3MW8xVlZ3Nyt5U1hHOFdWRDJk?= =?utf-8?B?RWJoM1NTREMrbGEvSUdnTGxaYWZSZFEraXorNmFnMXBkNG9vYndRUDZTeWRP?= =?utf-8?B?dzdZZVhxSEdrSmRsRXBnV1BsVjdBVlhXSHhKMjY1Zlh2MU1YNzZjQTh5T2F6?= =?utf-8?B?WFpDTXMzQTdhQUlGVzV5cW15OXNEUk4xRjNvNnBFK3k2d1BaWDNub3JPT0tn?= =?utf-8?B?Q05kNE5qenFJdWFMS1lOVmU3bkdUdlpCSzRqMUFwQ3A3b3E1QzdjN1Z5NUto?= =?utf-8?B?emZLdENYNWtBaGFRWUxicUk1ZDhhZTFMUGVJc0xYQlkrd0RFZm1JemJ5eEdo?= =?utf-8?B?Rk54N1RiVk9PNjNGOTNiSElQOHJSV2FSVmN1NHplTTl0Z2dBMEQ4anV2azZ0?= =?utf-8?B?TFFoMVJCQkNjT21SbW1tY2tIeVpnL0twb0drd3VZVnNyTDUvYjBkMElZdzdq?= =?utf-8?B?MjV1cGx5QWpQQndpSFozb0RNNWYrMlJqUWp6UVRBT3NOV3FhSENxMk1rd0Jr?= =?utf-8?B?a3FXNWg1RG5tUHBoN2FrckcyN2ZLU0o4K1NidmJVMERtMnhUcG5wOENaUWQv?= =?utf-8?B?b0t1cG1zNkgvcGZBYzFDdEpJTEZRNzg0eGZLWnpPSnJWMmNqRmg4RStOc25U?= =?utf-8?B?UzNWTzlJa0FQTVRTV292Z2VBOUViSC9YUWs5YnB4QnhaamV2ZE9Tc3RPaFFT?= =?utf-8?B?WWNpSlpUQ1c3SXVmMlBjandXTkhjS3dDWjRBWk50blptS2kybDhaVHlBQmVi?= =?utf-8?B?U0J3dDFYUklrMXhGSmYvdDlTOUp1cmxwR0VabEdERGlGMWdFTGhpOFc1UnFB?= =?utf-8?B?Y21Xbzl2MnhwTDNvQWd0R1g0am9BOTljaDExRnFwcVBBdUMzdEVWdVpzQWlh?= =?utf-8?B?eFdXUXNMVlh5V3AyM2RGb2tkZWI3SHRnUW4zYkVxd3cva29CSHY2UEdWRllv?= =?utf-8?B?M1h2ZGpVUUU1dTdseDdoS1pJWjRxdytxWlNkZ2FKbHdyWUo0eG9QRDFZai9U?= =?utf-8?B?dDhOYS85V01QWG1RMGV6NEVXYm9vdHRxM25kdDYvNURiVUJIZ0NmeGh5akpt?= =?utf-8?B?R0NiZmg4Q2UyQW5SWldiMnYvUUFmK1E1ZUNnYXhsdVp3YzhNTGNiN3Z2TmJO?= =?utf-8?B?K3ZTTG1Zb2M5U0VWNCtHV2x4bWlicU9QWEQzdHQ0YkcxNkQwWG5oUzlFRWhF?= =?utf-8?B?clpsMnluWWNUbjNXclhYWlZuNFVuZUFVYmxpU0xIYXExRitaT1hFZVAxMms2?= =?utf-8?B?NWovZlNDWDZHWXZjWjBMOUZzMnRvSEpyS2VDci9oaUovbzVPQ0dKUzgwd2ND?= =?utf-8?B?ZlJwK0pLYTArc3hwaEhWdDVaVkt5UXVET2FnTGVoR2ZTRlBoVURJaFd2SjBn?= =?utf-8?B?QWdPdkRCeEdCdXc5Zko1YWduSG51WUJmb3JERUo5MEtkSy96S2JSekJyUE9v?= =?utf-8?B?ZnQxeGJkUFREeGJiWXFFdU9hS2dTaXN5bGtnU3NxemxRRFY2amRzRU9TRUsr?= =?utf-8?B?L0dNR2ZWRktoWXlPdDNKRHJDU2ljQmFSTjlBcTd0MTcvYVZqSGllNkMvSFl0?= =?utf-8?B?R2dYUkNEV0hTU2w1c2dML2pXVkgxYVloYWtSL05PMmZsVThJZWhuTGs2cXA2?= =?utf-8?B?V3BIVHF6dkZIRkRlbFVJL3JUV0FMQy9ReDhsL2s2TU1ja3hLZS84bHZibDRJ?= =?utf-8?B?YWtwSDgrUkxqS1poSHpBVlFNQlRBL2N6czl1Skt6Q25UeXp5amxOdG5OWi9v?= =?utf-8?B?bGJkb3ZuczkyMHYvYzlwTFhIcXZtN1E1OG9mcnFmZW9LbHRackEwdHd2VktO?= =?utf-8?B?VGw4NzFlQXpteVduY1pPdWVKUzVSd0pJeXpySHIwWEFsTTNDN0NTYUpTcm8w?= =?utf-8?B?cllvaktnUFFuUTFucnJvVlRpWjBaaStYbjd6d3pvY0lkQzh4QjQwZjJDUDZU?= =?utf-8?B?Z3gxZzFtR2JWY2FOVjhWWjRwUEcyL2NzN0ZmSHllRG1pSWJqR0Z6bFpwSFVV?= =?utf-8?Q?VbOvxVqPZurHt2YI=3D?= X-OriginatorOrg: siemens.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3853b9e3-b7b9-4fe4-57c3-08deebdbb470 X-MS-Exchange-CrossTenant-AuthSource: DB8PR10MB3178.EURPRD10.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jul 2026 12:36:39.2103 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 38ae3bcd-9579-4fd4-adda-b42e1495d55a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: azCQ0P4+So2B9BMVEvnggWXU9gRM3kZS9hYJ1KdoYpvgWFQ+NZ0J9Xm9//JizIf3H3VIaFYyr2t6kLKH0eYzweuK2c+w/DL4HffFctK6MQc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA2PR10MB8327 X-Original-Sender: quirin.gylstorff@siemens.com X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@siemens.com header.s=selector2 header.b=ji5tPNjr; arc=pass (i=1 spf=pass spfdomain=siemens.com dkim=pass dkdomain=siemens.com dmarc=pass fromdomain=siemens.com); spf=pass (google.com: domain of quirin.gylstorff@siemens.com designates 2a01:111:f403:c200::1 as permitted sender) smtp.mailfrom=quirin.gylstorff@siemens.com; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=siemens.com X-Original-From: Quirin Gylstorff Reply-To: Quirin Gylstorff Precedence: list Mailing-list: list isar-users@googlegroups.com; contact isar-users+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: isar-users@googlegroups.com X-Google-Group-Id: 914930254986 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , X-Spam-Status: No, score=-4.9 required=5.0 tests=DKIMWL_WL_MED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL, RCVD_IN_RP_CERTIFIED,RCVD_IN_RP_RNBL,RCVD_IN_RP_SAFE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shymkent.ilbers.de X-TUID: rm5Bk/D/xjxS On 7/27/26 1:26 PM, Aliaksei Karpovich wrote: > From: Uladzimir Bely > > This is the main utility responsible for prefetching packages > into local `base-apt` repo from external Debian mirrors. It uses > python-apt module and requires some kind of minimal `rootfs` to work > (let's call it "debrepo context"). This has a naming clash with https://github.com/filiprojek/debrepo. I would suggest another name. Does this work with newer releases of apt as it uses the host apt? > > Once initialized with `--init --workdir=`, it stores the initial > configuration in `repo.opts` file inside the context and uses it at > futher calls. > > In future, the logic `debrepo` script implements could be directly > implemented inside bitbake classes. > > Signed-off-by: Uladzimir Bely > --- > scripts/debrepo | 589 ++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 589 insertions(+) > create mode 100755 scripts/debrepo > > diff --git a/scripts/debrepo b/scripts/debrepo > new file mode 100755 > index 00000000..81056c3a > --- /dev/null > +++ b/scripts/debrepo > @@ -0,0 +1,589 @@ > +#!/usr/bin/env python3 > + > +""" > +# This software is a part of Isar. > +# Copyright (C) 2026 ilbers GmbH > + > +# debrepo: build Debian-like repo using "python3-apt" library. > + > +When building the image, Isar downloads required Debian packages from external > +mirrors. After build completed, it can pick all downloaded packages from DL_DIR > +and build local 'base-apt' Debian-like repo from them. > + > +This tool allows to download packages and create local repo in advance. So, > +Isar just uses this local repository and does not interact with external > +mirrors. Such approach makes deb-dl import/export functionality redundant. > + > +Script `debrepo` works in so-called "context" directory. It means some > +rootfs-like directory with bare minimum of directories/files required for > +python3-apt to work. > + > +Context directory path is passed with "--workdir " command-line option. > +On context creating, all passed parameters are stored in the context directory > +and picked every time the context is used again. > + > +1. Repo for building Debian system > +``` > +debrepo --workdir=d12 --init locales gnupg > +``` > +Initialize the context in "d12" directory and create a repository in > +"d12/repo/apt" directory sufficient to debootstrap default system > +(e.g., debian-bookworm-amd64). Additionally, packages "locales" and "gnupg" > +with all their dependencies will be available in this repo. > + > +``` > +debrepo --workdir=d12 docbook-to-man > +``` > +Adds "docbook-to-man" packages with its dependencies to earlier created repo. > + > +``` > +debrepo --workdir=d12 --srcmode docbook-to-man > +``` > +Downloads source package for "docbook-to-man" and adds it to the repo > + > +2. Repo for building Ubuntu system > +``` > +debrepo --init --workdir=uf \ > +--distro=ubuntu --codename=focal --arch=arm64 \ > +--aptsrcsfile=/work/isar/meta-isar/conf/distro/ubuntu-focal-ports.list \ > +--repodir=repo/apt --repodbdir=repo/db \ > +--mirror=http://ports.ubuntu.com/ubuntu-ports \ > +locales gnupg > +``` > +Initialize the context in "uf" directory and create a repository in "repo/apt" > +directory sufficient deboostraup ubuntu-focal arm64 system. Mirror to use and > +source list are specified by corresponding arguments. Packages "locales" and > +" gnupg" with the dependencies will be also placed to the repo. > + > +``` > +debrepo --workdir=uf gnupg,locales > +``` > +Add "gnupg" and "locales" packages with their dependencies to earlier created > +ubuntu repo. Other parameters (distro, codename, arch) are ommited since they > +are picked from the context. > + > +3. Repo for cross-building Debian system > +``` > +debrepo --init --workdir=d11 --codename=bullseye--arch=amd64 --crossarch=armhf > +``` > +Initialize the context in "d11" directory sufficient to deboostrap Debian > +Bullseye (amd64) with foreign "armhf" architecture support > + > +``` > +debrepo --workdir=d11 gcc > +``` > +Add "gcc" package (amd64 version) to earlier created repo. > + > +``` > +debrepo --workdir=d11 --crossbuild gcc > +``` > +Add "gcc" package (armhf version) to earlier created repo. > +""" > + > +import os > +import sys > +import fcntl > + > +import argparse > +import shutil > +import subprocess > +import pickle > +import urllib.parse > + > +import apt_pkg > +import apt.progress.base > + > + > +REPREPRO_TIMEOUT = 1200 > + > + > +class DebRepo(object): > + class DebRepoCtx(object): > + def __init__(self, workdir): > + self.distro = "debian" > + self.codename = "bullseye" > + self.arch = "amd64" > + self.mirror = "http://deb.debian.org/debian" > + > + self.repodir = f"{workdir}/repo/apt" > + self.repodbdir = f"{workdir}/repo/db" > + > + self.crossarch = self.arch > + self.compatarch = None > + self.keydir = "/etc/apt/trusted.gpg.d" > + > + def __init__(self, args): > + self.workdir = os.path.abspath(args.workdir) > + self.ctx = self.DebRepoCtx(self.workdir) > + > + self.cache = None > + self.depcache = None > + self.sr = None > + self.extrarepo = None > + > + self.ctx_load() > + self.ctx_update(args) > + self.ctx_save() > + > + print( > + f"ctx workdir: {self.workdir}\n" > + f" distro: {self.ctx.distro}\n" > + f" codename: {self.ctx.codename}\n" > + f" arch: {self.ctx.arch}\n" > + f" mirror: {self.ctx.mirror}\n" > + f" repodir: {self.ctx.repodir}\n" > + f" repodbdir: {self.ctx.repodbdir}\n" > + f" crossarch: {self.ctx.crossarch}\n" > + f" compatarch: {self.ctx.compatarch}\n" > + f" keydir: {self.ctx.keydir}" > + ) > + > + if args.extrarepo: > + self.extrarepo = os.path.abspath(args.extrarepo) > + > + def ctx_load(self): > + ctxfile = f"{self.workdir}/debrepo.ctx" > + > + if os.path.isfile(ctxfile): > + with open(ctxfile, 'rb') as f: > + self.ctx = pickle.load(f) > + > + def ctx_save(self): > + ctxfile = f"{self.workdir}/debrepo.ctx" > + > + with open(ctxfile, 'wb') as f: > + pickle.dump(self.ctx, f) > + > + def ctx_update(self, args): > + if args.distro: > + self.ctx.distro = args.distro > + if args.codename: > + self.ctx.codename = args.codename > + if args.arch: > + self.ctx.arch = args.arch > + if args.mirror: > + self.ctx.mirror = args.mirror > + > + if args.repodir: > + self.ctx.repodir = os.path.abspath(args.repodir) > + if args.repodbdir: > + self.ctx.repodbdir = os.path.abspath(args.repodbdir) > + > + if args.crossarch: > + self.ctx.crossarch = args.crossarch > + if args.compatarch: > + self.ctx.compatarch = args.compatarch > + if args.keydir: > + self.ctx.keydir = args.keydir > + > + def create_rootfs(self, aptsrcsfile): I would call it create_context_rootfs like in the description. > + os.makedirs(f"{self.workdir}/var/lib/dpkg", exist_ok=True) > + with open(f"{self.workdir}/var/lib/dpkg/status", "w"): > + pass > + > + os.makedirs(f"{self.workdir}/etc/apt/sources.list.d", exist_ok=True) > + > + srcfile = f"{self.workdir}/etc/apt/sources.list.d/bootstrap.list" > + if aptsrcsfile and os.path.exists(aptsrcsfile): > + shutil.copy(aptsrcsfile, srcfile) > + else: > + with open(srcfile, "w") as f: > + repo = f"{self.ctx.mirror} {self.ctx.codename} main" > + f.write(f"deb {repo}\n") > + f.write(f"deb-src {repo}\n") > + > + dir_cache = f"../apt_cache/{self.ctx.distro}-{self.ctx.codename}" > + os.makedirs(f"{self.workdir}/{dir_cache}/archives/partial", > + exist_ok=True) > + > + os.makedirs(f"{self.workdir}/tmp", exist_ok=True) > + > + def create_repo_dist(self): > + conf_dir = f"{self.ctx.repodir}/{self.ctx.distro}/conf" > + os.makedirs(conf_dir, exist_ok=True) > + if not os.path.exists(f"{conf_dir}/distributions"): > + with open(f"{conf_dir}/distributions", "w") as f: > + f.write(f"Codename: {self.ctx.codename}\n") > + f.write( > + "Architectures: " > + "i386 armhf arm64 amd64 mipsel riscv64 source\n") > + f.write("Components: main\n") > + > + def apt_config(self, init, crossbuild): > + if not init and self.ctx.compatarch: > + apt_pkg.config["APT::Architectures::"] = self.ctx.compatarch > + > + if not init and self.ctx.arch != self.ctx.crossarch: > + apt_pkg.config["APT::Architectures::"] = self.ctx.crossarch > + apt_pkg.config["APT::Architectures::"] = self.ctx.arch > + > + apt_pkg.config.set("APT::Architecture", self.ctx.arch) > + > + apt_pkg.config.set("Dir", self.workdir) > + > + dir_cache = f"../apt_cache/{self.ctx.distro}-{self.ctx.codename}" > + apt_pkg.config.set("Dir::Cache", f"{self.workdir}/{dir_cache}") > + apt_pkg.config.set("Dir::State::status", > + f"{self.workdir}/var/lib/dpkg/status") > + > + apt_pkg.config.set("APT::Install-Recommends", "0") > + apt_pkg.config.set("APT::Install-Suggests", "0") > + > + # Use host keys for authentification > + apt_pkg.config.set("Dir::Etc::TrustedParts", self.ctx.keydir) > + > + # Allow using repositories without keys > + apt_pkg.config.set("Acquire::AllowInsecureRepositories", "1") > + > + def mark_essential(self): > + for pkg in self.cache.packages: > + if pkg.architecture == self.ctx.arch: > + if pkg.essential: > + self.depcache.mark_install(pkg) > + > + def mark_by_prio(self, priority): > + for pkg in self.cache.packages: > + if pkg.architecture == self.ctx.arch: > + ver = self.depcache.get_candidate_ver(pkg) > + if ver and ver.priority <= priority: > + self.depcache.mark_install(pkg) > + > + def mark_pkg(self, name, crossbuild): > + pkgname = name > + > + if pkgname and (pkgname not in self.cache): > + # Try for cross arch > + if (pkgname, self.ctx.crossarch) in self.cache: > + pkgname += f":{self.ctx.crossarch}" > + > + if pkgname not in self.cache: > + print(f"Error: package '{name}' not found") > + return False > + > + pkg = self.cache[pkgname] > + > + if (not crossbuild) or (':' in pkgname) or (not pkg.has_versions): > + if (pkg.has_provides) and (not pkg.has_versions): > + print("pkgname is virtual package, selecting best provide") > + # Select first provide > + pkg_provide = pkg.provides_list[0][2] > + # Find better provide with higher version > + for provide in pkg.provides_list: > + if apt_pkg.version_compare(provide[2].ver_str, > + pkg_provide.ver_str) > 0: > + pkg_provide = provide[2] > + self.depcache.mark_install(pkg_provide.parent_pkg) > + else: > + self.depcache.mark_install(pkg) > + else: > + version = pkg.version_list[0] > + if version.arch == "all": > + self.depcache.mark_install(pkg) > + else: > + if version.multi_arch == version.MULTI_ARCH_FOREIGN: > + if (pkgname, self.ctx.arch) in self.cache: > + nativepkg = self.cache[pkgname, self.ctx.arch] > + self.depcache.mark_install(nativepkg) > + else: > + return False > + else: > + if (pkgname, self.ctx.crossarch) in self.cache: > + crosspkg = self.cache[pkgname, self.ctx.crossarch] > + self.depcache.mark_install(crosspkg) > + else: > + return False > + > + return True > + > + def mark_list(self, pkglist, crossbuild): > + ret = True > + if pkglist: > + for pkgname in pkglist: > + ret = ret and self.mark_pkg(pkgname, crossbuild) > + > + return ret > + > + def handle_deb(self, item): > + fd = open(f"{self.ctx.repodir}/repo.lock", 'w') > + fcntl.flock(fd, fcntl.LOCK_EX) > + subprocess.run([ > + "reprepro", > + "--dbdir", f"{self.ctx.repodbdir}/{self.ctx.distro}", > + "--outdir", f"{self.ctx.repodir}/{self.ctx.distro}", > + "--confdir", f"{self.ctx.repodir}/{self.ctx.distro}/conf", > + "-C", "main", > + "includedeb", > + self.ctx.codename, > + item.destfile > + ], timeout=REPREPRO_TIMEOUT) > + fd.close() > + > + def handle_repo(self, fetcher): > + dir_cache = f"../apt_cache/{self.ctx.distro}-{self.ctx.codename}" > + fd = open(f"{self.workdir}/{dir_cache}.lock", "w") > + fcntl.flock(fd, fcntl.LOCK_EX) > + fetcher.run() > + fd.close() > + for item in fetcher.items: > + if item.status == item.STAT_ERROR: > + print("Some error ocured: '%s'" % item.error_text) > + pass > + else: > + self.handle_deb(item) > + > + def get_filename(self, uri): > + path = urllib.parse.urlparse(uri).path > + unquoted_path = urllib.parse.unquote(path) > + basename = os.path.basename(unquoted_path) > + return basename > + > + def fetch_file(self, uri): > + filename = self.get_filename(uri) > + subprocess.run([ > + "wget", > + "-H", > + "--timeout=30", > + "--tries=3", > + "-nv", > + uri, > + "-O", > + f"{self.workdir}/tmp/{filename}" > + ], > + stdout=subprocess.PIPE) This adds the new dependency wget. Please add to the user_manual.md Quirin > + > + def handle_dsc(self, uri): > + filename = self.get_filename(uri) > + fd = open(f"{self.ctx.repodir}/repo.lock", 'w') > + fcntl.flock(fd, fcntl.LOCK_EX) > + subprocess.run([ > + "reprepro", > + "--dbdir", f"{self.ctx.repodbdir}/{self.ctx.distro}", > + "--outdir", f"{self.ctx.repodir}/{self.ctx.distro}", > + "--confdir", f"{self.ctx.repodir}/{self.ctx.distro}/conf", > + "-C", "main", > + "-S", "-", "-P" "source", > + "--delete", > + "includedsc", > + self.ctx.codename, > + os.path.realpath(f"{self.workdir}/tmp/{filename}") > + ], timeout=REPREPRO_TIMEOUT) > + fd.close() > + > + def handle_src_list(self, pkgs): > + if pkgs: > + fetched_files = [] > + for pkg in pkgs: > + pkgname = pkg > + pkgver = "" > + if '=' in pkg: > + pkgname = pkg.split("=")[0] > + pkgver = pkg.split("=")[1] > + > + self.sr.restart() > + while self.sr.lookup(pkgname): > + if pkgver and pkgver != self.sr.version: > + continue > + > + for sr_file in self.sr.files: > + print(self.sr.index.archive_uri(sr_file[2])) > + filename = os.path.basename(sr_file.path) > + if filename not in fetched_files: > + self.fetch_file(self.sr.index.archive_uri(sr_file[2])) > + fetched_files.append(filename) > + > + dsc_uri = self.sr.index.archive_uri(self.sr.files[0][2]) > + self.handle_dsc(dsc_uri) > + break > + > + def apt_run(self, init, srcmode, pkgs, dscfile, crossbuild): > + apt_pkg.init() > + > + extrarepo_list = f"{self.workdir}/etc/apt/sources.list.d/extrarepo.list" What happen if deb822 is mandatory? > + if self.extrarepo: > + extrarepo_list = f"{self.workdir}/etc/apt/sources.list.d/extrarepo.list" > + with open(extrarepo_list, "w") as f: > + distdir=os.path.join(self.extrarepo, "dists") > + if os.path.isdir(distdir): > + for dist in os.listdir(distdir): > + repodir = os.path.join(distdir,dist) > + if os.path.isdir(repodir): > + for repo in os.listdir(repodir): > + if os.path.isdir(os.path.join(repodir, repo)): > + f.write(f"deb file://{self.extrarepo} " > + f"{dist} {repo}\n") > + > + sources = apt_pkg.SourceList() > + sources.read_main_list() > + > + progress = apt.progress.text.AcquireProgress() > + > + self.cache = apt_pkg.Cache() > + if init: > + self.cache.update(progress, sources) > + self.cache = apt_pkg.Cache() > + > + if self.extrarepo: > + apt_pkg.config.set("Dir::Etc::SourceList", extrarepo_list) > + apt_pkg.config.set("APT::Get::List-Cleanup", "0") > + self.cache.update(progress, sources) > + self.cache = apt_pkg.Cache() > + os.remove(extrarepo_list) > + > + self.depcache = apt_pkg.DepCache(self.cache) > + self.sr = apt_pkg.SourceRecords() > + > + ret = True > + > + if init: > + self.mark_essential() > + # 1(required), 2(important), 3(standard), 4(optional), 5(extra) > + self.mark_by_prio(1) > + > + pkgs = list(filter(None, ','.join(pkgs).split(','))) > + if srcmode: > + self.handle_src_list(set(pkgs)) > + else: > + ret = self.mark_list(pkgs, crossbuild) > + > + if dscfile: > + fobj = open(dscfile, "r") > + > + try: > + tagfile = apt_pkg.TagFile(fobj) > + while tagfile.step() == 1: > + deps = tagfile.section.get("Build-Depends", "") > + # Remove extra commas and spaces - apt_pkg.parse_src_depends > + # doesnt like lines like ", device-tree-compiler" > + deps = ', '.join( > + [s.strip() for s in deps.split(',') if s.strip()] > + ) > + print(f"parsed deps: {deps}") > + for item in apt_pkg.parse_src_depends(deps, False): > + pkgname = item[0][0] > + self.mark_pkg(pkgname, crossbuild) > + > + finally: > + fobj.close() > + > + if not ret: > + sys.exit("Some of requested packages not found") > + > + if init or not srcmode: > + fetcher = apt_pkg.Acquire(progress) > + pm = apt_pkg.PackageManager(self.depcache) > + > + recs = apt_pkg.PackageRecords(self.cache) > + pm.get_archives(fetcher, sources, recs) > + > + self.handle_repo(fetcher) > + > + > +def parse_arguments(): > + parser = argparse.ArgumentParser() > + parser.add_argument( > + "--init", > + default=False, action="store_true", > + help="initialize context in WORKDIR") > + parser.add_argument( > + "--workdir", > + type=str, required=True, > + help="work directory storing debrepo context") > + parser.add_argument( > + "--aptsrcsfile", > + type=str, metavar="PATH", > + help="sources.list file to use when init") > + parser.add_argument( > + "--srcmode", > + default=False, action="store_true", > + help="add source packages instead of debs") > + parser.add_argument( > + "--repodir", > + type=str, metavar="REPO", > + help="repository directory") > + parser.add_argument( > + "--repodbdir", > + type=str, metavar="REPODB", > + help="repository database directory") > + parser.add_argument( > + "--extrarepo", > + type=str, metavar="REPO", > + help="extra repository to consider") > + parser.add_argument( > + "--mirror", > + type=str, > + help="use custom distro mirror") > + parser.add_argument( > + "--distro", > + type=str, > + help="select distro to use") > + parser.add_argument( > + "--codename", > + type=str, > + help="distro codename") > + parser.add_argument( > + "--arch", > + type=str, > + help="distro arch") > + parser.add_argument( > + "--compatarch", > + type=str, metavar="ARCH", > + help="compat arch to use") > + parser.add_argument( > + "--crossarch", > + type=str, metavar="ARCH", > + help="cross-build arch") > + parser.add_argument( > + "--keydir", > + type=str, > + help="directory with distro keys") > + parser.add_argument( > + "--no-check-gpg", > + default=False, action="store_true", > + help="allow insecure repositories") > + parser.add_argument( > + "--dscfile", > + type=str, metavar="PATH", > + help="Debian source file to parse") > + parser.add_argument( > + "--crossbuild", > + default=False, action="store_true", > + help="add packages with cross arch") > + > + parser.add_argument( > + "packages", > + nargs='*', type=str, > + help="space- or comma-separated list of packages to add") > + > + args = parser.parse_args() > + > + return args > + > + > +def main(): > + args = parse_arguments() > + > + if not (args.init or args.packages or args.dscfile): > + sys.exit("Nothing to do") > + > + workdir = os.path.abspath(args.workdir) > + os.makedirs(workdir, exist_ok=True) > + > + with open(f"{workdir}/debrepo.lock", "a") as file: > + fcntl.flock(file.fileno(), fcntl.LOCK_EX) > + > + debrepo = DebRepo(args) > + > + if args.init: > + debrepo.create_rootfs(args.aptsrcsfile) > + debrepo.create_repo_dist() > + > + debrepo.apt_config(args.init, args.crossbuild) > + debrepo.apt_run(args.init, args.srcmode, args.packages, > + args.dscfile, args.crossbuild) > + > + #Unlock debrepo context > + fcntl.flock(file.fileno(), fcntl.LOCK_UN) > + > + > +if __name__ == "__main__": > + main() -- You received this message because you are subscribed to the Google Groups "isar-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to isar-users+unsubscribe@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/isar-users/0bb0f167-54b7-4f11-abde-ec3ee6c44c8f%40siemens.com.