about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJanik <80165193+Janik-Haag@users.noreply.github.com>2023-07-04 11:16:33 +0200
committerGitHub <noreply@github.com>2023-07-04 11:16:33 +0200
commita94cd99ef74d1e74c4db1922eec2e2a3f68ec4c9 (patch)
treeb2fbeb0c73fe04ed46f66738d03020d88a030384
parentd9c0d0ddfb3dac5bd5e1e564f48c87c86d1def97 (diff)
Revert "flutter: Remove Flutter 2" revert-231484-package/del/flutter2
-rw-r--r--pkgs/development/compilers/flutter/default.nix13
-rw-r--r--pkgs/development/compilers/flutter/engine-artifacts/hashes.nix140
-rw-r--r--pkgs/development/compilers/flutter/patches/flutter2/copy-without-perms.patch17
-rw-r--r--pkgs/development/compilers/flutter/patches/flutter2/disable-auto-update.patch49
-rw-r--r--pkgs/development/compilers/flutter/patches/flutter2/git-dir.patch80
-rw-r--r--pkgs/development/compilers/flutter/patches/flutter2/move-cache.patch37
-rw-r--r--pkgs/top-level/aliases.nix1
-rw-r--r--pkgs/top-level/all-packages.nix2
8 files changed, 338 insertions, 1 deletions
diff --git a/pkgs/development/compilers/flutter/default.nix b/pkgs/development/compilers/flutter/default.nix
index ba2a6f6092aae..8b5e36c39ee05 100644
--- a/pkgs/development/compilers/flutter/default.nix
+++ b/pkgs/development/compilers/flutter/default.nix
@@ -47,6 +47,7 @@ let
       };
     });
 
+  flutter2Patches = getPatches ./patches/flutter2;
   flutter3Patches = getPatches ./patches/flutter3;
 in
 {
@@ -74,4 +75,16 @@ in
     };
     patches = flutter3Patches;
   };
+
+  v2 = mkFlutter {
+    version = "2.10.5";
+    engineVersion = "57d3bac3dd5cb5b0e464ab70e7bc8a0d8cf083ab";
+    dartVersion = "2.16.2";
+    hash = "sha256-MxaWvlcCfXN8gsC116UMzqb4LgixHL3YjrGWy7WYgW4=";
+    dartHash = {
+      x86_64-linux = "sha256-vxKxysg6e3Qxtlp4dLxOZaBtgHGtl7XYd73zFZd9yJc=";
+      aarch64-linux = "sha256-ZfpR6fj/a9Bsgrg31Z/uIJaCHIWtcQH3VTTVkDJKkwA=";
+    };
+    patches = flutter2Patches;
+  };
 }
diff --git a/pkgs/development/compilers/flutter/engine-artifacts/hashes.nix b/pkgs/development/compilers/flutter/engine-artifacts/hashes.nix
index d0749bf09783c..19f21391ab900 100644
--- a/pkgs/development/compilers/flutter/engine-artifacts/hashes.nix
+++ b/pkgs/development/compilers/flutter/engine-artifacts/hashes.nix
@@ -137,4 +137,144 @@
       "linux-x64-flutter-gtk.zip" = "sha256-eluXkoISuzObXt2aiBmZGW6x8MsPTiD9bbVM4xcpe2w=";
     };
   };
