Unverified Commit 2c6f862b authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] add EPERM to set of immediate exit errors (#66159)

parent cfe53fd3
...@@ -297,6 +297,36 @@ class ErrorHandlingDirectory ...@@ -297,6 +297,36 @@ class ErrorHandlingDirectory
); );
} }
@override
Future<Directory> create({bool recursive = false}) {
return _run<Directory>(
() async => wrap(await delegate.create(recursive: recursive)),
platform: _platform,
failureMessage:
'Flutter failed to create a directory at "${delegate.path}"',
);
}
@override
Future<Directory> delete({bool recursive = false}) {
return _run<Directory>(
() async => wrap(fileSystem.directory((await delegate.delete(recursive: recursive)).path)),
platform: _platform,
failureMessage:
'Flutter failed to delete a directory at "${delegate.path}"',
);
}
@override
void deleteSync({bool recursive = false}) {
return _runSync<void>(
() => delegate.deleteSync(recursive: recursive),
platform: _platform,
failureMessage:
'Flutter failed to delete a directory at "${delegate.path}"',
);
}
@override @override
String toString() => delegate.toString(); String toString() => delegate.toString();
} }
...@@ -495,6 +525,7 @@ void _handlePosixException(Exception e, String message, int errorCode) { ...@@ -495,6 +525,7 @@ void _handlePosixException(Exception e, String message, int errorCode) {
// https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/errno.h // https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/errno.h
// https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/errno-base.h // https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/errno-base.h
// https://github.com/apple/darwin-xnu/blob/master/bsd/dev/dtrace/scripts/errno.d // https://github.com/apple/darwin-xnu/blob/master/bsd/dev/dtrace/scripts/errno.d
const int eperm = 1;
const int enospc = 28; const int enospc = 28;
const int eacces = 13; const int eacces = 13;
// Catch errors and bail when: // Catch errors and bail when:
...@@ -506,9 +537,10 @@ void _handlePosixException(Exception e, String message, int errorCode) { ...@@ -506,9 +537,10 @@ void _handlePosixException(Exception e, String message, int errorCode) {
'Free up space and try again.', 'Free up space and try again.',
); );
break; break;
case eperm:
case eacces: case eacces:
throwToolExit( throwToolExit(
'$message. The flutter tool cannot access the file.\n' '$message. The flutter tool cannot access the file or directory.\n'
'Please ensure that the SDK and/or project is installed in a location ' 'Please ensure that the SDK and/or project is installed in a location '
'that has read/write permissions for the current user.' 'that has read/write permissions for the current user.'
); );
......
...@@ -85,6 +85,14 @@ void setupDirectoryMocks({ ...@@ -85,6 +85,14 @@ void setupDirectoryMocks({
.thenThrow(FileSystemException('', '', OSError('', errorCode))); .thenThrow(FileSystemException('', '', OSError('', errorCode)));
when(mockDirectory.createSync(recursive: anyNamed('recursive'))) when(mockDirectory.createSync(recursive: anyNamed('recursive')))
.thenThrow(FileSystemException('', '', OSError('', errorCode))); .thenThrow(FileSystemException('', '', OSError('', errorCode)));
when(mockDirectory.create())
.thenThrow(FileSystemException('', '', OSError('', errorCode)));
when(mockDirectory.createSync())
.thenThrow(FileSystemException('', '', OSError('', errorCode)));
when(mockDirectory.delete())
.thenThrow(FileSystemException('', '', OSError('', errorCode)));
when(mockDirectory.deleteSync())
.thenThrow(FileSystemException('', '', OSError('', errorCode)));
} }
void main() { void main() {
...@@ -198,6 +206,7 @@ void main() { ...@@ -198,6 +206,7 @@ void main() {
}); });
group('throws ToolExit on Linux', () { group('throws ToolExit on Linux', () {
const int eperm = 1;
const int enospc = 28; const int enospc = 28;
const int eacces = 13; const int eacces = 13;
MockFileSystem mockFileSystem; MockFileSystem mockFileSystem;
...@@ -221,7 +230,7 @@ void main() { ...@@ -221,7 +230,7 @@ void main() {
final File file = fs.file('file'); final File file = fs.file('file');
const String expectedMessage = 'The flutter tool cannot access the file'; const String expectedMessage = 'The flutter tool cannot access the file or directory';
expect(() async => await file.writeAsBytes(<int>[0]), expect(() async => await file.writeAsBytes(<int>[0]),
throwsToolExit(message: expectedMessage)); throwsToolExit(message: expectedMessage));
expect(() async => await file.writeAsString(''), expect(() async => await file.writeAsString(''),
...@@ -234,6 +243,26 @@ void main() { ...@@ -234,6 +243,26 @@ void main() {
throwsToolExit(message: expectedMessage)); throwsToolExit(message: expectedMessage));
}); });
testWithoutContext('when access is denied for directories', () async {
setupDirectoryMocks(
mockFileSystem: mockFileSystem,
fs: fs,
errorCode: eperm,
);
final Directory directory = fs.directory('file');
const String expectedMessage = 'The flutter tool cannot access the file or directory';
expect(() async => await directory.create(),
throwsToolExit(message: expectedMessage));
expect(() async => await directory.delete(),
throwsToolExit(message: expectedMessage));
expect(() => directory.createSync(),
throwsToolExit(message: expectedMessage));
expect(() => directory.deleteSync(),
throwsToolExit(message: expectedMessage));
});
testWithoutContext('when writing to a full device', () async { testWithoutContext('when writing to a full device', () async {
setupWriteMocks( setupWriteMocks(
mockFileSystem: mockFileSystem, mockFileSystem: mockFileSystem,
...@@ -273,6 +302,7 @@ void main() { ...@@ -273,6 +302,7 @@ void main() {
group('throws ToolExit on macOS', () { group('throws ToolExit on macOS', () {
const int eperm = 1;
const int enospc = 28; const int enospc = 28;
const int eacces = 13; const int eacces = 13;
MockFileSystem mockFileSystem; MockFileSystem mockFileSystem;
...@@ -309,6 +339,26 @@ void main() { ...@@ -309,6 +339,26 @@ void main() {
throwsToolExit(message: expectedMessage)); throwsToolExit(message: expectedMessage));
}); });
testWithoutContext('when access is denied for directories', () async {
setupDirectoryMocks(
mockFileSystem: mockFileSystem,
fs: fs,
errorCode: eperm,
);
final Directory directory = fs.directory('file');
const String expectedMessage = 'The flutter tool cannot access the file or directory';
expect(() async => await directory.create(),
throwsToolExit(message: expectedMessage));
expect(() async => await directory.delete(),
throwsToolExit(message: expectedMessage));
expect(() => directory.createSync(),
throwsToolExit(message: expectedMessage));
expect(() => directory.deleteSync(),
throwsToolExit(message: expectedMessage));
});
testWithoutContext('when writing to a full device', () async { testWithoutContext('when writing to a full device', () async {
setupWriteMocks( setupWriteMocks(
mockFileSystem: mockFileSystem, mockFileSystem: mockFileSystem,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment