Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: runtime/bin/process_patch.dart

Issue 17447015: Always escape " in Process on Windows. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 patch class _WindowsCodePageDecoder { 5 patch class _WindowsCodePageDecoder {
6 /* patch */ static String _decodeBytes(List<int> bytes) 6 /* patch */ static String _decodeBytes(List<int> bytes)
7 native "SystemEncodingToString"; 7 native "SystemEncodingToString";
8 } 8 }
9 9
10 10
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 } 85 }
86 int len = arguments.length; 86 int len = arguments.length;
87 _arguments = new List<String>(len); 87 _arguments = new List<String>(len);
88 for (int i = 0; i < len; i++) { 88 for (int i = 0; i < len; i++) {
89 var arg = arguments[i]; 89 var arg = arguments[i];
90 if (arg is !String) { 90 if (arg is !String) {
91 throw new ArgumentError("Non-string argument: $arg"); 91 throw new ArgumentError("Non-string argument: $arg");
92 } 92 }
93 _arguments[i] = arguments[i]; 93 _arguments[i] = arguments[i];
94 if (Platform.operatingSystem == 'windows') { 94 if (Platform.operatingSystem == 'windows') {
95 _arguments[i] = _windowsArgumentEscape(_arguments[i], 95 _arguments[i] = _windowsArgumentEscape(_arguments[i]);
96 shellEscape: runInShell);
97 } 96 }
98 } 97 }
99 98
100 if (_workingDirectory != null && _workingDirectory is !String) { 99 if (_workingDirectory != null && _workingDirectory is !String) {
101 throw new ArgumentError( 100 throw new ArgumentError(
102 "WorkingDirectory is not a String: $_workingDirectory"); 101 "WorkingDirectory is not a String: $_workingDirectory");
103 } 102 }
104 103
105 if (environment != null) { 104 if (environment != null) {
106 var env = environment; 105 var env = environment;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 shellArguments.add("-c"); 150 shellArguments.add("-c");
152 for (var arg in arguments) { 151 for (var arg in arguments) {
153 arg = arg.replaceAll("'", "'\"'\"'"); 152 arg = arg.replaceAll("'", "'\"'\"'");
154 commandLine.write(" '$arg'"); 153 commandLine.write(" '$arg'");
155 } 154 }
156 shellArguments.add(commandLine.toString()); 155 shellArguments.add(commandLine.toString());
157 } 156 }
158 return shellArguments; 157 return shellArguments;
159 } 158 }
160 159
161 String _windowsArgumentEscape(String argument, { bool shellEscape: false }) { 160 String _windowsArgumentEscape(String argument) {
162 var result = argument; 161 var result = argument;
163 if (argument.contains('\t') || 162 if (argument.contains('\t') ||
164 argument.contains(' ') || 163 argument.contains(' ') ||
165 // TODO(ajohnsen): Remove shellEscape. 164 argument.contains('"')) {
166 (shellEscape && argument.contains('"'))) {
167 // Produce something that the C runtime on Windows will parse 165 // Produce something that the C runtime on Windows will parse
168 // back as this string. 166 // back as this string.
169 167
170 // Replace any number of '\' followed by '"' with 168 // Replace any number of '\' followed by '"' with
171 // twice as many '\' followed by '\"'. 169 // twice as many '\' followed by '\"'.
172 var backslash = '\\'.codeUnitAt(0); 170 var backslash = '\\'.codeUnitAt(0);
173 var sb = new StringBuffer(); 171 var sb = new StringBuffer();
174 var nextPos = 0; 172 var nextPos = 0;
175 var quotePos = argument.indexOf('"', nextPos); 173 var quotePos = argument.indexOf('"', nextPos);
176 while (quotePos != -1) { 174 while (quotePos != -1) {
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 const _ProcessResult(int this.pid, 383 const _ProcessResult(int this.pid,
386 int this.exitCode, 384 int this.exitCode,
387 this.stdout, 385 this.stdout,
388 this.stderr); 386 this.stderr);
389 387
390 final int pid; 388 final int pid;
391 final int exitCode; 389 final int exitCode;
392 final stdout; 390 final stdout;
393 final stderr; 391 final stderr;
394 } 392 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698