Skip to content

Commit

Permalink
refactor: fix individual reqs manifest
Browse files Browse the repository at this point in the history
  • Loading branch information
lili2311 committed Mar 29, 2021
1 parent 6e84322 commit bc44f9a
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 26 deletions.
Expand Up @@ -8,7 +8,7 @@ import {
import { Workspace } from '../../../../types';
import { containsRequireDirective } from './contains-require-directive';

interface PythonProvenance {
export interface PythonProvenance {
[fileName: string]: ParsedRequirements;
}

Expand Down
Expand Up @@ -3,16 +3,21 @@ import * as pathLib from 'path';

import {
EntityToFix,
FixChangesSummary,
FixOptions,
WithFixChangesApplied,
RemediationChanges,
Workspace,
} from '../../../../types';
import { PluginFixResponse } from '../../../types';
import { updateDependencies } from './update-dependencies';
import { MissingRemediationDataError } from '../../../../lib/errors/missing-remediation-data';
import { MissingFileNameError } from '../../../../lib/errors/missing-file-name';
import { partitionByFixable } from './is-supported';
import { NoFixesCouldBeAppliedError } from '../../../../lib/errors/no-fixes-applied';
import { extractProvenance } from './extract-version-provenance';
import {
extractProvenance,
PythonProvenance,
} from './extract-version-provenance';

const debug = debugLib('snyk-fix:python:requirements.txt');

Expand All @@ -32,38 +37,60 @@ export async function pipRequirementsTxt(

for (const entity of fixable) {
try {
const fixedEntity = await fixIndividualRequirementsTxt(entity, options);
handlerResult.succeeded.push(fixedEntity);
const { remediation, targetFile, workspace } = getRequiredData(entity);
const { dir, base } = pathLib.parse(targetFile);
const provenance = await extractProvenance(workspace, dir, base);
const changes = await fixIndividualRequirementsTxt(
workspace,
dir,
base,
remediation,
provenance,
options,
);
handlerResult.succeeded.push({ original: entity, changes });
} catch (e) {
handlerResult.failed.push({ original: entity, error: e });
}
}
return handlerResult;
}

// TODO: optionally verify the deps install
export async function fixIndividualRequirementsTxt(
export function getRequiredData(
entity: EntityToFix,
options: FixOptions,
): Promise<WithFixChangesApplied<EntityToFix>> {
const fileName = entity.scanResult.identity.targetFile;
const remediationData = entity.testResult.remediation;
if (!remediationData) {
): {
remediation: RemediationChanges;
targetFile: string;
workspace: Workspace;
} {
const { remediation } = entity.testResult;
if (!remediation) {
throw new MissingRemediationDataError();
}
if (!fileName) {
const { targetFile } = entity.scanResult.identity;
if (!targetFile) {
throw new MissingFileNameError();
}
const { dir, base } = pathLib.parse(fileName);
const versionProvenance = await extractProvenance(
entity.workspace,
dir,
base,
);
const { workspace } = entity;
if (!workspace) {
throw new NoFixesCouldBeAppliedError();
}
return { targetFile, remediation, workspace };
}

// TODO: optionally verify the deps install
export async function fixIndividualRequirementsTxt(
workspace: Workspace,
dir: string,
fileName: string,
remediation: RemediationChanges,
provenance: PythonProvenance,
options: FixOptions,
): Promise<FixChangesSummary[]> {
// TODO: allow handlers per fix type (later also strategies or combine with strategies)
const { updatedManifest, changes } = updateDependencies(
versionProvenance[base],
remediationData.pin,
provenance[fileName],
remediation.pin,
);

if (!changes.length) {
Expand All @@ -72,13 +99,10 @@ export async function fixIndividualRequirementsTxt(
}
if (!options.dryRun) {
debug('Writing changes to file');
await entity.workspace.writeFile(fileName, updatedManifest);
await workspace.writeFile(pathLib.join(dir, fileName), updatedManifest);
} else {
debug('Skipping writing changes to file in --dry-run mode');
}

return {
original: entity,
changes,
};
return changes;
}

0 comments on commit bc44f9a

Please sign in to comment.