Skip to content

Commit

Permalink
refactor(manager/pip-compile): Move topological sort to utils (#27398)
Browse files Browse the repository at this point in the history
  • Loading branch information
not7cd committed Feb 19, 2024
1 parent 1ffa44c commit 8265111
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 28 deletions.
33 changes: 5 additions & 28 deletions 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';
Expand All @@ -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')) {
Expand Down Expand Up @@ -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),
Expand Down
33 changes: 33 additions & 0 deletions 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>,
Expand Down

0 comments on commit 8265111

Please sign in to comment.