| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright (c) 2009 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 """Client-side script to send a try job to the try server. It communicates to | 5 """Client-side script to send a try job to the try server. It communicates to |
| 6 the try server by either writting to a svn repository or by directly connecting | 6 the try server by either writting to a svn repository or by directly connecting |
| 7 to the server by HTTP. | 7 to the server by HTTP. |
| 8 """ | 8 """ |
| 9 | 9 |
| 10 import datetime | 10 import datetime |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 | 328 |
| 329 values = _ParseSendChangeOptions(options) | 329 values = _ParseSendChangeOptions(options) |
| 330 description = ''.join("%s=%s\n" % (k,v) for (k,v) in values.iteritems()) | 330 description = ''.join("%s=%s\n" % (k,v) for (k,v) in values.iteritems()) |
| 331 logging.info('Sending by SVN') | 331 logging.info('Sending by SVN') |
| 332 logging.info(description) | 332 logging.info(description) |
| 333 logging.info(options.svn_repo) | 333 logging.info(options.svn_repo) |
| 334 logging.info(options.diff) | 334 logging.info(options.diff) |
| 335 if options.dry_run: | 335 if options.dry_run: |
| 336 return | 336 return |
| 337 | 337 |
| 338 # Do an empty checkout. | 338 # Create a temporary directory, put a uniquely named file in it with the diff |
| 339 # content and svn import that. |
| 339 temp_dir = tempfile.mkdtemp() | 340 temp_dir = tempfile.mkdtemp() |
| 340 temp_file = tempfile.NamedTemporaryFile() | 341 temp_file = tempfile.NamedTemporaryFile() |
| 341 try: | 342 try: |
| 342 try: | 343 try: |
| 343 command = ['svn', 'checkout', '--depth', 'empty', '-q', | 344 # Description |
| 344 options.svn_repo, temp_dir] | 345 temp_file.write(description) |
| 345 gclient_utils.CheckCall(command) | 346 temp_file.flush() |
| 346 | 347 |
| 347 # TODO(maruel): Use a subdirectory per user? | 348 # Diff file |
| 348 current_time = str(datetime.datetime.now()).replace(':', '.') | 349 current_time = str(datetime.datetime.now()).replace(':', '.') |
| 349 file_name = (EscapeDot(options.user) + '.' + EscapeDot(options.name) + | 350 file_name = (EscapeDot(options.user) + '.' + EscapeDot(options.name) + |
| 350 '.%s.diff' % current_time) | 351 '.%s.diff' % current_time) |
| 351 full_path = os.path.join(temp_dir, file_name) | 352 full_path = os.path.join(temp_dir, file_name) |
| 352 full_url = options.svn_repo + '/' + file_name | 353 gclient_utils.FileWrite(full_path, options.diff, 'wb') |
| 353 file_found = False | 354 |
| 354 try: | 355 # Committing it will trigger a try job. |
| 355 gclient_utils.CheckCall(['svn', 'ls', full_url], print_error=False) | 356 command = ['svn', 'import', '-q', temp_dir, options.svn_repo, '--file', |
| 356 file_found = True | 357 temp_file.name] |
| 357 except gclient_utils.CheckCallError: | 358 gclient_utils.CheckCall(command) |
| 358 pass | |
| 359 if file_found: | |
| 360 # The file already exists in the repo. Note that commiting a file is a | |
| 361 # no-op if the file's content (the diff) is not modified. This is why | |
| 362 # the file name contains the date and time. | |
| 363 gclient_utils.CheckCall(['svn', 'update', full_path], | |
| 364 print_error=False) | |
| 365 gclient_utils.FileWrite(full_path, options.diff, 'wb') | |
| 366 else: | |
| 367 # Add the file to the repo. | |
| 368 gclient_utils.FileWrite(full_path, options.diff, 'wb') | |
| 369 gclient_utils.CheckCall(["svn", "add", full_path], print_error=False) | |
| 370 temp_file.write(description) | |
| 371 temp_file.flush() | |
| 372 gclient_utils.CheckCall(["svn", "commit", full_path, '--file', | |
| 373 temp_file.name], print_error=False) | |
| 374 except gclient_utils.CheckCallError, e: | 359 except gclient_utils.CheckCallError, e: |
| 375 out = e.stdout | 360 out = e.stdout |
| 376 if e.stderr: | 361 if e.stderr: |
| 377 out += e.stderr | 362 out += e.stderr |
| 378 raise NoTryServerAccess(' '.join(e.command) + '\nOuput:\n' + out) | 363 raise NoTryServerAccess(' '.join(e.command) + '\nOuput:\n' + out) |
| 379 finally: | 364 finally: |
| 380 temp_file.close() | 365 temp_file.close() |
| 381 shutil.rmtree(temp_dir, True) | 366 shutil.rmtree(temp_dir, True) |
| 382 | 367 |
| 383 | 368 |
| (...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 except (InvalidScript, NoTryServerAccess), e: | 687 except (InvalidScript, NoTryServerAccess), e: |
| 703 if swallow_exception: | 688 if swallow_exception: |
| 704 return 1 | 689 return 1 |
| 705 print e | 690 print e |
| 706 return 1 | 691 return 1 |
| 707 return 0 | 692 return 0 |
| 708 | 693 |
| 709 | 694 |
| 710 if __name__ == "__main__": | 695 if __name__ == "__main__": |
| 711 sys.exit(TryChange(None, [], False)) | 696 sys.exit(TryChange(None, [], False)) |
| OLD | NEW |