snyk 1.1002.0 → 1.1003.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -156848,6 +156848,7 @@ const requirements_parser_1 = __webpack_require__(13157);
156848
156848
  const debug = Debug("snyk");
156849
156849
  class PythonDepGraphBuilder {
156850
156850
  constructor(name, requirements, metadata) {
156851
+ this.visitedMap = new Set();
156851
156852
  this.requirements = requirements;
156852
156853
  this.metadata = metadata;
156853
156854
  this.builder = new dep_graph_1.DepGraphBuilder({ name: "pip" }, { name });
@@ -156868,26 +156869,26 @@ class PythonDepGraphBuilder {
156868
156869
  return;
156869
156870
  }
156870
156871
  const nodeId = `${metadata.name}@${metadata.version}`;
156871
- this.builder.addPkgNode({ name: metadata.name, version: metadata.version }, nodeId);
156872
- this.builder.connectDep(root, nodeId);
156873
- for (const dep of metadata.dependencies) {
156874
- this.addDependenciesToDepGraph(nodeId, dep);
156872
+ if (!this.visitedMap.has(nodeId)) {
156873
+ this.visitedMap.add(nodeId);
156874
+ this.builder.addPkgNode({ name: metadata.name, version: metadata.version }, nodeId);
156875
+ for (const dep of metadata.dependencies) {
156876
+ await this.addDependenciesToDepGraph(nodeId, dep);
156877
+ }
156875
156878
  }
156879
+ this.builder.connectDep(root, nodeId);
156876
156880
  }
156877
156881
  // find the best match for a dependency in found metadata files
156878
156882
  findMetadata(dep) {
156879
- const nameMatches = this.metadata.filter((meta) => meta.name.toLowerCase() === dep.name.toLowerCase());
156880
- if (nameMatches.length === 0) {
156883
+ const nameMatches = this.metadata[dep.name.toLowerCase()];
156884
+ if (!nameMatches || nameMatches.length === 0) {
156881
156885
  return null;
156882
156886
  }
156883
- nameMatches.sort((v1, v2) => {
156884
- return semver.rcompare(v1.version, v2.version);
156885
- });
156886
156887
  if (nameMatches.length === 1 || !dep.version) {
156887
156888
  return nameMatches[0];
156888
156889
  }
156889
156890
  for (const meta of nameMatches) {
156890
- if (semver.satisfies(meta.version, `${dep.specifier}${dep.version}`)) {
156891
+ if (semver.satisfies(meta.version, `${dep.specifier}${dep.version}`, true)) {
156891
156892
  return meta;
156892
156893
  }
156893
156894
  }
@@ -156901,7 +156902,7 @@ class PythonDepGraphBuilder {
156901
156902
  async function pipFilesToScannedProjects(filePathToContent) {
156902
156903
  const scanResults = [];
156903
156904
  const requirements = {};
156904
- const metadataItems = [];
156905
+ const metadataItems = {};
156905
156906
  for (const filepath of Object.keys(filePathToContent)) {
156906
156907
  const fileBaseName = path.basename(filepath);
156907
156908
  if (fileBaseName === "requirements.txt") {
@@ -156910,16 +156911,25 @@ async function pipFilesToScannedProjects(filePathToContent) {
156910
156911
  else if (fileBaseName === "METADATA") {
156911
156912
  try {
156912
156913
  const packageInfo = (0, metadata_parser_1.getPackageInfo)(filePathToContent[filepath]);
156913
- metadataItems.push(packageInfo);
156914
+ if (!metadataItems[packageInfo.name.toLowerCase()]) {
156915
+ metadataItems[packageInfo.name.toLowerCase()] = [];
156916
+ }
156917
+ metadataItems[packageInfo.name.toLowerCase()].push(packageInfo);
156914
156918
  }
156915
156919
  catch (err) {
156916
156920
  debug(err.message);
156917
156921
  }
156918
156922
  }
156919
156923
  }
156920
- if (metadataItems.length === 0) {
156924
+ if (Object.keys(metadataItems).length === 0) {
156921
156925
  return scanResults;
156922
156926
  }
156927
+ // pre-sort each package name by version, descending
156928
+ for (const name of Object.keys(metadataItems)) {
156929
+ metadataItems[name].sort((v1, v2) => {
156930
+ return semver.rcompare(v1.version, v2.version);
156931
+ });
156932
+ }
156923
156933
  for (const requirementsFile of Object.keys(requirements)) {
156924
156934
  if (requirements[requirementsFile].length === 0) {
156925
156935
  continue;