+  "57d3bac3dd5cb5b0e464ab70e7bc8a0d8cf083ab" = {
+    android-arm = {
+      "artifacts.zip" = "sha256-3igOO+rgFh0fNTIIiiucqSmqC+NKFPG5H1CnIa9bDcM=";
+    };
+    android-arm-profile = {
+      "artifacts.zip" = "sha256-qai254LNrQXJBsaoQgXao6mBpzzcYHh4sUESurSyxNA=";
+      "linux-x64.zip" = "sha256-hBkntf1fX5w752ly6lVUHm6wEM/4ep9guJGma3SKjxU=";
+    };
+    android-arm-release = {
+      "artifacts.zip" = "sha256-7yuXIJyErb1PZyk56+TtlJY0o1EOwmdAvpVfGGAteuA=";
+      "linux-x64.zip" = "sha256-v/jBnE662XOX/fOhYbve7ZiQwVu0haIMOD532Vdj9Yw=";
+    };
+    android-arm64 = {
+      "artifacts.zip" = "sha256-Llxu8+SkYEtnoiMf01rffPpF/AjrlV+QPuAW850oMzo=";
+    };
+    android-arm64-profile = {
+      "artifacts.zip" = "sha256-su4U80supv8Q+2kE/5FTybiA5NFbKNMHqdB0NHCqrVI=";
+      "linux-x64.zip" = "sha256-yGt0SztNxYHDwZ1DwzLg5REE8rmMRKNn7GfCQ+GEHBw=";
+    };
+    android-arm64-release = {
+      "artifacts.zip" = "sha256-+p1+SXSEglR3jqWc/jKgmtR9nOGgMRGC+anoTs1kRc8=";
+      "linux-x64.zip" = "sha256-5UiG5gxOso8NO+7nkb6bjxW8e/Tr7mlvPRUagSRTCNs=";
+    };
+    android-x64 = {
+      "artifacts.zip" = "sha256-PVb1aKMMTlDT41O2MZRAUjCq8h+m/s2h5qOnEFPd77w=";
+    };
+    android-x64-profile = {
+      "artifacts.zip" = "sha256-gZSSRCDy42AMLMiu/KH7YsDuFVaxRcoyXzUgV8V025Y=";
+      "linux-x64.zip" = "sha256-9+LCjeI18u/GlPDMIl6Jx6b++lc90fJ5tVBlDR+ctDs=";
+    };
+    android-x64-release = {
+      "artifacts.zip" = "sha256-rsS08VP86/b2S0TEYusCEJBvS4BuevsmV9REAxRgJIc=";
+      "linux-x64.zip" = "sha256-H4nFCJ+iCUzIwHogYzS+h33eDMaFnz71dcDLSQW1aPg=";
+    };
+    android-x86 = {
+      "artifacts.zip" = "sha256-Cbo17VYWaclyO1RLHkwjbqoFVZ283IgGdN0uDdiWvQs=";
+    };
+    android-x86-jit-release = {
+      "artifacts.zip" = "sha256-gSPm2tClTj2vEYtGKgobD/mebWLNlDp8nEoFX0rhEOk=";
+    };
+    "flutter_patched_sdk.zip" = "sha256-A/y5Y+Aw0CUhXABbdyQcGCSnSbO7Ask+71m8LZDSjH4=";
+    "flutter_patched_sdk_product.zip" = "sha256-VPxF4NrTUhFbpztyPnLEiC9Cy0kDDbYvy21kA5ES4HM=";
+    linux-arm64 = {
+      "artifacts.zip" = "sha256-kCxsKQQQX6wzhD46bfoflKdz3AYYkoSyavhfyTDuHLU=";
+      "font-subset.zip" = "sha256-Yk6JsNWe7ftEQU/TsjDUZSFeLzeIbcS63lhl8fsWsdk=";
+      "linux-arm64-flutter-gtk.zip" = "sha256-girVdkXrTO5tssoi+eKwG9ykstCR/VOx8zWtcAz8AKM=";
+    };
+    linux-arm64-debug = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-girVdkXrTO5tssoi+eKwG9ykstCR/VOx8zWtcAz8AKM=";
+    };
+    linux-arm64-profile = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-VL5cwYaZ1FOJ3TwJzbgvHDQwkU9NrHGnf/tQhZ/dAGg=";
+    };
+    linux-arm64-release = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-27hy7mLFCLkqJbn+5p5eJdYnfBKTyfFe98iUMmKyz4g=";
+    };
+    linux-x64 = {
+      "artifacts.zip" = "sha256-JgEX+rKxdcWBBaxyR42eC7qOAvaawF9M2+rfaD4IgeA=";
+      "font-subset.zip" = "sha256-5EoxBrxSjaLLd+rKrxVYNoUZaejk0qcQ5LVsmqtKc2g=";
+      "linux-x64-flutter-gtk.zip" = "sha256-MH5HDPoXXi/KpQLQ0U1tQzZ0sbZx1RVhZtQ7L+WhZgk=";
+    };
+    linux-x64-debug = {
+      "linux-x64-flutter-gtk.zip" = "sha256-MH5HDPoXXi/KpQLQ0U1tQzZ0sbZx1RVhZtQ7L+WhZgk=";
+    };
+    linux-x64-profile = {
+      "linux-x64-flutter-gtk.zip" = "sha256-r2hB/AKrB5vNga2fve4tTM4j+Zp9KDqNlTjKQhQvbaI=";
+    };
+    linux-x64-release = {
+      "linux-x64-flutter-gtk.zip" = "sha256-muREs2iUiHCZM+SGN5q3HRRGnejJapKN582Aeog49MI=";
+    };
+  };
+  d44b5a94c976fbb65815374f61ab5392a220b084 = {
+    android-arm = {
+      "artifacts.zip" = "sha256-NZde8sVeknhR6bxchb/RURNIlKnJw6j5PZAWmmjiZvM=";
+    };
+    android-arm-profile = {
+      "artifacts.zip" = "sha256-BTs1tuSdjVP8zAGCxV+uQ7sAAbCt0dML4g7/85IOFEs=";
+      "linux-x64.zip" = "sha256-GpjP5omeAjHBLZjJQdUMUnPoEgYBLppicLPUTY0fHqM=";
+    };
+    android-arm-release = {
+      "artifacts.zip" = "sha256-ip2GnYkKq8aLWjVPk9no3aOf0c3k1h9foznhgLpZ17U=";
+      "linux-x64.zip" = "sha256-mGnmbraE98rqKRdO6keoITOaNCP0K3iYNRadihwOpxc=";
+    };
+    android-arm64 = {
+      "artifacts.zip" = "sha256-Sl7S/TNZWrlM4Z9UGN5rgGfpKk4UWKz6CKlQbz1qcZ4=";
+    };
+    android-arm64-profile = {
+      "artifacts.zip" = "sha256-zNZtTxM8254y+KKSVYlBUYyIV2J04XN1cmnSjkQLJs8=";
+      "linux-x64.zip" = "sha256-M8AbEwFV2zedeqMoNeb+2UbR7i9I9rGh6LXBQcPO4iA=";
+    };
+    android-arm64-release = {
+      "artifacts.zip" = "sha256-PdnAIcYccdRs3r6M8rwmgl2x+TsBPMRF/iAEgwLbt/4=";
+      "linux-x64.zip" = "sha256-kmLkKXBj/70B3v5GJ50trTlV8epj16jOlQrh1U4/pVA=";
+    };
+    android-x64 = {
+      "artifacts.zip" = "sha256-+WT7oT31XwE+ykLbiAUvnKw+WVR0VeFXPGpcMUHbsTg=";
+    };
+    android-x64-profile = {
+      "artifacts.zip" = "sha256-f298VAJoZ2x+w0bxma7wu5h7Bn6+kCdrHh5qtjhhhhc=";
+      "linux-x64.zip" = "sha256-73Br9XgafwmagxAf61NSHn4BHn4q90pHJYEXCfAG8qY=";
+    };
+    android-x64-release = {
+      "artifacts.zip" = "sha256-63hQCvObPmIxTcKyBQlXgGY6FfKp9PrbBY0RkSr1D/U=";
+      "linux-x64.zip" = "sha256-i5WQeePNxUNAbVR06Lz2XCXvZZTJxaFB6txtpVn2h9I=";
+    };
+    android-x86 = {
+      "artifacts.zip" = "sha256-J1kgvNvdWo05HMHJMlVFECLMVnoCqUm1oP4K394w+xc=";
+    };
+    android-x86-jit-release = {
+      "artifacts.zip" = "sha256-Tz/veYh/73px0eH0FOXbN4G8fVjXmEHv7G8lRm3YLtY=";
+    };
+    "flutter_patched_sdk.zip" = "sha256-uLMzCF3dsBeSZnoY9YQ2bBQhw+hUAksoDKEWr3TCnhk=";
+    "flutter_patched_sdk_product.zip" = "sha256-0NbvAGSK0VgU6jSyboyhviP9H+wID7JoTS6xMqbZs2w=";
+    linux-arm64 = {
+      "artifacts.zip" = "sha256-LTdVexuy7cL6dJqdM14YteI7Jo/z5wYOHakbX/BiV38=";
+      "font-subset.zip" = "sha256-cqLjvl3maO6NpN47/e718xyuSL8L8cHqU6ybuwlD+fA=";
+    };
+    linux-arm64-debug = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-SRlKQllg5UWHk2kOIQ6ZwbqG5FoeFGCl2F9tTI+XVOE=";
+    };
+    linux-arm64-profile = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-4wERBO+eimsSKFt8/P6mQqgzv+HURK+O/YFHAUHpklA=";
+    };
+    linux-arm64-release = {
+      "linux-arm64-flutter-gtk.zip" = "sha256-1XHdFiW//1Yd+qOLrRlk0vma99HlGDC/RA0An8db/oY=";
+    };
+    linux-x64 = {
+      "artifacts.zip" = "sha256-Bl0BRxUfVqNX6y7HdUXu5lIFzMLB2GUJauhOLEeInEE=";
+      "font-subset.zip" = "sha256-v02HV8QOqwdv30RiHpKu8ujTXOQmupGr9HCfpBUvrKM=";
+    };
+    linux-x64-debug = {
+      "linux-x64-flutter-gtk.zip" = "sha256-xjScsvWgPO8qeccw5BGzNrMLNzn5O+CvOpoPkvlrX0o=";
+    };
+    linux-x64-profile = {
+      "linux-x64-flutter-gtk.zip" = "sha256-52nMjoHQZ/ve7yJW9d8YK02U8mowe9xHZpkTwbGq9vU=";
+    };
+    linux-x64-release = {
+      "linux-x64-flutter-gtk.zip" = "sha256-SA7Th1Qasaj4Q5wFr89Rv8PNQx6s6zvHsDxT1EKKZV0=";
+    };
+  };
 }
