anchor.diff:    ..addOption('concurrency',
         abbr: 'c', defaultsTo: '1', help: 'Number of concurrent processing.')
     ..addOption('package', abbr: 'p', help: 'The package to process.')
  +  ..addFlag('dry-run',
  +      abbr: 'n', defaultsTo: false, help: 'Do not change Datastore.')
     ..addFlag('help', abbr: 'h', defaultsTo: false, help: 'Show help.');
   
   /// Deletes PackageVersionPubspec and PackageVersionInfo using old IDs, see CHANGELOG.md
  
positive.code:       final futures = <Future>[];
  
        await for (final package in dbService.query<Package>().run()) {
          futures.add(pool.withResource(() => _processPackage(package.name)));
        }
  
        await Future.wait(futures);
        await pool.close();
      } else {
        await _processPackage(package);
      }
    });
  }
  
  Future<void> _processPackage(String package) async {
    await _deleteWithQuery<PackageVersionInfo>(
      dbService.query<PackageVersionInfo>()..filter('package =', package),
      where: (p) => p.id.toString() == p.qualifiedVersionKey.oldQualifiedVersion,
    );
  }
  
  Future _deleteWithQuery<T>(Query query, {bool Function(T item) where}) async {
    final deletes = <Key>[];
    await for (Model m in query.run()) {
      final shouldDelete = where == null || where(m as T);
      if (shouldDelete) {
        deletes.add(m.key);
        if (deletes.length >= 500) {
          await dbService.commit(deletes: deletes);
          deletes.clear();
        }
      }
    }
    if (deletes.isNotEmpty) {
      await dbService.commit(deletes: deletes);
    }
  }
  
negative.code: 
    final concurrency = int.parse(argv['concurrency'] as String);
    final package = argv['package'] as String;
    final dryRun = argv['dry-run'] as bool;
  
    await withToolRuntime(() async {
      if (package == null) {
  