From 2f23c1461e0cd7e4c48e5aeb2dce4941f45666d7 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Fri, 26 May 2023 17:47:57 +0200
Subject: [PATCH] fix(manager/pdm): install python first (#22441)

---
 lib/modules/manager/pep621/artifacts.spec.ts      |  6 ++++++
 lib/modules/manager/pep621/processors/pdm.spec.ts | 14 ++++++++++++++
 lib/modules/manager/pep621/processors/pdm.ts      |  9 ++++++---
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/lib/modules/manager/pep621/artifacts.spec.ts b/lib/modules/manager/pep621/artifacts.spec.ts
index f104c7e51f..f48d42050a 100644
--- a/lib/modules/manager/pep621/artifacts.spec.ts
+++ b/lib/modules/manager/pep621/artifacts.spec.ts
@@ -42,6 +42,10 @@ describe('modules/manager/pep621/artifacts', () => {
       fs.getSiblingFileName.mockReturnValueOnce('pdm.lock');
       fs.readLocalFile.mockResolvedValueOnce('old test content');
       fs.readLocalFile.mockResolvedValueOnce('new test content');
+      // python
+      getPkgReleases.mockResolvedValueOnce({
+        releases: [{ version: '3.11.1' }, { version: '3.11.2' }],
+      });
       // pdm
       getPkgReleases.mockResolvedValueOnce({
         releases: [{ version: 'v2.6.1' }, { version: 'v2.5.0' }],
@@ -86,6 +90,8 @@ describe('modules/manager/pep621/artifacts', () => {
             '-w "/tmp/github/some/repo" ' +
             'containerbase/sidecar ' +
             'bash -l -c "' +
+            'install-tool python 3.11.2 ' +
+            '&& ' +
             'install-tool pdm v2.5.0 ' +
             '&& ' +
             'pdm update dep1' +
diff --git a/lib/modules/manager/pep621/processors/pdm.spec.ts b/lib/modules/manager/pep621/processors/pdm.spec.ts
index d455b0b722..b6a2801cbd 100644
--- a/lib/modules/manager/pep621/processors/pdm.spec.ts
+++ b/lib/modules/manager/pep621/processors/pdm.spec.ts
@@ -41,6 +41,10 @@ describe('modules/manager/pep621/processors/pdm', () => {
       fs.getSiblingFileName.mockReturnValueOnce('pdm.lock');
       fs.readLocalFile.mockResolvedValueOnce('test content');
       fs.readLocalFile.mockResolvedValueOnce('test content');
+      // python
+      getPkgReleases.mockResolvedValueOnce({
+        releases: [{ version: '3.11.1' }, { version: '3.11.2' }],
+      });
       // pdm
       getPkgReleases.mockResolvedValueOnce({
         releases: [{ version: 'v2.6.1' }, { version: 'v2.5.0' }],
@@ -71,6 +75,8 @@ describe('modules/manager/pep621/processors/pdm', () => {
             '-w "/tmp/github/some/repo" ' +
             'containerbase/sidecar ' +
             'bash -l -c "' +
+            'install-tool python 3.11.2 ' +
+            '&& ' +
             'install-tool pdm v2.5.0 ' +
             '&& ' +
             'pdm update dep1' +
@@ -106,6 +112,10 @@ describe('modules/manager/pep621/processors/pdm', () => {
       fs.getSiblingFileName.mockReturnValueOnce('pdm.lock');
       fs.readLocalFile.mockResolvedValueOnce('test content');
       fs.readLocalFile.mockResolvedValueOnce('changed test content');
+      // python
+      getPkgReleases.mockResolvedValueOnce({
+        releases: [{ version: '3.11.1' }, { version: '3.11.2' }],
+      });
       // pdm
       getPkgReleases.mockResolvedValueOnce({
         releases: [{ version: 'v2.6.1' }, { version: 'v2.5.0' }],
@@ -140,6 +150,10 @@ describe('modules/manager/pep621/processors/pdm', () => {
       fs.getSiblingFileName.mockReturnValueOnce('pdm.lock');
       fs.readLocalFile.mockResolvedValueOnce('test content');
       fs.readLocalFile.mockResolvedValueOnce('changed test content');
+      // python
+      getPkgReleases.mockResolvedValueOnce({
+        releases: [{ version: '3.11.1' }, { version: '3.11.2' }],
+      });
       // pdm
       getPkgReleases.mockResolvedValueOnce({
         releases: [{ version: 'v2.6.1' }, { version: 'v2.5.0' }],
diff --git a/lib/modules/manager/pep621/processors/pdm.ts b/lib/modules/manager/pep621/processors/pdm.ts
index cf717b6dbf..bd21052cd3 100644
--- a/lib/modules/manager/pep621/processors/pdm.ts
+++ b/lib/modules/manager/pep621/processors/pdm.ts
@@ -64,15 +64,18 @@ export class PdmProcessor implements PyProjectProcessor {
         logger.debug('No pdm.lock found');
         return null;
       }
-
-      const toolConstraint: ToolConstraint = {
+      const pythonConstraint: ToolConstraint = {
+        toolName: 'python',
+        constraint: config.constraints?.python,
+      };
+      const pdmConstraint: ToolConstraint = {
         toolName: 'pdm',
         constraint: config.constraints?.pdm,
       };
 
       const execOptions: ExecOptions = {
         docker: {},
-        toolConstraints: [toolConstraint],
+        toolConstraints: [pythonConstraint, pdmConstraint],
       };
 
       // on lockFileMaintenance do not specify any packages and update the complete lock file
-- 
GitLab