From 537f534f13c4b637206b2e0acd31f7911f00066c Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sun, 7 Mar 2021 09:17:45 +0100
Subject: [PATCH] fix(poetry): poetry install constraints quoting (#9012)

* fix(poetry): extract poetry.core.masonry.api

* fix(poetry): quote install requirements individually
---
 lib/manager/poetry/__fixtures__/pyproject.2.toml        | 4 ++++
 lib/manager/poetry/__fixtures__/pyproject.4.toml        | 4 ++++
 lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap | 2 +-
 lib/manager/poetry/__snapshots__/extract.spec.ts.snap   | 8 ++++++--
 lib/manager/poetry/artifacts.spec.ts                    | 5 ++++-
 lib/manager/poetry/artifacts.ts                         | 3 ++-
 lib/manager/poetry/extract.ts                           | 4 +++-
 7 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/lib/manager/poetry/__fixtures__/pyproject.2.toml b/lib/manager/poetry/__fixtures__/pyproject.2.toml
index 906c83920b..615286f223 100644
--- a/lib/manager/poetry/__fixtures__/pyproject.2.toml
+++ b/lib/manager/poetry/__fixtures__/pyproject.2.toml
@@ -14,3 +14,7 @@ dep4 = { path = "/some/path/" }
 extra_dep1 = "^0.8.3"
 extra_dep2 = "^0.9.4"
 extra_dep3 = '^0.4.0'
+
+[build-system]
+requires = ["poetry>=1.0", "wheel"]
+build-backend = "poetry.core.masonry.api"
diff --git a/lib/manager/poetry/__fixtures__/pyproject.4.toml b/lib/manager/poetry/__fixtures__/pyproject.4.toml
index 0ae8e12d56..bcbc4a05c5 100644
--- a/lib/manager/poetry/__fixtures__/pyproject.4.toml
+++ b/lib/manager/poetry/__fixtures__/pyproject.4.toml
@@ -9,3 +9,7 @@ foo = [
     {version = "<=1.9", python = "^2.7"},
     {version = "^2.0", python = "^3.4"}
 ]
+
+[build-system]
+requires = ["poetry>=1.1.2", "setuptools", "poetry-dynamic-versioning"]
+build-backend = "poetry.masonry.api"
diff --git a/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap b/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap
index 145316feda..0ac8920c45 100644
--- a/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap
+++ b/lib/manager/poetry/__snapshots__/artifacts.spec.ts.snap
@@ -135,7 +135,7 @@ Array [
     },
   },
   Object {
-    "cmd": "docker run --rm --name=renovate_python --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -w \\"/tmp/github/some/repo\\" renovate/python:3.4.2 bash -l -c \\"pip install poetry && poetry update --lock --no-interaction dep1\\"",
+    "cmd": "docker run --rm --name=renovate_python --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -w \\"/tmp/github/some/repo\\" renovate/python:3.4.2 bash -l -c \\"pip install 'poetry>=1.1.2' setuptools 'poetry-dynamic-versioning>1' && poetry update --lock --no-interaction dep1\\"",
     "options": Object {
       "cwd": "/tmp/github/some/repo",
       "encoding": "utf-8",
diff --git a/lib/manager/poetry/__snapshots__/extract.spec.ts.snap b/lib/manager/poetry/__snapshots__/extract.spec.ts.snap
index e71f6593a5..4f7984056b 100644
--- a/lib/manager/poetry/__snapshots__/extract.spec.ts.snap
+++ b/lib/manager/poetry/__snapshots__/extract.spec.ts.snap
@@ -358,7 +358,9 @@ Object {
 
 exports[`lib/manager/poetry/extract extractPackageFile() extracts multiple dependencies (with dep = {version = "1.2.3"} case) 1`] = `
 Object {
-  "constraints": Object {},
+  "constraints": Object {
+    "poetry": "poetry>=1.0 wheel",
+  },
   "deps": Array [
     Object {
       "currentValue": "*",
@@ -540,7 +542,9 @@ Array [
 
 exports[`lib/manager/poetry/extract extractPackageFile() handles multiple constraint dependencies 1`] = `
 Object {
-  "constraints": Object {},
+  "constraints": Object {
+    "poetry": "poetry>=1.1.2 setuptools poetry-dynamic-versioning",
+  },
   "deps": Array [
     Object {
       "currentValue": "",
diff --git a/lib/manager/poetry/artifacts.spec.ts b/lib/manager/poetry/artifacts.spec.ts
index f08480e771..c8a8aa9cb8 100644
--- a/lib/manager/poetry/artifacts.spec.ts
+++ b/lib/manager/poetry/artifacts.spec.ts
@@ -150,7 +150,10 @@ describe('.updateArtifacts()', () => {
         newPackageFileContent: '{}',
         config: {
           ...config,
-          constraints: { python: '~2.7 || ^3.4' },
+          constraints: {
+            python: '~2.7 || ^3.4',
+            poetry: 'poetry>=1.1.2 setuptools poetry-dynamic-versioning>1',
+          },
         },
       })
     ).not.toBeNull();
diff --git a/lib/manager/poetry/artifacts.ts b/lib/manager/poetry/artifacts.ts
index 1a7a3eb7d6..c55f9c2afd 100644
--- a/lib/manager/poetry/artifacts.ts
+++ b/lib/manager/poetry/artifacts.ts
@@ -122,7 +122,8 @@ export async function updateArtifacts({
     }
     const tagConstraint = getPythonConstraint(existingLockFileContent, config);
     const poetryRequirement = config.constraints?.poetry || 'poetry';
-    const poetryInstall = 'pip install ' + quote(poetryRequirement);
+    const poetryInstall =
+      'pip install ' + poetryRequirement.split(' ').map(quote).join(' ');
     const extraEnv = getSourceCredentialVars(
       newPackageFileContent,
       packageFileName
diff --git a/lib/manager/poetry/extract.ts b/lib/manager/poetry/extract.ts
index d57ad2c9c5..c74a695fce 100644
--- a/lib/manager/poetry/extract.ts
+++ b/lib/manager/poetry/extract.ts
@@ -151,7 +151,9 @@ export async function extractPackageFile(
 
   // https://python-poetry.org/docs/pyproject/#poetry-and-pep-517
   if (
-    pyprojectfile['build-system']?.['build-backend'] === 'poetry.masonry.api'
+    pyprojectfile['build-system']?.['build-backend'] === 'poetry.masonry.api' ||
+    pyprojectfile['build-system']?.['build-backend'] ===
+      'poetry.core.masonry.api'
   ) {
     constraints.poetry = pyprojectfile['build-system']?.requires.join(' ');
   }
-- 
GitLab