Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
540c7476
Unverified
Commit
540c7476
authored
Jul 16, 2019
by
Christopher Fujino
Committed by
GitHub
Jul 16, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Revert "Keep LLDB connection to iOS device alive while running from CLI. (#36194)" (#36293)
This reverts commit
5501a1c1
.
parent
e17f8d36
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
14 additions
and
85 deletions
+14
-85
process.dart
packages/flutter_tools/lib/src/base/process.dart
+12
-37
devices.dart
packages/flutter_tools/lib/src/ios/devices.dart
+1
-4
process_test.dart
...s/flutter_tools/test/general.shard/base/process_test.dart
+1
-41
pub_get_test.dart
...s/flutter_tools/test/general.shard/dart/pub_get_test.dart
+0
-3
No files found.
packages/flutter_tools/lib/src/base/process.dart
View file @
540c7476
...
...
@@ -129,11 +129,6 @@ Future<Process> runCommand(
/// If [filter] is non-null, all lines that do not match it are removed. If
/// [mapFunction] is present, all lines that match [filter] are also forwarded
/// to [mapFunction] for further processing.
///
/// If [detachFilter] is non-null, the returned future will complete with exit code `0`
/// when the process outputs something matching [detachFilter] to stderr. The process will
/// continue in the background, and the final exit code will not be reported. [filter] is
/// not considered on lines matching [detachFilter].
Future
<
int
>
runCommandAndStreamOutput
(
List
<
String
>
cmd
,
{
String
workingDirectory
,
...
...
@@ -143,9 +138,7 @@ Future<int> runCommandAndStreamOutput(
RegExp
filter
,
StringConverter
mapFunction
,
Map
<
String
,
String
>
environment
,
RegExp
detachFilter
,
})
async
{
final
Completer
<
int
>
result
=
Completer
<
int
>();
final
Process
process
=
await
runCommand
(
cmd
,
workingDirectory:
workingDirectory
,
...
...
@@ -155,15 +148,6 @@ Future<int> runCommandAndStreamOutput(
final
StreamSubscription
<
String
>
stdoutSubscription
=
process
.
stdout
.
transform
<
String
>(
utf8
.
decoder
)
.
transform
<
String
>(
const
LineSplitter
())
.
map
((
String
line
)
{
if
(
detachFilter
!=
null
&&
detachFilter
.
hasMatch
(
line
)
&&
!
result
.
isCompleted
)
{
// Detach from the process, assuming it will eventually complete successfully.
// Output printed after detaching (incl. stdout and stderr) will still be
// processed by [filter] and [mapFunction].
result
.
complete
(
0
);
}
return
line
;
})
.
where
((
String
line
)
=>
filter
==
null
||
filter
.
hasMatch
(
line
))
.
listen
((
String
line
)
{
if
(
mapFunction
!=
null
)
...
...
@@ -187,10 +171,8 @@ Future<int> runCommandAndStreamOutput(
printError
(
'
$prefix$line
'
,
wrap:
false
);
});
// Wait for stdout to be fully processed before completing with the exit code (non-detached case),
// because process.exitCode may complete first causing flaky tests. If the process detached,
// we at least have a predictable output for stdout, although (unavoidably) not for stderr.
Future
<
void
>
readOutput
()
async
{
// Wait for stdout to be fully processed
// because process.exitCode may complete first causing flaky tests.
await
waitGroup
<
void
>(<
Future
<
void
>>[
stdoutSubscription
.
asFuture
<
void
>(),
stderrSubscription
.
asFuture
<
void
>(),
...
...
@@ -201,14 +183,7 @@ Future<int> runCommandAndStreamOutput(
stderrSubscription
.
cancel
(),
]);
// Complete the future if the we did not detach the process yet.
if
(!
result
.
isCompleted
)
{
result
.
complete
(
process
.
exitCode
);
}
}
unawaited
(
readOutput
());
return
result
.
future
;
return
await
process
.
exitCode
;
}
/// Runs the [command] interactively, connecting the stdin/stdout/stderr
...
...
packages/flutter_tools/lib/src/ios/devices.dart
View file @
540c7476
...
...
@@ -48,7 +48,7 @@ class IOSDeploy {
'--bundle'
,
bundlePath
,
'--no-wifi'
,
'--
noninteractive
'
,
'--
justlaunch
'
,
];
if
(
launchArguments
.
isNotEmpty
)
{
launchCommand
.
add
(
'--args'
);
...
...
@@ -66,14 +66,11 @@ class IOSDeploy {
iosDeployEnv
[
'PATH'
]
=
'/usr/bin:
${iosDeployEnv['PATH']}
'
;
iosDeployEnv
.
addEntries
(<
MapEntry
<
String
,
String
>>[
cache
.
dyLdLibEntry
]);
// Detach from the ios-deploy process once it' outputs 'autoexit', signaling that the
// App has been started and LLDB is in "autopilot" mode.
return
await
runCommandAndStreamOutput
(
launchCommand
,
mapFunction:
_monitorInstallationFailure
,
trace:
true
,
environment:
iosDeployEnv
,
detachFilter:
RegExp
(
'.*autoexit.*'
)
);
}
...
...
packages/flutter_tools/test/general.shard/base/process_test.dart
View file @
540c7476
...
...
@@ -2,20 +2,17 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import
'dart:async'
;
import
'package:flutter_tools/src/base/io.dart'
;
import
'package:flutter_tools/src/base/logger.dart'
;
import
'package:flutter_tools/src/base/platform.dart'
;
import
'package:flutter_tools/src/base/process.dart'
;
import
'package:flutter_tools/src/base/terminal.dart'
;
import
'package:flutter_tools/src/convert.dart'
;
import
'package:mockito/mockito.dart'
;
import
'package:process/process.dart'
;
import
'../../src/common.dart'
;
import
'../../src/context.dart'
;
import
'../../src/mocks.dart'
show
FakeProcess
,
MockProcess
,
MockProcessManager
;
import
'../../src/mocks.dart'
show
MockProcess
,
MockProcessManager
;
void
main
(
)
{
group
(
'process exceptions'
,
()
{
...
...
@@ -93,43 +90,6 @@ void main() {
Platform:
()
=>
FakePlatform
.
fromPlatform
(
const
LocalPlatform
())..
stdoutSupportsAnsi
=
false
,
});
});
group
(
'runCommandAndStreamOutput'
,
()
{
ProcessManager
mockProcessManager
;
const
Utf8Encoder
utf8
=
Utf8Encoder
();
setUp
(()
{
mockProcessManager
=
PlainMockProcessManager
();
});
testUsingContext
(
'detach after detachFilter matches'
,
()
async
{
// Create a fake process which outputs three lines ("foo", "bar" and "baz")
// to stdout, nothing to stderr, and doesn't exit.
final
Process
fake
=
FakeProcess
(
exitCode:
Completer
<
int
>().
future
,
stdout:
Stream
<
List
<
int
>>.
fromIterable
(
<
String
>[
'foo
\n
'
,
'bar
\n
'
,
'baz
\n
'
].
map
(
utf8
.
convert
)),
stderr:
const
Stream
<
List
<
int
>>.
empty
());
when
(
mockProcessManager
.
start
(<
String
>[
'test1'
])).
thenAnswer
((
_
)
=>
Future
<
Process
>.
value
(
fake
));
// Detach when we see "bar", and check that:
// - mapFunction still gets run on "baz",
// - we don't wait for the process to terminate (it never will), and
// - we get an exit-code of 0 back.
bool
seenBaz
=
false
;
String
mapFunction
(
String
line
)
{
seenBaz
=
seenBaz
||
line
==
'baz'
;
return
line
;
}
final
int
exitCode
=
await
runCommandAndStreamOutput
(
<
String
>[
'test1'
],
mapFunction:
mapFunction
,
detachFilter:
RegExp
(
'.*baz.*'
));
expect
(
exitCode
,
0
);
expect
(
seenBaz
,
true
);
},
overrides:
<
Type
,
Generator
>{
ProcessManager:
()
=>
mockProcessManager
});
});
}
class
PlainMockProcessManager
extends
Mock
implements
ProcessManager
{}
packages/flutter_tools/test/general.shard/dart/pub_get_test.dart
View file @
540c7476
...
...
@@ -199,9 +199,6 @@ class MockStream<T> implements Stream<T> {
@override
Stream
<
T
>
where
(
bool
test
(
T
event
))
=>
MockStream
<
T
>();
@override
Stream
<
S
>
map
<
S
>(
S
Function
(
T
)
_
)
=>
MockStream
<
S
>();
@override
StreamSubscription
<
T
>
listen
(
void
onData
(
T
event
),
{
Function
onError
,
void
onDone
(),
bool
cancelOnError
})
{
return
MockStreamSubscription
<
T
>();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment