[flutter_tool,fuchsia] Update the install flow for packaging migration. (#34447)
diff --git a/packages/flutter_tools/lib/src/fuchsia/amber_ctl.dart b/packages/flutter_tools/lib/src/fuchsia/amber_ctl.dart
index 8389eb7..8418366 100644
--- a/packages/flutter_tools/lib/src/fuchsia/amber_ctl.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/amber_ctl.dart
@@ -27,6 +27,12 @@
// -x: do not disable other active sources (if the provided source is
// enabled)
//
+// add_repo_cfg - add a repository config to the set of known repositories,
+// using a source config
+// -n: name of the update source (optional, with URL)
+// -f: file path or url to a source config file
+// -h: SHA256 hash of source config file (optional, with URL)
+//
// rm_src - remove a source, if it exists
// -n: name of the update source
//
@@ -73,4 +79,31 @@
await device.shell('amber_ctl get_up -n $packageName');
return result.exitCode == 0;
}
+
+ /// Converts the amber source config created when [server] was set up to a
+ /// pkg_resolver repo config, and teaches the pkg_resolver instance running
+ /// on [device] about the [FuchsiaPackageServer].
+ Future<bool> addRepoCfg(FuchsiaDevice device, FuchsiaPackageServer server) async {
+ final String configUrl = '${server.url}/config.json';
+ final RunResult result =
+ await device.shell('amber_ctl add_repo_cfg -n ${server.name} -f $configUrl');
+ return result.exitCode == 0;
+ }
+
+ /// Instructs the pkg_resolver instance running on [device] to prefetch the
+ /// package [packageName].
+ Future<bool> pkgCtlResolve(FuchsiaDevice device, FuchsiaPackageServer server,
+ String packageName) async {
+ final String packageUrl = 'fuchsia-pkg://${server.name}/$packageName';
+ final RunResult result = await device.shell('pkgctl resolve $packageUrl');
+ return result.exitCode == 0;
+ }
+
+ /// Instructs the pkg_resolver instance running on [device] to forget about
+ /// the Fuchsia package server that it was accessing via [serverUrl].
+ Future<bool> pkgCtlRepoRemove(FuchsiaDevice device, FuchsiaPackageServer server) async {
+ final String repoUrl = 'fuchsia-pkg://${server.name}';
+ final RunResult result = await device.shell('pkgctl repo remove --repo-url $repoUrl');
+ return result.exitCode == 0;
+ }
}
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
index 2cb003e..df1840e 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
@@ -265,7 +265,9 @@
}
// Start up a package server.
- fuchsiaPackageServer = FuchsiaPackageServer(packageRepo.path, host, port);
+ const String packageServerName = 'flutter_tool';
+ fuchsiaPackageServer = FuchsiaPackageServer(
+ packageRepo.path, packageServerName, host, port);
if (!await fuchsiaPackageServer.start()) {
printError('Failed to start the Fuchsia package server');
return LaunchResult.failed();
@@ -277,16 +279,17 @@
return LaunchResult.failed();
}
- // Teach amber about the package server.
- if (!await fuchsiaDeviceTools.amberCtl.addSrc(this, fuchsiaPackageServer)) {
+ // Teach the package controller about the package server.
+ if (!await fuchsiaDeviceTools.amberCtl.addRepoCfg(this, fuchsiaPackageServer)) {
printError('Failed to teach amber about the package server');
return LaunchResult.failed();
}
serverRegistered = true;
- // Tell amber to prefetch the app.
- if (!await fuchsiaDeviceTools.amberCtl.getUp(this, appName)) {
- printError('Failed to get amber to prefetch the package');
+ // Tell the package controller to prefetch the app.
+ if (!await fuchsiaDeviceTools.amberCtl.pkgCtlResolve(
+ this, fuchsiaPackageServer, appName)) {
+ printError('Failed to get pkgctl to prefetch the package');
return LaunchResult.failed();
}
@@ -298,15 +301,16 @@
// Instruct tiles_ctl to start the app.
final String fuchsiaUrl =
- 'fuchsia-pkg://fuchsia.com/$appName#meta/$appName.cmx';
+ 'fuchsia-pkg://$packageServerName/$appName#meta/$appName.cmx';
if (!await fuchsiaDeviceTools.tilesCtl.add(this, fuchsiaUrl, <String>[])) {
printError('Failed to add the app to tiles');
return LaunchResult.failed();
}
} finally {
- // Try to un-teach amber about the package server if needed.
+ // Try to un-teach the package controller about the package server if
+ // needed.
if (serverRegistered) {
- await fuchsiaDeviceTools.amberCtl.rmSrc(this, fuchsiaPackageServer);
+ await fuchsiaDeviceTools.amberCtl.pkgCtlRepoRemove(this, fuchsiaPackageServer);
}
// Shutdown the package server and delete the package repo;
fuchsiaPackageServer?.stop();
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart
index ab38a62..55907ff 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart
@@ -166,6 +166,7 @@
/// Example usage:
/// var server = FuchsiaPackageServer(
/// '/path/to/repo',
+/// 'server_name',
/// await FuchsiaDevFinder.resolve(deviceName),
/// await freshPort());
/// try {
@@ -176,7 +177,7 @@
/// server.stop();
/// }
class FuchsiaPackageServer {
- FuchsiaPackageServer(this._repo, this._host, this._port);
+ FuchsiaPackageServer(this._repo, this.name, this._host, this._port);
final String _repo;
final String _host;
@@ -187,6 +188,9 @@
/// The url that can be used by the device to access this package server.
String get url => 'http://$_host:$_port';
+ // The name used to reference the server by fuchsia-pkg:// urls.
+ final String name;
+
/// Usees [FuchiaPM.newrepo] and [FuchsiaPM.serve] to spin up a new Fuchsia
/// package server.
///
diff --git a/packages/flutter_tools/test/fuchsia/fuchsia_device_test.dart b/packages/flutter_tools/test/fuchsia/fuchsia_device_test.dart
index eb5c597..d7802f5 100644
--- a/packages/flutter_tools/test/fuchsia/fuchsia_device_test.dart
+++ b/packages/flutter_tools/test/fuchsia/fuchsia_device_test.dart
@@ -695,6 +695,22 @@
Future<bool> getUp(FuchsiaDevice device, String packageName) async {
return true;
}
+
+ @override
+ Future<bool> addRepoCfg(FuchsiaDevice device, FuchsiaPackageServer server) async {
+ return true;
+ }
+
+ @override
+ Future<bool> pkgCtlResolve(FuchsiaDevice device, FuchsiaPackageServer server,
+ String packageName) async {
+ return true;
+ }
+
+ @override
+ Future<bool> pkgCtlRepoRemove(FuchsiaDevice device, FuchsiaPackageServer server) async {
+ return true;
+ }
}
class FailingAmberCtl implements FuchsiaAmberCtl {
@@ -712,6 +728,22 @@
Future<bool> getUp(FuchsiaDevice device, String packageName) async {
return false;
}
+
+ @override
+ Future<bool> addRepoCfg(FuchsiaDevice device, FuchsiaPackageServer server) async {
+ return false;
+ }
+
+ @override
+ Future<bool> pkgCtlResolve(FuchsiaDevice device, FuchsiaPackageServer server,
+ String packageName) async {
+ return false;
+ }
+
+ @override
+ Future<bool> pkgCtlRepoRemove(FuchsiaDevice device, FuchsiaPackageServer server) async {
+ return false;
+ }
}
class FakeFuchsiaTilesCtl implements FuchsiaTilesCtl {