From 0e8ea6990fd4ea6c1b9e7a4a07681b132a0c5ddd Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 7 Aug 2025 19:53:02 +0000 Subject: [PATCH 1/2] fix: stricter pip list parsing --- src/managers/builtin/pipListUtils.ts | 10 +++++++++- src/test/managers/builtin/pipListUtils.unit.test.ts | 6 +++--- src/test/managers/builtin/piplist3.actual.txt | 11 +++++++++++ src/test/managers/builtin/piplist3.expected.json | 11 +++++++++++ 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 src/test/managers/builtin/piplist3.actual.txt create mode 100644 src/test/managers/builtin/piplist3.expected.json diff --git a/src/managers/builtin/pipListUtils.ts b/src/managers/builtin/pipListUtils.ts index 9ae3ae14..c017c77e 100644 --- a/src/managers/builtin/pipListUtils.ts +++ b/src/managers/builtin/pipListUtils.ts @@ -4,6 +4,11 @@ export interface PipPackage { displayName: string; description: string; } +export function isValidVersion(version: string): boolean { + return /^([1-9][0-9]*!)?(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))*((a|b|rc)(0|[1-9][0-9]*))?(\.post(0|[1-9][0-9]*))?(\.dev(0|[1-9][0-9]*))?$/.test( + version, + ); +} export function parsePipList(data: string): PipPackage[] { const collection: PipPackage[] = []; @@ -13,9 +18,12 @@ export function parsePipList(data: string): PipPackage[] { continue; } const parts = line.split(' ').filter((e) => e); - if (parts.length > 1) { + if (parts.length === 2) { const name = parts[0].trim(); const version = parts[1].trim(); + if (!isValidVersion(version)) { + break; + } const pkg = { name, version, diff --git a/src/test/managers/builtin/pipListUtils.unit.test.ts b/src/test/managers/builtin/pipListUtils.unit.test.ts index 64d0119e..24bb39df 100644 --- a/src/test/managers/builtin/pipListUtils.unit.test.ts +++ b/src/test/managers/builtin/pipListUtils.unit.test.ts @@ -1,13 +1,13 @@ +import assert from 'assert'; import * as fs from 'fs-extra'; import * as path from 'path'; -import { EXTENSION_TEST_ROOT } from '../../constants'; import { parsePipList } from '../../../managers/builtin/pipListUtils'; -import assert from 'assert'; +import { EXTENSION_TEST_ROOT } from '../../constants'; const TEST_DATA_ROOT = path.join(EXTENSION_TEST_ROOT, 'managers', 'builtin'); suite('Pip List Parser tests', () => { - const testNames = ['piplist1', 'piplist2']; + const testNames = ['piplist1', 'piplist2', 'piplist3']; testNames.forEach((testName) => { test(`Test parsing pip list output ${testName}`, async () => { diff --git a/src/test/managers/builtin/piplist3.actual.txt b/src/test/managers/builtin/piplist3.actual.txt new file mode 100644 index 00000000..4450b42e --- /dev/null +++ b/src/test/managers/builtin/piplist3.actual.txt @@ -0,0 +1,11 @@ +Package Version +---------- ------- +altgraph 0.17.2 +future 0.18.2 +macholib 1.15.2 +pip 21.2.4 +setuptools 58.0.4 +six 1.15.0 +wheel 0.37.0 +WARNING: You are using pip version 21.2.4; however, version 25.2 is available. +You should consider upgrading via the '/Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip' command. diff --git a/src/test/managers/builtin/piplist3.expected.json b/src/test/managers/builtin/piplist3.expected.json new file mode 100644 index 00000000..c22fcbe9 --- /dev/null +++ b/src/test/managers/builtin/piplist3.expected.json @@ -0,0 +1,11 @@ +{ + "packages": [ + { "name": "altgraph", "version": "0.17.2" }, + { "name": "future", "version": "0.18.2" }, + { "name": "macholib", "version": "1.15.2" }, + { "name": "pip", "version": "21.2.4" }, + { "name": "setuptools", "version": "58.0.4" }, + { "name": "six", "version": "1.15.0" }, + { "name": "wheel", "version": "0.37.0" } + ] +} From 1d76580602c33d446bdd8a8335f75b56fa72c96e Mon Sep 17 00:00:00 2001 From: Sam Sikora Date: Thu, 7 Aug 2025 13:06:04 -0700 Subject: [PATCH 2/2] skip invalid line rather then breaking --- src/managers/builtin/pipListUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/managers/builtin/pipListUtils.ts b/src/managers/builtin/pipListUtils.ts index c017c77e..3d8d7944 100644 --- a/src/managers/builtin/pipListUtils.ts +++ b/src/managers/builtin/pipListUtils.ts @@ -22,7 +22,7 @@ export function parsePipList(data: string): PipPackage[] { const name = parts[0].trim(); const version = parts[1].trim(); if (!isValidVersion(version)) { - break; + continue; } const pkg = { name,