Index: scm.py |
diff --git a/scm.py b/scm.py |
index 99dccf97496c8334cf8f8ad5a588721093e7572c..58f26c6a9855f4b85ea8132d7f535d1bb7a6a2a7 100644 |
--- a/scm.py |
+++ b/scm.py |
@@ -165,19 +165,34 @@ class SVN(object): |
'status': status_pattern, |
'update': update_pattern, |
}[args[0]] |
- |
compiled_pattern = re.compile(pattern) |
- |
- def CaptureMatchingLines(line): |
- match = compiled_pattern.search(line) |
- if match: |
- file_list.append(match.group(1)) |
- |
- SVN.RunAndFilterOutput(args, |
- in_directory, |
- options.verbose, |
- True, |
- CaptureMatchingLines) |
+ # Place an upper limit. |
+ for i in range(1, 10): |
+ previous_list_len = len(file_list) |
+ failure = [] |
+ def CaptureMatchingLines(line): |
+ match = compiled_pattern.search(line) |
+ if match: |
+ file_list.append(match.group(1)) |
+ if line.startswith('svn: '): |
+ # We can't raise an exception. We can't alias a variable. Use a cheap |
+ # way. |
+ failure.append(True) |
+ try: |
+ SVN.RunAndFilterOutput(args, |
+ in_directory, |
+ options.verbose, |
+ True, |
+ CaptureMatchingLines) |
+ except gclient_utils.Error: |
+ # We enforce that some progress has been made. |
+ if len(failure) and len(file_list) > previous_list_len: |
+ if args[0] == 'checkout': |
+ args = args[:] |
+ # An aborted checkout is now an update. |
+ args[0] = 'update' |
+ continue |
+ break |
@staticmethod |
def RunAndFilterOutput(args, |