OLD | NEW |
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Generic utils.""" | 5 """Generic utils.""" |
6 | 6 |
7 import codecs | 7 import codecs |
8 import cStringIO | 8 import cStringIO |
9 import datetime | 9 import datetime |
10 import logging | 10 import logging |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 else: | 172 else: |
173 rmtree(path) | 173 rmtree(path) |
174 | 174 |
175 | 175 |
176 def rmtree(path): | 176 def rmtree(path): |
177 """shutil.rmtree() on steroids. | 177 """shutil.rmtree() on steroids. |
178 | 178 |
179 Recursively removes a directory, even if it's marked read-only. | 179 Recursively removes a directory, even if it's marked read-only. |
180 | 180 |
181 shutil.rmtree() doesn't work on Windows if any of the files or directories | 181 shutil.rmtree() doesn't work on Windows if any of the files or directories |
182 are read-only, which svn repositories and some .svn files are. We need to | 182 are read-only. We need to be able to force the files to be writable (i.e., |
183 be able to force the files to be writable (i.e., deletable) as we traverse | 183 deletable) as we traverse the tree. |
184 the tree. | |
185 | 184 |
186 Even with all this, Windows still sometimes fails to delete a file, citing | 185 Even with all this, Windows still sometimes fails to delete a file, citing |
187 a permission error (maybe something to do with antivirus scans or disk | 186 a permission error (maybe something to do with antivirus scans or disk |
188 indexing). The best suggestion any of the user forums had was to wait a | 187 indexing). The best suggestion any of the user forums had was to wait a |
189 bit and try again, so we do that too. It's hand-waving, but sometimes it | 188 bit and try again, so we do that too. It's hand-waving, but sometimes it |
190 works. :/ | 189 works. :/ |
191 | 190 |
192 On POSIX systems, things are a little bit simpler. The modes of the files | 191 On POSIX systems, things are a little bit simpler. The modes of the files |
193 to be deleted doesn't matter, only the modes of the directories containing | 192 to be deleted doesn't matter, only the modes of the directories containing |
194 them are significant. As the directory tree is traversed, each directory | 193 them are significant. As the directory tree is traversed, each directory |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 args, bufsize=0, stdout=subprocess2.PIPE, stderr=subprocess2.STDOUT, | 486 args, bufsize=0, stdout=subprocess2.PIPE, stderr=subprocess2.STDOUT, |
488 **kwargs) | 487 **kwargs) |
489 | 488 |
490 GClientChildren.add(kid) | 489 GClientChildren.add(kid) |
491 | 490 |
492 # Do a flush of stdout before we begin reading from the subprocess2's stdout | 491 # Do a flush of stdout before we begin reading from the subprocess2's stdout |
493 stdout.flush() | 492 stdout.flush() |
494 | 493 |
495 # Also, we need to forward stdout to prevent weird re-ordering of output. | 494 # Also, we need to forward stdout to prevent weird re-ordering of output. |
496 # This has to be done on a per byte basis to make sure it is not buffered: | 495 # This has to be done on a per byte basis to make sure it is not buffered: |
497 # normally buffering is done for each line, but if svn requests input, no | 496 # normally buffering is done for each line, but if the process requests |
498 # end-of-line character is output after the prompt and it would not show up. | 497 # input, no end-of-line character is output after the prompt and it would |
| 498 # not show up. |
499 try: | 499 try: |
500 in_byte = kid.stdout.read(1) | 500 in_byte = kid.stdout.read(1) |
501 if in_byte: | 501 if in_byte: |
502 if call_filter_on_first_line: | 502 if call_filter_on_first_line: |
503 filter_fn(None) | 503 filter_fn(None) |
504 in_line = '' | 504 in_line = '' |
505 while in_byte: | 505 while in_byte: |
506 output.write(in_byte) | 506 output.write(in_byte) |
507 if print_stdout: | 507 if print_stdout: |
508 stdout.write(in_byte) | 508 stdout.write(in_byte) |
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1053 try: | 1053 try: |
1054 work_queue.ready_cond.notifyAll() | 1054 work_queue.ready_cond.notifyAll() |
1055 finally: | 1055 finally: |
1056 work_queue.ready_cond.release() | 1056 work_queue.ready_cond.release() |
1057 | 1057 |
1058 | 1058 |
1059 def GetEditor(git_editor=None): | 1059 def GetEditor(git_editor=None): |
1060 """Returns the most plausible editor to use. | 1060 """Returns the most plausible editor to use. |
1061 | 1061 |
1062 In order of preference: | 1062 In order of preference: |
1063 - GIT_EDITOR/SVN_EDITOR environment variable | 1063 - GIT_EDITOR environment variable |
1064 - core.editor git configuration variable (if supplied by git-cl) | 1064 - core.editor git configuration variable (if supplied by git-cl) |
1065 - VISUAL environment variable | 1065 - VISUAL environment variable |
1066 - EDITOR environment variable | 1066 - EDITOR environment variable |
1067 - vi (non-Windows) or notepad (Windows) | 1067 - vi (non-Windows) or notepad (Windows) |
1068 | 1068 |
1069 In the case of git-cl, this matches git's behaviour, except that it does not | 1069 In the case of git-cl, this matches git's behaviour, except that it does not |
1070 include dumb terminal detection. | 1070 include dumb terminal detection. |
1071 """ | 1071 """ |
1072 editor = os.environ.get('GIT_EDITOR') or git_editor | 1072 editor = os.environ.get('GIT_EDITOR') or git_editor |
1073 if not editor: | 1073 if not editor: |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1219 # Just incase we have some ~/blah paths. | 1219 # Just incase we have some ~/blah paths. |
1220 target = os.path.abspath(os.path.expanduser(target)) | 1220 target = os.path.abspath(os.path.expanduser(target)) |
1221 if os.path.isfile(target) and os.access(target, os.X_OK): | 1221 if os.path.isfile(target) and os.access(target, os.X_OK): |
1222 return target | 1222 return target |
1223 if sys.platform.startswith('win'): | 1223 if sys.platform.startswith('win'): |
1224 for suffix in ('.bat', '.cmd', '.exe'): | 1224 for suffix in ('.bat', '.cmd', '.exe'): |
1225 alt_target = target + suffix | 1225 alt_target = target + suffix |
1226 if os.path.isfile(alt_target) and os.access(alt_target, os.X_OK): | 1226 if os.path.isfile(alt_target) and os.access(alt_target, os.X_OK): |
1227 return alt_target | 1227 return alt_target |
1228 return None | 1228 return None |
OLD | NEW |