diff --git a/lib/modules/manager/pip-compile/extract.ts b/lib/modules/manager/pip-compile/extract.ts index 40296061223521a157de19782ec68ed93cd90977..e3624ffc6807aa2af906ada46e89682728b1e8cf 100644 --- a/lib/modules/manager/pip-compile/extract.ts +++ b/lib/modules/manager/pip-compile/extract.ts @@ -1,4 +1,3 @@ -import { Graph } from 'graph-data-structure'; import { logger } from '../../../logger'; import { readLocalFile } from '../../../util/fs'; import { normalizeDepName } from '../../datasource/pypi/common'; @@ -11,7 +10,7 @@ import type { PipCompileArgs, SupportedManagers, } from './types'; -import { generateMermaidGraph } from './utils'; +import { generateMermaidGraph, sortPackageFiles } from './utils'; function matchManager(filename: string): SupportedManagers | 'unknown' { if (filename.endsWith('setup.py')) { @@ -178,32 +177,10 @@ export async function extractAllPackageFiles( if (packageFiles.size === 0) { return null; } - const result: PackageFile[] = []; - const graph: ReturnType<typeof Graph> = Graph(); - depsBetweenFiles.forEach(({ sourceFile, outputFile }) => { - graph.addEdge(sourceFile, outputFile); - }); - const sorted = graph.topologicalSort(); - for (const file of sorted) { - if (packageFiles.has(file)) { - const packageFile = packageFiles.get(file)!; - const sortedLockFiles = []; - // TODO(not7cd): this needs better test case - for (const lockFile of packageFile.lockFiles!) { - if (sorted.includes(lockFile)) { - sortedLockFiles.push(lockFile); - } - } - packageFile.lockFiles = sortedLockFiles; - result.push(packageFile); - } - } - // istanbul ignore if: should never happen - if (result.length !== packageFiles.size) { - throw new Error( - 'pip-compile: topological sort failed to include all package files', - ); - } + const result: PackageFile[] = sortPackageFiles( + depsBetweenFiles, + packageFiles, + ); logger.debug( 'pip-compile: dependency graph:\n' + generateMermaidGraph(depsBetweenFiles, lockFileArgs), diff --git a/lib/modules/manager/pip-compile/utils.ts b/lib/modules/manager/pip-compile/utils.ts index 347fe4f24dc0f29586e9fbb46e06031a113c2a27..d87a53e53f13cac18d4df6fadde1543a8e20feb1 100644 --- a/lib/modules/manager/pip-compile/utils.ts +++ b/lib/modules/manager/pip-compile/utils.ts @@ -1,5 +1,38 @@ +import { Graph } from 'graph-data-structure'; +import type { PackageFile } from '../types'; import type { DependencyBetweenFiles, PipCompileArgs } from './types'; +export function sortPackageFiles( + depsBetweenFiles: DependencyBetweenFiles[], + packageFiles: Map<string, PackageFile>, +): PackageFile[] { + const result: PackageFile[] = []; + const graph: ReturnType<typeof Graph> = Graph(); + depsBetweenFiles.forEach(({ sourceFile, outputFile }) => { + graph.addEdge(sourceFile, outputFile); + }); + const sorted = graph.topologicalSort(); + for (const file of sorted) { + if (packageFiles.has(file)) { + const packageFile = packageFiles.get(file)!; + const sortedLockFiles = []; + // TODO(not7cd): this needs better test case + for (const lockFile of packageFile.lockFiles!) { + if (sorted.includes(lockFile)) { + sortedLockFiles.push(lockFile); + } + } + packageFile.lockFiles = sortedLockFiles; + result.push(packageFile); + } + } + // istanbul ignore if: should never happen + if (result.length !== packageFiles.size) { + throw new Error('Topological sort failed to include all package files'); + } + return result; +} + export function generateMermaidGraph( depsBetweenFiles: DependencyBetweenFiles[], lockFileArgs: Map<string, PipCompileArgs>,