diff --git a/pkgs/development/compilers/flutter/patches/flutter2/copy-without-perms.patch b/pkgs/development/compilers/flutter/patches/flutter2/copy-without-perms.patch
new file mode 100644
index 0000000000000..f262f04bc9454
--- /dev/null
+++ b/pkgs/development/compilers/flutter/patches/flutter2/copy-without-perms.patch
@@ -0,0 +1,17 @@
+diff --git a/packages/flutter_tools/lib/src/build_system/targets/assets.dart b/packages/flutter_tools/lib/src/build_system/targets/assets.dart
+index 68a4cd0257..1e212b9b0d 100644
+--- a/packages/flutter_tools/lib/src/build_system/targets/assets.dart
++++ b/packages/flutter_tools/lib/src/build_system/targets/assets.dart
+@@ -101,7 +101,11 @@ Future<Depfile> copyAssets(Environment environment, Directory outputDirectory, {
+             outputPath: file.path,
+             relativePath: entry.key,
+           )) {
+-            await (content.file as File).copy(file.path);
++             // Not using File.copy because it preserves permissions.
++             final sourceFile = content.file as File;
++             final destinationFile = file;
++ 
++             await destinationFile.writeAsBytes(await sourceFile.readAsBytes(), flush: true);
+           }
+         } else {
+           await file.writeAsBytes(await entry.value.contentsAsBytes());
diff --git a/pkgs/development/compilers/flutter/patches/flutter2/disable-auto-update.patch b/pkgs/development/compilers/flutter/patches/flutter2/disable-auto-update.patch
new file mode 100644
index 0000000000000..33805b7a54d25
--- /dev/null
+++ b/pkgs/development/compilers/flutter/patches/flutter2/disable-auto-update.patch
@@ -0,0 +1,49 @@
+diff --git a/bin/internal/shared.sh b/bin/internal/shared.sh
+index 05cba4393b..2a775bf24f 100644
+--- a/bin/internal/shared.sh
++++ b/bin/internal/shared.sh
+@@ -217,8 +217,6 @@ function shared::execute() {
+   # FLUTTER_TOOL_ARGS="--enable-asserts $FLUTTER_TOOL_ARGS"
+   # FLUTTER_TOOL_ARGS="$FLUTTER_TOOL_ARGS --observe=65432"
+ 
+-  upgrade_flutter 7< "$PROG_NAME"
+-
+   BIN_NAME="$(basename "$PROG_NAME")"
+   case "$BIN_NAME" in
+     flutter*)
+diff --git a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
+index 396756808e..d324a6df59 100644
+--- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
++++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
+@@ -241,7 +241,6 @@ class FlutterCommandRunner extends CommandRunner<void> {
+           globals.flutterUsage.suppressAnalytics = true;
+         }
+ 
+-        globals.flutterVersion.ensureVersionFile();
+         final bool machineFlag = topLevelResults['machine'] as bool? ?? false;
+         final bool ci = await globals.botDetector.isRunningOnBot;
+         final bool redirectedCompletion = !globals.stdio.hasTerminal &&
+@@ -250,10 +249,6 @@ class FlutterCommandRunner extends CommandRunner<void> {
+         final bool versionCheckFlag = topLevelResults['version-check'] as bool? ?? false;
+         final bool explicitVersionCheckPassed = topLevelResults.wasParsed('version-check') && versionCheckFlag;
+ 
+-        if (topLevelResults.command?.name != 'upgrade' &&
+-            (explicitVersionCheckPassed || (versionCheckFlag && !isMachine))) {
+-          await globals.flutterVersion.checkFlutterVersionFreshness();
+-        }
+ 
+         // See if the user specified a specific device.
+         globals.deviceManager?.specifiedDeviceId = topLevelResults['device-id'] as String?;
+
+diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart
+index defc86cc20..6c0824c965 100644
+--- a/packages/flutter_tools/lib/src/cache.dart
++++ b/packages/flutter_tools/lib/src/cache.dart
+@@ -666,6 +666,7 @@ class Cache {
+ 
+   /// Update the cache to contain all `requiredArtifacts`.
+   Future<void> updateAll(Set<DevelopmentArtifact> requiredArtifacts) async {
++    return;
+     if (!_lockEnabled) {
+       return;
+     }
diff --git a/pkgs/development/compilers/flutter/patches/flutter2/git-dir.patch b/pkgs/development/compilers/flutter/patches/flutter2/git-dir.patch
new file mode 100644
index 0000000000000..0136ef93106d1
--- /dev/null
+++ b/pkgs/development/compilers/flutter/patches/flutter2/git-dir.patch
@@ -0,0 +1,80 @@
+diff --git a/dev/bots/prepare_package.dart b/dev/bots/prepare_package.dart
+index 468a91a954..5def6897ce 100644
+--- a/dev/bots/prepare_package.dart
++++ b/dev/bots/prepare_package.dart
+@@ -525,7 +525,7 @@ class ArchiveCreator {
+ 
+   Future<String> _runGit(List<String> args, {Directory? workingDirectory}) {
+     return _processRunner.runProcess(
+-      <String>['git', ...args],
++      <String>['git', '--git-dir', '.git', ...args],
+       workingDirectory: workingDirectory ?? flutterRoot,
+     );
+   }
+diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart
+index f2068a6ca2..99b161689e 100644
+--- a/packages/flutter_tools/lib/src/version.dart
++++ b/packages/flutter_tools/lib/src/version.dart
+@@ -106,7 +106,7 @@ class FlutterVersion {
+     String? channel = _channel;
+     if (channel == null) {
+       final String gitChannel = _runGit(
+-        'git rev-parse --abbrev-ref --symbolic @{u}',
++        'git --git-dir .git rev-parse --abbrev-ref --symbolic @{u}',
+         globals.processUtils,
+         _workingDirectory,
+       );
+@@ -114,7 +114,7 @@ class FlutterVersion {
+       if (slash != -1) {
+         final String remote = gitChannel.substring(0, slash);
+         _repositoryUrl = _runGit(
+-          'git ls-remote --get-url $remote',
++          'git --git-dir .git ls-remote --get-url $remote',
+           globals.processUtils,
+           _workingDirectory,
+         );
+@@ -326,7 +326,7 @@ class FlutterVersion {
+   /// the branch name will be returned as `'[user-branch]'`.
+   String getBranchName({ bool redactUnknownBranches = false }) {
+     _branch ??= () {
+-      final String branch = _runGit('git rev-parse --abbrev-ref HEAD', globals.processUtils);
++      final String branch = _runGit('git --git-dir .git rev-parse --abbrev-ref HEAD', globals.processUtils);
+       return branch == 'HEAD' ? channel : branch;
+     }();
+     if (redactUnknownBranches || _branch!.isEmpty) {
+@@ -359,7 +359,7 @@ class FlutterVersion {
+   /// wrapper that does that.
+   @visibleForTesting
+   static List<String> gitLog(List<String> args) {
+-    return <String>['git', '-c', 'log.showSignature=false', 'log'] + args;
++    return <String>['git', '-c', 'log.showSignature=false', '--git-dir', '.git', 'log'] + args;
+   }
+ 
+   /// Gets the release date of the latest available Flutter version.
+@@ -730,7 +730,7 @@ class GitTagVersion {
+ 
+   static GitTagVersion determine(ProcessUtils processUtils, {String? workingDirectory, bool fetchTags = false, String gitRef = 'HEAD'}) {
+     if (fetchTags) {
+-      final String channel = _runGit('git rev-parse --abbrev-ref HEAD', processUtils, workingDirectory);
++      final String channel = _runGit('git --git-dir .git rev-parse --abbrev-ref HEAD', processUtils, workingDirectory);
+       if (channel == 'dev' || channel == 'beta' || channel == 'stable') {
+         globals.printTrace('Skipping request to fetchTags - on well known channel $channel.');
+       } else {
+@@ -739,7 +739,7 @@ class GitTagVersion {
+     }
+     // find all tags attached to the given [gitRef]
+     final List<String> tags = _runGit(
+-      'git tag --points-at $gitRef', processUtils, workingDirectory).trim().split('\n');
++      'git --git-dir .git tag --points-at $gitRef', processUtils, workingDirectory).trim().split('\n');
+ 
+     // Check first for a stable tag
+     final RegExp stableTagPattern = RegExp(r'^\d+\.\d+\.\d+$');
+@@ -760,7 +760,7 @@ class GitTagVersion {
+     // recent tag and number of commits past.
+     return parse(
+       _runGit(
+-        'git describe --match *.*.* --long --tags $gitRef',
++        'git --git-dir .git describe --match *.*.* --long --tags $gitRef',
+         processUtils,
+         workingDirectory,
+       )
diff --git a/pkgs/development/compilers/flutter/patches/flutter2/move-cache.patch b/pkgs/development/compilers/flutter/patches/flutter2/move-cache.patch
new file mode 100644
index 0000000000000..efab81d2fc0ed
--- /dev/null
+++ b/pkgs/development/compilers/flutter/patches/flutter2/move-cache.patch
@@ -0,0 +1,37 @@
+diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart
+index dd80b1e46e..8e54517765 100644
+--- a/packages/flutter_tools/lib/src/cache.dart
++++ b/packages/flutter_tools/lib/src/cache.dart
+@@ -22,6 +22,7 @@ import 'base/user_messages.dart';
+ import 'build_info.dart';
+ import 'convert.dart';
+ import 'features.dart';
++import 'globals.dart' as globals;
+ 
+ const String kFlutterRootEnvironmentVariableName = 'FLUTTER_ROOT'; // should point to //flutter/ (root of flutter/flutter repo)
+ const String kFlutterEngineEnvironmentVariableName = 'FLUTTER_ENGINE'; // should point to //engine/src/ (root of flutter/engine repo)
+@@ -318,8 +319,13 @@ class Cache {
+       return;
+     }
+     assert(_lock == null);
++    final Directory dir = _fileSystem.directory(_fileSystem.path.join(globals.fsUtils.homeDirPath!, '.cache', 'flutter'));
++    if (!dir.existsSync()) {
++      dir.createSync(recursive: true);
++      globals.os.chmod(dir, '755');
++    }
+     final File lockFile =
+-      _fileSystem.file(_fileSystem.path.join(flutterRoot!, 'bin', 'cache', 'lockfile'));
++      _fileSystem.file(_fileSystem.path.join(globals.fsUtils.homeDirPath!, '.cache', 'flutter', 'lockfile'));
+     try {
+       _lock = lockFile.openSync(mode: FileMode.write);
+     } on FileSystemException catch (e) {
+@@ -378,8 +384,7 @@ class Cache {
+ 
+   String get devToolsVersion {
+     if (_devToolsVersion == null) {
+-      const String devToolsDirPath = 'dart-sdk/bin/resources/devtools';
+-      final Directory devToolsDir = getCacheDir(devToolsDirPath, shouldCreate: false);
++      final Directory devToolsDir = _fileSystem.directory(_fileSystem.path.join(flutterRoot!, 'bin/cache/dart-sdk/bin/resources/devtools'));
+       if (!devToolsDir.existsSync()) {
+         throw Exception('Could not find directory at ${devToolsDir.path}');
+       }
diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix
index dac19c2f4da47..fb0820d82ea77 100644
--- a/pkgs/top-level/aliases.nix
+++ b/pkgs/top-level/aliases.nix
@@ -520,7 +520,6 @@ mapAliases ({
   flink_1_5 = throw "flink_1_5 was removed, use flink instead"; # Added 2021-01-25
   flutter-beta = throw "Non-stable versions of Flutter have been removed. You can use flutterPackages.mkFlutter to generate a package for other Flutter versions"; # Added 2020-01-15
   flutter-dev = throw "Non-stable versions of Flutter have been removed. You can use flutterPackages.mkFlutter to generate a package for other Flutter versions"; # Added 2020-01-15
-  flutter2 = throw "flutter2 has been removed because it isn't updated anymore, and no packages in nixpkgs use it. If you still need it, use flutter.mkFlutter to get a custom version"; # Added 2023-07-03
   flvtool2 = throw "flvtool2 has been removed"; # Added 2020-11-03
   fme = throw "fme was removed, because it is old and uses Glade, a discontinued library"; # Added 2022-01-26
   foldingathome = fahclient; # Added 2020-09-03
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 8e8118efb7cf6..704a6ec21d400 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -15180,8 +15180,10 @@ with pkgs;
     recurseIntoAttrs (callPackage ../development/compilers/flutter { });
   flutter-unwrapped = flutterPackages.stable;
   flutter37-unwrapped = flutterPackages.v37;
+  flutter2-unwrapped = flutterPackages.v2;
   flutter = flutterPackages.wrapFlutter flutter-unwrapped;
   flutter37 = flutterPackages.wrapFlutter flutter37-unwrapped;
+  flutter2 = flutterPackages.wrapFlutter flutter2-unwrapped;
 
   fnm = callPackage ../development/tools/fnm {
     inherit (darwin.apple_sdk.frameworks) DiskArbitration Foundation Security;