Fix "gclient sync" call in "dt serve" for Windows (#9976)
diff --git a/tool/lib/model.dart b/tool/lib/model.dart
index 12df455..b31e4a1 100644
--- a/tool/lib/model.dart
+++ b/tool/lib/model.dart
@@ -5,6 +5,7 @@
 import 'dart:io';
 
 import 'package:collection/collection.dart';
+import 'package:devtools_tool/utils.dart';
 import 'package:path/path.dart' as path;
 
 class DevToolsRepo {
@@ -278,14 +279,16 @@
 
   final String sdkPath;
 
-  static String get flutterExecutableName =>
-      Platform.isWindows ? 'flutter.bat' : 'flutter';
+  /// The name of the 'flutter' shell script for the current platform.
+  static String get flutterExecutableName => shellScriptName('flutter');
 
+  /// The name of the 'dart' wrapper shell script in Flutter for the current
+  /// platform.
+  ///
   /// On windows, 'dart' is fine for running the .exe from the Dart SDK directly
   /// but the wrapper in the Flutter bin folder is a .bat and needs an explicit
   /// extension.
-  static String get dartWrapperExecutableName =>
-      Platform.isWindows ? 'dart.bat' : 'dart';
+  static String get dartWrapperExecutableName => shellScriptName('dart');
 
   String get flutterExePath => path.join(sdkPath, 'bin', flutterExecutableName);
 
diff --git a/tool/lib/utils.dart b/tool/lib/utils.dart
index 97e3b59..45ecdc8 100644
--- a/tool/lib/utils.dart
+++ b/tool/lib/utils.dart
@@ -31,6 +31,14 @@
   }
 }
 
+/// Returns the name of the shell script [name] for the current platform.
+///
+/// On Windows, shell scripts have `.bat` extensions and must be invoked
+/// using them.
+String shellScriptName(String name) {
+  return Platform.isWindows ? '$name.bat' : name;
+}
+
 String localDartSdkLocation() {
   final localDartSdkLocation = Platform.environment['LOCAL_DART_SDK'];
   if (localDartSdkLocation == null) {
@@ -86,7 +94,11 @@
     List<String> args, {
     bool throwOnException = true,
   }) {
-    return CliCommand('gclient', args, throwOnException: throwOnException);
+    return CliCommand(
+      shellScriptName('gclient'),
+      args,
+      throwOnException: throwOnException,
+    );
   }
 
   factory CliCommand.tool(List<String> args, {bool throwOnException = true}) {