export method

void export(
  1. File target
)

Implementation

void export(File target) {
  final files = <_BundleFile>[];
  final dirs = <String>[];

  for (final dir in assetDirs) {
    if (!dir.existsSync()) {
      throw Exception('Assets directory ${dir.path} does not exist');
    }
    for (final entity in dir.listSync(recursive: true, followLinks: false)) {
      final relative = _relative(dir.path, entity.path);
      if (relative.isEmpty) continue;
      if (entity is File) {
        files.add(_BundleFile(relative, entity));
      } else if (entity is Directory) {
        dirs.add(relative);
      }
    }
  }

  files.sort((a, b) => a.path.compareTo(b.path));
  dirs.sort();

  final body = BytesBuilder();
  final digestInput = BytesBuilder();

  for (final dir in dirs) {
    final name = _cstring(dir);
    body.add(_u32(name.length));
    body.add(name);
    digestInput.add(name);
  }

  for (final file in files) {
    final name = _cstring(file.path);
    final content = file.file.readAsBytesSync();
    body.add(_u32(name.length));
    body.add(name);
    body.add(_u32(content.length));
    body.add(content);
    digestInput.add(name);
    digestInput.add(content);
  }

  final signature = md5.convert(digestInput.takeBytes()).bytes;

  final out = BytesBuilder();
  out.add(_u32(magic));
  out.add(_u32(version));
  out.add(_u32(dirs.length));
  out.add(_u32(files.length));
  out.add(_u32(signature.length));
  out.add(signature);
  out.add(body.takeBytes());

  target.parent.createSync(recursive: true);
  target.writeAsBytesSync(out.takeBytes());
}