mirror of
https://github.com/flutter/packages.git
synced 2025-06-30 23:03:11 +08:00
Add timeout to tar command and exit if it doesn't succeed. (#156)
* Add timeout to tar command and exit if it doesn't succeed. Also remove the verbose option of the tar file to improve speed. Bug: https://github.com/flutter/flutter/issues/57176 * Add tests and reduce timeout to 5 mins.
This commit is contained in:
@ -262,7 +262,12 @@ Future<OperationResult> pushPackages(
|
|||||||
|
|
||||||
stdout.writeln('Untaring $repoArchive to ${repo.path}');
|
stdout.writeln('Untaring $repoArchive to ${repo.path}');
|
||||||
repo.createSync(recursive: true);
|
repo.createSync(recursive: true);
|
||||||
await tar.untar(repoArchive, repo.path);
|
final OperationResult result = await tar.untar(repoArchive, repo.path);
|
||||||
|
if (!result.success) {
|
||||||
|
stdout.writeln(
|
||||||
|
'Error untarring $repoArchive \nstdout: ${result.info} \nstderr: ${result.error}');
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
final String repositoryBase = path.join(repo.path, 'amber-files');
|
final String repositoryBase = path.join(repo.path, 'amber-files');
|
||||||
stdout.writeln('Serving $repositoryBase to $targetIp');
|
stdout.writeln('Serving $repositoryBase to $targetIp');
|
||||||
|
@ -17,7 +17,11 @@ abstract class Tar {
|
|||||||
const Tar();
|
const Tar();
|
||||||
|
|
||||||
/// Untars a tar file.
|
/// Untars a tar file.
|
||||||
Future<OperationResult> untar(String src, String destination);
|
Future<OperationResult> untar(
|
||||||
|
String src,
|
||||||
|
String destination, {
|
||||||
|
Duration timeoutMs,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The archive package is very slow and memory intensive. Use
|
/// The archive package is very slow and memory intensive. Use
|
||||||
@ -35,16 +39,21 @@ class SystemTar implements Tar {
|
|||||||
/// program.
|
/// program.
|
||||||
final ProcessManager processManager;
|
final ProcessManager processManager;
|
||||||
|
|
||||||
|
/// The default timeout for untar operations as [Duration] in milliseconds.
|
||||||
|
static const Duration defaultTarTimeoutMs =
|
||||||
|
Duration(milliseconds: 5 * 60 * 1000);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<OperationResult> untar(
|
Future<OperationResult> untar(
|
||||||
String src,
|
String src,
|
||||||
String destination,
|
String destination, {
|
||||||
) async {
|
Duration timeoutMs = defaultTarTimeoutMs,
|
||||||
|
}) async {
|
||||||
final ProcessResult result = await processManager.run(<String>[
|
final ProcessResult result = await processManager.run(<String>[
|
||||||
'tar',
|
'tar',
|
||||||
'-xvf', src, //
|
'-xf', src, //
|
||||||
'-C', destination,
|
'-C', destination,
|
||||||
]);
|
]).timeout(timeoutMs);
|
||||||
|
|
||||||
return OperationResult.fromProcessResult(result);
|
return OperationResult.fromProcessResult(result);
|
||||||
}
|
}
|
||||||
|
@ -158,7 +158,8 @@ class FakeTar implements Tar {
|
|||||||
final MemoryFileSystem fs;
|
final MemoryFileSystem fs;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<OperationResult> untar(String src, String destination) async {
|
Future<OperationResult> untar(String src, String destination,
|
||||||
|
{Duration timeoutMs}) async {
|
||||||
if (passes) {
|
if (passes) {
|
||||||
final Directory dir = fs.directory(destination)
|
final Directory dir = fs.directory(destination)
|
||||||
..createSync(recursive: true);
|
..createSync(recursive: true);
|
||||||
|
35
packages/fuchsia_ctl/test/tar_test.dart
Normal file
35
packages/fuchsia_ctl/test/tar_test.dart
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// Copyright 2020 The Flutter Authors. 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:process/process.dart';
|
||||||
|
import 'package:test/test.dart';
|
||||||
|
import 'package:fuchsia_ctl/src/tar.dart';
|
||||||
|
import 'package:mockito/mockito.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
group('Tar', () {
|
||||||
|
test('Untar file times out', () async {
|
||||||
|
final MockProcessManager processManager = MockProcessManager();
|
||||||
|
|
||||||
|
when(processManager.run(any)).thenAnswer((_) async {
|
||||||
|
await Future<void>.delayed(const Duration(milliseconds: 3));
|
||||||
|
return ProcessResult(0, 0, 'Good job', '');
|
||||||
|
});
|
||||||
|
|
||||||
|
final Tar tar = SystemTar(processManager: processManager);
|
||||||
|
expect(
|
||||||
|
tar.untar(
|
||||||
|
'source.tar',
|
||||||
|
'/destination',
|
||||||
|
timeoutMs: const Duration(milliseconds: 1),
|
||||||
|
),
|
||||||
|
throwsA(const TypeMatcher<TimeoutException>()));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
class MockProcessManager extends Mock implements ProcessManager {}
|
Reference in New Issue
Block a user