syncPubspecData function

Future<DartBomResult> syncPubspecData(
  1. PubSpec sourcePubspec,
  2. PubSpec targetSpec, {
  3. PubSpec? overrideSpec,
  4. required DartBomOptions options,
  5. required CliLogger logger,
})

Implementation

Future<DartBomResult> syncPubspecData(
  PubSpec sourcePubspec,
  PubSpec targetSpec, {
  PubSpec? overrideSpec,
  required DartBomOptions options,
  required CliLogger logger,
}) async {
  final output = targetSpec;

  var allDependencies = <String, DependencyReference>{
    ...sourcePubspec.dependencies,
    ...sourcePubspec.devDependencies,
    ...sourcePubspec.dependencyOverrides,
  };

  void addPathDependency(
      DependencyLocation location, String name, DependencyReference ref) {
    if (overrideSpec != null) {
      overrideSpec.dependencyOverrides[name] = ref;
    } else {
      targetSpec.getDependencies(location)[name] = ref;
    }
  }

  var mismatches = <DependencyMismatch>[];
  var hasPathChanges = false;
  var skipped = <DependencyMismatch>[];
  var matches = <DependencyMismatch>[];
  ({
    DependencyLocation.dependencies: output.dependencies,
    DependencyLocation.devDependencies: output.devDependencies,
    DependencyLocation.dependencyOverrides: output.dependencyOverrides,
  }).forEach((type, depCollection) {
    depCollection.forEach((packageName, currentDependency) {
      var fromBom = allDependencies[packageName];

      if (fromBom != null) {
        var result = DependencyMismatch(
          type,
          currentDependency,
          fromBom,
          packageName,
        );
        if (fromBom == currentDependency) {
          matches.add(result);
        } else if (currentDependency is PathReference &&
            !options.overwritePathDependencies) {
          skipped.add(result
            ..reason =
                'Not overwriting hasPathChanges dependencies.  Use --overwrite-hasPathChanges to force this behavior');
        } else if (type == DependencyLocation.dependencyOverrides &&
            !options.overwriteDependencyOverrides) {
          skipped.add(result
            ..reason =
                'Not overwriting dependency_overrides section:  Use --overwrite-overwrites to force this behavior');
        } else {
          if (currentDependency is PathReference) {
            addPathDependency(type, packageName, fromBom);
            hasPathChanges = true;
          } else {
            depCollection[packageName] = fromBom;
          }
          mismatches.add(result);
        }
      }
    });
  });

  var bomResult = DartBomResult(
      mismatches: mismatches,
      matches: matches,
      skipped: skipped,
      sourcePubspec: sourcePubspec,
      targetPubspec: output,
      sourceFile: options.source,
      targetFile: options.target);

  if (options.writeFiles) {
    if (!mismatches.isEmpty) {
      if (options.backupFiles) {
        logger.log(
            'Making backup of target file: .${options.source}.${DateTime.now().millisecondsSinceEpoch / 1000}.bak');
        File(options.target).copySync(
            '.${options.source}.${DateTime.now().millisecondsSinceEpoch / 1000}.bak');
      }

      await output.writeTo(options.target);
    }

    if (hasPathChanges && overrideSpec != null) {
      logger.log('Writing pubspec_overrides.dart');
      var overridePath =
          File(options.target).sibling("pubspec_overrides.dart").absolute.path;
      await overrideSpec.writeTo(overridePath);
    }
  }

  return bomResult;
}