diff --git a/.ci/Dockerfile b/.ci/Dockerfile index a7b75d6c97f0..14a1b03a7885 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,5 +1,5 @@ -# Last updated 10/22/2020 (to rebuild the docker image, update this timestamp) -FROM cirrusci/flutter:stable-web +# Last updated 11/26/2020 (to rebuild the docker image, update this timestamp) +FROM cirrusci/flutter:dev RUN sudo apt-get update && \ sudo apt-get upgrade --yes && \ @@ -9,6 +9,7 @@ RUN sudo apt-get update && \ # This must occur after the install of gpg-agent RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - && \ sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-5.0 main" && \ + sudo apt-add-repository "deb http://archive.ubuntu.com/ubuntu/ xenial main" && \ sudo apt-get update && \ sudo apt-get install --yes --allow-unauthenticated clang-format-5.0 && \ sudo apt-get clean --yes diff --git a/.cirrus.yml b/.cirrus.yml index 673bf9ba34e8..5a74c3855fc2 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -5,9 +5,9 @@ task: cpu: 4 memory: 8G upgrade_script: - - flutter channel master + - flutter channel dev - flutter upgrade - - git fetch origin master + - git fetch origin nnbd activate_script: pub global activate flutter_plugin_tools matrix: - name: analyze @@ -31,16 +31,18 @@ task: - ./script/incremental_build.sh java-test # must come after apk build depends_on: - analyze - - name: web_benchmarks_test - script: - - ./script/install_chromium.sh - - export CHROME_EXECUTABLE=$(pwd)/.chromium/chrome-linux/chrome - - flutter config --enable-web - - cd packages/web_benchmarks/testing/test_app - - flutter packages get - - cd ../.. - - flutter packages get - - dart testing/web_benchmarks_test.dart + # TODO(shihaohong): Skip because new builds do not contain Chromium: + # https://github.com/cirruslabs/docker-images-flutter/issues/66 + # - name: web_benchmarks_test + # script: + # - ./script/install_chromium.sh + # - export CHROME_EXECUTABLE=$(pwd)/.chromium/chrome-linux/chrome + # - flutter config --enable-web + # - cd packages/web_benchmarks/testing/test_app + # - flutter packages get + # - cd ../.. + # - flutter packages get + # - dart testing/web_benchmarks_test.dart task: use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' diff --git a/packages/xdg_directories/CHANGELOG.md b/packages/xdg_directories/CHANGELOG.md index 3ebfa401cefd..2e5b7932eecf 100644 --- a/packages/xdg_directories/CHANGELOG.md +++ b/packages/xdg_directories/CHANGELOG.md @@ -1,3 +1,7 @@ +## [0.2.0-nullsafety.0] - Migrated to null safety + +* Migrated to null safety. + ## [0.1.2] - Reduce dependencies on external libraries. * Broaden dependencies to allow nullsafety version of process, meta, and path to be OK. diff --git a/packages/xdg_directories/lib/xdg_directories.dart b/packages/xdg_directories/lib/xdg_directories.dart index ba4be8b4cd8f..787fb640d4e0 100644 --- a/packages/xdg_directories/lib/xdg_directories.dart +++ b/packages/xdg_directories/lib/xdg_directories.dart @@ -13,7 +13,7 @@ import 'package:process/process.dart'; /// An override function used by the tests to override the environment variable /// lookups using [xdgEnvironmentOverride]. -typedef EnvironmentAccessor = String Function(String envVar); +typedef EnvironmentAccessor = String? Function(String envVar); /// A testing setter that replaces the real environment lookups with an override. /// @@ -21,7 +21,7 @@ typedef EnvironmentAccessor = String Function(String envVar); /// /// Only available to tests. @visibleForTesting -set xdgEnvironmentOverride(EnvironmentAccessor override) { +set xdgEnvironmentOverride(EnvironmentAccessor? override) { _xdgEnvironmentOverride = override; _getenv = _xdgEnvironmentOverride ?? _productionGetEnv; } @@ -31,8 +31,8 @@ set xdgEnvironmentOverride(EnvironmentAccessor override) { /// /// Only available to tests. @visibleForTesting -EnvironmentAccessor get xdgEnvironmentOverride => _xdgEnvironmentOverride; -EnvironmentAccessor _xdgEnvironmentOverride; +EnvironmentAccessor? get xdgEnvironmentOverride => _xdgEnvironmentOverride; +EnvironmentAccessor? _xdgEnvironmentOverride; EnvironmentAccessor _productionGetEnv = (String value) => Platform.environment[value]; EnvironmentAccessor _getenv = _productionGetEnv; @@ -50,9 +50,9 @@ ProcessManager _processManager = const LocalProcessManager(); List _directoryListFromEnvironment( String envVar, List fallback) { - assert(envVar != null); - assert(fallback != null); - final String value = _getenv(envVar); + ArgumentError.checkNotNull(envVar); + ArgumentError.checkNotNull(fallback); + final String? value = _getenv(envVar); if (value == null || value.isEmpty) { return fallback; } @@ -63,13 +63,20 @@ List _directoryListFromEnvironment( }).toList(); } -Directory _directoryFromEnvironment(String envVar, String fallback) { - assert(envVar != null); - final String value = _getenv(envVar); +Directory? _directoryFromEnvironment(String envVar) { + ArgumentError.checkNotNull(envVar); + final String? value = _getenv(envVar); + if (value == null || value.isEmpty) { + return null; + } + return Directory(value); +} + +Directory _directoryFromEnvironmentWithFallback( + String envVar, String fallback) { + ArgumentError.checkNotNull(envVar); + final String? value = _getenv(envVar); if (value == null || value.isEmpty) { - if (fallback == null) { - return null; - } return _getDirectory(fallback); } return Directory(value); @@ -77,9 +84,9 @@ Directory _directoryFromEnvironment(String envVar, String fallback) { // Creates a Directory from a fallback path. Directory _getDirectory(String subdir) { - assert(subdir != null); + ArgumentError.checkNotNull(subdir); assert(subdir.isNotEmpty); - final String homeDir = _getenv('HOME'); + final String? homeDir = _getenv('HOME'); if (homeDir == null || homeDir.isEmpty) { throw StateError( 'The "HOME" environment variable is not set. This package (and POSIX) ' @@ -94,7 +101,7 @@ Directory _getDirectory(String subdir) { /// /// Throws [StateError] if the HOME environment variable is not set. Directory get cacheHome => - _directoryFromEnvironment('XDG_CACHE_HOME', '.cache'); + _directoryFromEnvironmentWithFallback('XDG_CACHE_HOME', '.cache'); /// The list of preference-ordered base directories relative to /// which configuration files should be searched. (Corresponds to @@ -113,7 +120,7 @@ List get configDirs { /// /// Throws [StateError] if the HOME environment variable is not set. Directory get configHome => - _directoryFromEnvironment('XDG_CONFIG_HOME', '.config'); + _directoryFromEnvironmentWithFallback('XDG_CONFIG_HOME', '.config'); /// The list of preference-ordered base directories relative to /// which data files should be searched. (Corresponds to `$XDG_DATA_DIRS`). @@ -131,14 +138,14 @@ List get dataDirs { /// /// Throws [StateError] if the HOME environment variable is not set. Directory get dataHome => - _directoryFromEnvironment('XDG_DATA_HOME', '.local/share'); + _directoryFromEnvironmentWithFallback('XDG_DATA_HOME', '.local/share'); /// The base directory relative to which user-specific runtime /// files and other file objects should be placed. (Corresponds to /// `$XDG_RUNTIME_DIR`). /// /// Throws [StateError] if the HOME environment variable is not set. -Directory get runtimeDir => _directoryFromEnvironment('XDG_RUNTIME_DIR', null); +Directory? get runtimeDir => _directoryFromEnvironment('XDG_RUNTIME_DIR'); /// Gets the xdg user directory named by `dirName`. /// @@ -147,7 +154,7 @@ Directory getUserDirectory(String dirName) { final ProcessResult result = _processManager.runSync( ['xdg-user-dir', dirName], includeParentEnvironment: true, - stdoutEncoding: Encoding.getByName('utf8'), + stdoutEncoding: Encoding.getByName('utf8') ?? systemEncoding, ); final String path = utf8.decode(result.stdout).split('\n')[0]; return Directory(path); @@ -172,11 +179,11 @@ Set getUserDirectoryNames() { final RegExp dirRegExp = RegExp(r'^\s*XDG_(?[^=]*)_DIR\s*=\s*(?.*)\s*$'); for (String line in contents) { - final RegExpMatch match = dirRegExp.firstMatch(line); + final RegExpMatch? match = dirRegExp.firstMatch(line); if (match == null) { continue; } - result.add(match.namedGroup('dirname')); + result.add(match.namedGroup('dirname')!); } return result; } diff --git a/packages/xdg_directories/pubspec.yaml b/packages/xdg_directories/pubspec.yaml index 92e743762385..639c81ca375f 100644 --- a/packages/xdg_directories/pubspec.yaml +++ b/packages/xdg_directories/pubspec.yaml @@ -1,16 +1,16 @@ name: xdg_directories description: A Dart package for reading XDG directory configuration information on Linux. -version: 0.1.2 +version: 0.2.0-nullsafety.0 homepage: https://github.com/flutter/packages/tree/master/packages/xdg_directories environment: - sdk: ">=2.3.0 <3.0.0" + sdk: ">=2.12.0-0 <3.0.0" dependencies: - meta: ">=1.2.2 <2.0.0" - path: ">=1.6.4 <2.0.0" - process: ">=3.0.12 <5.0.0" + meta: ^1.3.0-nullsafety.6 + path: ^1.8.0-nullsafety.3 + process: ^4.0.0-nullsafety.4 dev_dependencies: - mockito: ^4.1.1 - test: ^1.15.3 + mockito: ^5.0.0-nullsafety.1 + test: ^1.16.0-nullsafety.13 diff --git a/packages/xdg_directories/test/xdg_directories_test.dart b/packages/xdg_directories/test/xdg_directories_test.dart index 9e1eca2b3c04..41018a7b8f13 100644 --- a/packages/xdg_directories/test/xdg_directories_test.dart +++ b/packages/xdg_directories/test/xdg_directories_test.dart @@ -14,7 +14,7 @@ import 'package:xdg_directories/xdg_directories.dart' as xdg; void main() { final Map fakeEnv = {}; - Directory tmpDir; + late Directory tmpDir; String testPath(String subdir) => path.join(tmpDir.path, subdir); @@ -29,11 +29,11 @@ void main() { '${testPath('usr/local/test_share')}:${testPath('usr/test_share')}'; fakeEnv['XDG_DATA_HOME'] = testPath('.local/test_share'); fakeEnv['XDG_RUNTIME_DIR'] = testPath('.local/test_runtime'); - Directory(fakeEnv['XDG_CONFIG_HOME']).createSync(recursive: true); - Directory(fakeEnv['XDG_CACHE_HOME']).createSync(recursive: true); - Directory(fakeEnv['XDG_DATA_HOME']).createSync(recursive: true); - Directory(fakeEnv['XDG_RUNTIME_DIR']).createSync(recursive: true); - File(path.join(fakeEnv['XDG_CONFIG_HOME'], 'user-dirs.dirs')) + Directory(fakeEnv['XDG_CONFIG_HOME']!).createSync(recursive: true); + Directory(fakeEnv['XDG_CACHE_HOME']!).createSync(recursive: true); + Directory(fakeEnv['XDG_DATA_HOME']!).createSync(recursive: true); + Directory(fakeEnv['XDG_RUNTIME_DIR']!).createSync(recursive: true); + File(path.join(fakeEnv['XDG_CONFIG_HOME']!, 'user-dirs.dirs')) .writeAsStringSync(r''' XDG_DESKTOP_DIR="$HOME/Desktop" XDG_DOCUMENTS_DIR="$HOME/Documents" @@ -48,9 +48,7 @@ XDG_VIDEOS_DIR="$HOME/Videos" }); tearDown(() { - if (tmpDir != null) { - tmpDir.deleteSync(recursive: true); - } + tmpDir.deleteSync(recursive: true); // Stop overriding the environment accessor. xdg.xdgEnvironmentOverride = null; }); @@ -76,7 +74,7 @@ XDG_VIDEOS_DIR="$HOME/Videos" expect(xdg.cacheHome.path, equals(testPath('.test_cache'))); expect(xdg.configHome.path, equals(testPath('.test_config'))); expect(xdg.dataHome.path, equals(testPath('.local/test_share'))); - expect(xdg.runtimeDir.path, equals(testPath('.local/test_runtime'))); + expect(xdg.runtimeDir!.path, equals(testPath('.local/test_runtime'))); expectDirList(xdg.configDirs, [testPath('etc/test_xdg')]); expectDirList(xdg.dataDirs, [ @@ -122,13 +120,13 @@ class FakeProcessManager extends Fake implements ProcessManager { @override ProcessResult runSync( List command, { - String workingDirectory, - Map environment, + String? workingDirectory, + Map? environment, bool includeParentEnvironment = true, bool runInShell = false, Encoding stdoutEncoding = systemEncoding, Encoding stderrEncoding = systemEncoding, }) { - return ProcessResult(0, 0, expected[command[1]].codeUnits, []); + return ProcessResult(0, 0, expected[command[1]]!.codeUnits, []); } }