blob: 2a3488fbd1ee3a07dcb7ef1712f9394f0d6ac9a4 [file] [log] [blame]
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:pub/src/io.dart';
import 'package:pub/src/log.dart' as log;
import 'package:test_descriptor/test_descriptor.dart';
/// Describes a tar file and its contents.
class TarFileDescriptor extends FileDescriptor {
final List<Descriptor> contents;
TarFileDescriptor(String name, Iterable<Descriptor> contents)
: contents = contents.toList(),
super.protected(name);
/// Creates the files and directories within this tar file, then archives
/// them, compresses them, and saves the result to [parentDir].
@override
Future create([String? parent]) {
return withTempDir((tempDir) async {
await Future.wait(contents.map((entry) => entry.create(tempDir)));
var createdContents = listDir(tempDir,
recursive: true, includeHidden: true, includeDirs: false);
var bytes =
await createTarGz(createdContents, baseDir: tempDir).toBytes();
var file = path.join(parent ?? sandbox, name);
_writeBinaryFile(file, bytes);
return file;
});
}
/// Validates that the `.tar.gz` file at [path] contains the expected
/// contents.
@override
Future validate([String? parent]) {
throw UnimplementedError('TODO(nweiz): implement this');
}
@override
Future<String> read() =>
throw UnsupportedError('TarFileDescriptor.read() is not supported.');
@override
Stream<List<int>> readAsBytes() {
return Stream<List<int>>.fromFuture(withTempDir((tempDir) async {
await create(tempDir);
return readBinaryFile(path.join(tempDir, name));
}));
}
}
/// Creates [file] and writes [contents] to it.
String _writeBinaryFile(String file, List<int> contents) {
log.io('Writing ${contents.length} bytes to binary file $file.');
deleteIfLink(file);
File(file).openSync(mode: FileMode.write)
..writeFromSync(contents)
..closeSync();
log.fine('Wrote text file $file.');
return file;
}