From 3972609ab0a74a566628adcdc55b2128cb567407 Mon Sep 17 00:00:00 2001
From: Oleg Krivtsov <olegkrivtsov@gmail.com>
Date: Thu, 6 Jan 2022 17:47:56 +0700
Subject: [PATCH] fix(manager/pip_requirements): handle lines with environment
 markers in requirements.txt (#13403)

Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
---
 .../__fixtures__/requirements-env-markers.txt |  1 +
 lib/manager/pip_requirements/extract.spec.ts  | 20 +++++++++++++++++++
 lib/manager/pip_requirements/extract.ts       |  3 ++-
 3 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 lib/manager/pip_requirements/__fixtures__/requirements-env-markers.txt

diff --git a/lib/manager/pip_requirements/__fixtures__/requirements-env-markers.txt b/lib/manager/pip_requirements/__fixtures__/requirements-env-markers.txt
new file mode 100644
index 0000000000..3f46ef611a
--- /dev/null
+++ b/lib/manager/pip_requirements/__fixtures__/requirements-env-markers.txt
@@ -0,0 +1 @@
+attrs==20.3.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0"
diff --git a/lib/manager/pip_requirements/extract.spec.ts b/lib/manager/pip_requirements/extract.spec.ts
index 94f9b02783..fce32b69a0 100644
--- a/lib/manager/pip_requirements/extract.spec.ts
+++ b/lib/manager/pip_requirements/extract.spec.ts
@@ -10,6 +10,7 @@ const requirements5 = loadFixture('requirements5.txt');
 const requirements6 = loadFixture('requirements6.txt');
 const requirements7 = loadFixture('requirements7.txt');
 const requirements8 = loadFixture('requirements8.txt');
+const requirementsWithEnvMarkers = loadFixture('requirements-env-markers.txt');
 
 describe('manager/pip_requirements/extract', () => {
   beforeEach(() => {
@@ -134,10 +135,29 @@ describe('manager/pip_requirements/extract', () => {
         'http://its-a-secret:example.com/private-pypi/',
       ]);
     });
+
     it('should handle hashes', () => {
       const res = extractPackageFile(requirements8, 'unused_file_name', {});
       expect(res).toMatchSnapshot();
       expect(res.deps).toHaveLength(3);
     });
+
+    it('should handle dependency and ignore env markers', () => {
+      const res = extractPackageFile(
+        requirementsWithEnvMarkers,
+        'unused_file_name',
+        {}
+      );
+      expect(res).toEqual({
+        deps: [
+          {
+            currentValue: '==20.3.0',
+            currentVersion: '20.3.0',
+            datasource: 'pypi',
+            depName: 'attrs',
+          },
+        ],
+      });
+    });
   });
 });
diff --git a/lib/manager/pip_requirements/extract.ts b/lib/manager/pip_requirements/extract.ts
index 5ca09fe420..6393ba9fc2 100644
--- a/lib/manager/pip_requirements/extract.ts
+++ b/lib/manager/pip_requirements/extract.ts
@@ -63,7 +63,8 @@ export function extractPackageFile(
       if (isSkipComment(comment)) {
         dep.skipReason = SkipReason.Ignored;
       }
-      const lineNoHashes = line.split(' \\')[0];
+      const [lineNoEnvMarkers] = line.split(';').map((part) => part.trim());
+      const lineNoHashes = lineNoEnvMarkers.split(' \\')[0];
       const matches =
         pkgValRegex.exec(lineNoHashes) || pkgRegex.exec(lineNoHashes);
       if (!matches) {
-- 
GitLab