Give clear messages on how to connect to physical devices

Summary:
Give clearer instructions when connection to (physical) device fails, rather than just logging errors.

Fixes https://github.com/facebook/flipper/issues/1942

Also removed throwing errors for known problems, as they can be remediated by users.

Reviewed By: passy

Differential Revision: D27360575

fbshipit-source-id: 311d27178d4d205dff725201c7c60f116f0eb319
This commit is contained in:
Michel Weststrate
2021-03-29 06:59:15 -07:00
committed by Facebook GitHub Bot
parent d5fbe9a5b9
commit 1b0d01ef38

View File

@@ -7,6 +7,7 @@
* @format * @format
*/ */
import React from 'react';
import {Mutex} from 'async-mutex'; import {Mutex} from 'async-mutex';
import {exec as unsafeExec, Output} from 'promisify-child-process'; import {exec as unsafeExec, Output} from 'promisify-child-process';
import {killOrphanedInstrumentsProcesses} from './processCleanup'; import {killOrphanedInstrumentsProcesses} from './processCleanup';
@@ -18,6 +19,8 @@ import {promisify} from 'util';
import child_process from 'child_process'; import child_process from 'child_process';
import fs from 'fs-extra'; import fs from 'fs-extra';
import path from 'path'; import path from 'path';
import fbConfig from '../fb-stubs/config';
import {notification, Typography} from 'antd';
const exec = promisify(child_process.exec); const exec = promisify(child_process.exec);
// Use debug to get helpful logs when idb fails // Use debug to get helpful logs when idb fails
@@ -220,7 +223,8 @@ async function pull(
.then(() => { .then(() => {
return; return;
}) })
.catch((e) => handleMissingIdb(e, idbPath)), .catch((e) => handleMissingIdb(e, idbPath))
.catch((e) => handleMissingPermissions(e)),
`${operationPrefix}:pull`, `${operationPrefix}:pull`,
), ),
); );
@@ -242,16 +246,52 @@ function handleMissingIdb(e: Error, idbPath: string): void {
e.message && e.message &&
e.message.includes('sudo: no tty present and no askpass program specified') e.message.includes('sudo: no tty present and no askpass program specified')
) { ) {
throw new Error( console.warn(e);
`idb doesn't appear to be installed. Run "${idbPath} list-targets" to fix this.`, const message = `idb doesn't appear to be installed. Run "${idbPath} list-targets" to fix this.`;
notification.error({
message: 'Cannot connect to idb',
duration: null,
description: message,
key: 'idb_connection_failed',
});
return;
}
throw e;
}
function handleMissingPermissions(e: Error): void {
if (
e.message &&
e.message.includes('Command failed') &&
e.message.includes('file pull') &&
e.message.includes('sonar/app.csr')
) {
console.warn(e);
const message = fbConfig.isFBBuild ? (
<>
Idb lacks permissions to exchange certificates. Did you install a source
build or a debug build with certificate exchange enabled?{' '}
<Typography.Link href="https://www.internalfb.com/intern/staticdocs/flipper/docs/getting-started/fb/connecting-to-flipper#app-on-physical-ios-device">
How To
</Typography.Link>
</>
) : (
'Idb lacks permissions to exchange certificates. Did you install a source build?'
); );
notification.error({
message: 'Cannot connect to iOS application',
duration: null,
description: message,
key: 'idb_certificate_pull_failed',
});
return;
} }
throw e; throw e;
} }
function wrapWithErrorMessage<T>(p: Promise<T>): Promise<T> { function wrapWithErrorMessage<T>(p: Promise<T>): Promise<T> {
return p.catch((e: Error) => { return p.catch((e: Error) => {
console.error(e); console.warn(e);
// Give the user instructions. Don't embed the error because it's unique per invocation so won't be deduped. // Give the user instructions. Don't embed the error because it's unique per invocation so won't be deduped.
throw new Error( throw new Error(
"A problem with idb has ocurred. Please run `sudo rm -rf /tmp/idb*` and `sudo yum install -y fb-idb` to update it, if that doesn't fix it, post in Flipper Support.", "A problem with idb has ocurred. Please run `sudo rm -rf /tmp/idb*` and `sudo yum install -y fb-idb` to update it, if that doesn't fix it, post in Flipper Support.",