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

Side by Side Diff: gclient_scm.py

Issue 251095: Revert "Modify the output of gclient update, gclient status to only print out" (Closed)
Patch Set: Created 11 years, 2 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
« no previous file with comments | « gclient.py ('k') | gclient_utils.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright 2009 Google Inc. All Rights Reserved. 1 # Copyright 2009 Google Inc. All Rights Reserved.
2 # 2 #
3 # Licensed under the Apache License, Version 2.0 (the "License"); 3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License. 4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at 5 # You may obtain a copy of the License at
6 # 6 #
7 # http://www.apache.org/licenses/LICENSE-2.0 7 # http://www.apache.org/licenses/LICENSE-2.0
8 # 8 #
9 # Unless required by applicable law or agreed to in writing, software 9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS, 10 # distributed under the License is distributed on an "AS IS" BASIS,
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 243
244 rev_str = "" 244 rev_str = ""
245 if revision: 245 if revision:
246 rev_str = ' at %s' % revision 246 rev_str = ' at %s' % revision
247 247
248 if not os.path.exists(checkout_path): 248 if not os.path.exists(checkout_path):
249 # We need to checkout. 249 # We need to checkout.
250 command = ['checkout', url, checkout_path] 250 command = ['checkout', url, checkout_path]
251 if revision: 251 if revision:
252 command.extend(['--revision', str(revision)]) 252 command.extend(['--revision', str(revision)])
253 RunSVNAndGetFileList(options, command, self._root_dir, file_list) 253 RunSVNAndGetFileList(command, self._root_dir, file_list)
254 return 254 return
255 255
256 # Get the existing scm url and the revision number of the current checkout. 256 # Get the existing scm url and the revision number of the current checkout.
257 from_info = CaptureSVNInfo(os.path.join(checkout_path, '.'), '.') 257 from_info = CaptureSVNInfo(os.path.join(checkout_path, '.'), '.')
258 if not from_info: 258 if not from_info:
259 raise gclient_utils.Error("Can't update/checkout %r if an unversioned " 259 raise gclient_utils.Error("Can't update/checkout %r if an unversioned "
260 "directory is present. Delete the directory " 260 "directory is present. Delete the directory "
261 "and try again." % 261 "and try again." %
262 checkout_path) 262 checkout_path)
263 263
264 # Retrieve the current HEAD version because svn is slow at null updates. 264 if options.manually_grab_svn_rev:
265 if not revision: 265 # Retrieve the current HEAD version because svn is slow at null updates.
266 from_info_live = CaptureSVNInfo(from_info['URL'], '.') 266 if not revision:
267 revision = str(from_info_live['Revision']) 267 from_info_live = CaptureSVNInfo(from_info['URL'], '.')
268 rev_str = ' at %s' % revision 268 revision = str(from_info_live['Revision'])
269 forced_revision = True 269 rev_str = ' at %s' % revision
270 270
271 if from_info['URL'] != components[0]: 271 if from_info['URL'] != components[0]:
272 to_info = CaptureSVNInfo(url, '.') 272 to_info = CaptureSVNInfo(url, '.')
273 if not to_info.get('Repository Root') or not to_info.get('UUID'): 273 if not to_info.get('Repository Root') or not to_info.get('UUID'):
274 # The url is invalid or the server is not accessible, it's safer to bail 274 # The url is invalid or the server is not accessible, it's safer to bail
275 # out right now. 275 # out right now.
276 raise gclient_utils.Error('This url is unreachable: %s' % url) 276 raise gclient_utils.Error('This url is unreachable: %s' % url)
277 can_switch = ((from_info['Repository Root'] != to_info['Repository Root']) 277 can_switch = ((from_info['Repository Root'] != to_info['Repository Root'])
278 and (from_info['UUID'] == to_info['UUID'])) 278 and (from_info['UUID'] == to_info['UUID']))
279 if can_switch: 279 if can_switch:
(...skipping 21 matching lines...) Expand all
301 "don't match and there is local changes " 301 "don't match and there is local changes "
302 "in %s. Delete the directory and " 302 "in %s. Delete the directory and "
303 "try again." % (url, checkout_path)) 303 "try again." % (url, checkout_path))
304 # Ok delete it. 304 # Ok delete it.
305 print("\n_____ switching %s to a new checkout" % self.relpath) 305 print("\n_____ switching %s to a new checkout" % self.relpath)
306 gclient_utils.RemoveDirectory(checkout_path) 306 gclient_utils.RemoveDirectory(checkout_path)
307 # We need to checkout. 307 # We need to checkout.
308 command = ['checkout', url, checkout_path] 308 command = ['checkout', url, checkout_path]
309 if revision: 309 if revision:
310 command.extend(['--revision', str(revision)]) 310 command.extend(['--revision', str(revision)])
311 RunSVNAndGetFileList(options, command, self._root_dir, file_list) 311 RunSVNAndGetFileList(command, self._root_dir, file_list)
312 return 312 return
313 313
314 314
315 # If the provided url has a revision number that matches the revision 315 # If the provided url has a revision number that matches the revision
316 # number of the existing directory, then we don't need to bother updating. 316 # number of the existing directory, then we don't need to bother updating.
317 if not options.force and str(from_info['Revision']) == revision: 317 if not options.force and str(from_info['Revision']) == revision:
318 if options.verbose or not forced_revision: 318 if options.verbose or not forced_revision:
319 print("\n_____ %s%s" % (self.relpath, rev_str)) 319 print("\n_____ %s%s" % (self.relpath, rev_str))
320 return 320 return
321 321
322 command = ["update", checkout_path] 322 command = ["update", checkout_path]
323 if revision: 323 if revision:
324 command.extend(['--revision', str(revision)]) 324 command.extend(['--revision', str(revision)])
325 RunSVNAndGetFileList(options, command, self._root_dir, file_list) 325 RunSVNAndGetFileList(command, self._root_dir, file_list)
326 326
327 def revert(self, options, args, file_list): 327 def revert(self, options, args, file_list):
328 """Reverts local modifications. Subversion specific. 328 """Reverts local modifications. Subversion specific.
329 329
330 All reverted files will be appended to file_list, even if Subversion 330 All reverted files will be appended to file_list, even if Subversion
331 doesn't know about them. 331 doesn't know about them.
332 """ 332 """
333 path = os.path.join(self._root_dir, self.relpath) 333 path = os.path.join(self._root_dir, self.relpath)
334 if not os.path.isdir(path): 334 if not os.path.isdir(path):
335 # svn revert won't work if the directory doesn't exist. It needs to 335 # svn revert won't work if the directory doesn't exist. It needs to
(...skipping 29 matching lines...) Expand all
365 logging.info('gclient_utils.RemoveDirectory(%s)' % file_path) 365 logging.info('gclient_utils.RemoveDirectory(%s)' % file_path)
366 gclient_utils.RemoveDirectory(file_path) 366 gclient_utils.RemoveDirectory(file_path)
367 else: 367 else:
368 logging.error('no idea what is %s.\nYou just found a bug in gclient' 368 logging.error('no idea what is %s.\nYou just found a bug in gclient'
369 ', please ping maruel@chromium.org ASAP!' % file_path) 369 ', please ping maruel@chromium.org ASAP!' % file_path)
370 except EnvironmentError: 370 except EnvironmentError:
371 logging.error('Failed to remove %s.' % file_path) 371 logging.error('Failed to remove %s.' % file_path)
372 372
373 # svn revert is so broken we don't even use it. Using 373 # svn revert is so broken we don't even use it. Using
374 # "svn up --revision BASE" achieve the same effect. 374 # "svn up --revision BASE" achieve the same effect.
375 RunSVNAndGetFileList(options, ['update', '--revision', 'BASE'], path, 375 RunSVNAndGetFileList(['update', '--revision', 'BASE'], path, file_list)
376 file_list)
377 376
378 def runhooks(self, options, args, file_list): 377 def runhooks(self, options, args, file_list):
379 self.status(options, args, file_list) 378 self.status(options, args, file_list)
380 379
381 def status(self, options, args, file_list): 380 def status(self, options, args, file_list):
382 """Display status information.""" 381 """Display status information."""
383 path = os.path.join(self._root_dir, self.relpath) 382 path = os.path.join(self._root_dir, self.relpath)
384 command = ['status'] 383 command = ['status']
385 command.extend(args) 384 command.extend(args)
386 if not os.path.isdir(path): 385 if not os.path.isdir(path):
387 # svn status won't work if the directory doesn't exist. 386 # svn status won't work if the directory doesn't exist.
388 print("\n________ couldn't run \'%s\' in \'%s\':\nThe directory " 387 print("\n________ couldn't run \'%s\' in \'%s\':\nThe directory "
389 "does not exist." 388 "does not exist."
390 % (' '.join(command), path)) 389 % (' '.join(command), path))
391 # There's no file list to retrieve. 390 # There's no file list to retrieve.
392 else: 391 else:
393 RunSVNAndGetFileList(options, command, path, file_list) 392 RunSVNAndGetFileList(command, path, file_list)
394 393
395 def pack(self, options, args, file_list): 394 def pack(self, options, args, file_list):
396 """Generates a patch file which can be applied to the root of the 395 """Generates a patch file which can be applied to the root of the
397 repository.""" 396 repository."""
398 path = os.path.join(self._root_dir, self.relpath) 397 path = os.path.join(self._root_dir, self.relpath)
399 command = ['diff'] 398 command = ['diff']
400 command.extend(args) 399 command.extend(args)
401 # Simple class which tracks which file is being diffed and 400 # Simple class which tracks which file is being diffed and
402 # replaces instances of its file name in the original and 401 # replaces instances of its file name in the original and
403 # working copy lines of the svn diff output. 402 # working copy lines of the svn diff output.
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 stderr = None 476 stderr = None
478 if not print_error: 477 if not print_error:
479 stderr = subprocess.PIPE 478 stderr = subprocess.PIPE
480 return subprocess.Popen(c, 479 return subprocess.Popen(c,
481 cwd=in_directory, 480 cwd=in_directory,
482 shell=(sys.platform == 'win32'), 481 shell=(sys.platform == 'win32'),
483 stdout=subprocess.PIPE, 482 stdout=subprocess.PIPE,
484 stderr=stderr).communicate()[0] 483 stderr=stderr).communicate()[0]
485 484
486 485
487 def RunSVNAndGetFileList(options, args, in_directory, file_list): 486 def RunSVNAndGetFileList(args, in_directory, file_list):
488 """Runs svn checkout, update, or status, output to stdout. 487 """Runs svn checkout, update, or status, output to stdout.
489 488
490 The first item in args must be either "checkout", "update", or "status". 489 The first item in args must be either "checkout", "update", or "status".
491 490
492 svn's stdout is parsed to collect a list of files checked out or updated. 491 svn's stdout is parsed to collect a list of files checked out or updated.
493 These files are appended to file_list. svn's stdout is also printed to 492 These files are appended to file_list. svn's stdout is also printed to
494 sys.stdout as in RunSVN. 493 sys.stdout as in RunSVN.
495 494
496 Args: 495 Args:
497 options: command line options to gclient
498 args: A sequence of command line parameters to be passed to svn. 496 args: A sequence of command line parameters to be passed to svn.
499 in_directory: The directory where svn is to be run. 497 in_directory: The directory where svn is to be run.
500 498
501 Raises: 499 Raises:
502 Error: An error occurred while running the svn command. 500 Error: An error occurred while running the svn command.
503 """ 501 """
504 command = [SVN_COMMAND] 502 command = [SVN_COMMAND]
505 command.extend(args) 503 command.extend(args)
506 504
507 # svn update and svn checkout use the same pattern: the first three columns 505 # svn update and svn checkout use the same pattern: the first three columns
(...skipping 19 matching lines...) Expand all
527 525
528 compiled_pattern = re.compile(pattern) 526 compiled_pattern = re.compile(pattern)
529 527
530 def CaptureMatchingLines(line): 528 def CaptureMatchingLines(line):
531 match = compiled_pattern.search(line) 529 match = compiled_pattern.search(line)
532 if match: 530 if match:
533 file_list.append(match.group(1)) 531 file_list.append(match.group(1))
534 532
535 RunSVNAndFilterOutput(args, 533 RunSVNAndFilterOutput(args,
536 in_directory, 534 in_directory,
537 options.verbose, 535 True,
538 True, 536 True,
539 CaptureMatchingLines) 537 CaptureMatchingLines)
540 538
541 def RunSVNAndFilterOutput(args, 539 def RunSVNAndFilterOutput(args,
542 in_directory, 540 in_directory,
543 print_messages, 541 print_messages,
544 print_stdout, 542 print_stdout,
545 filter): 543 filter):
546 """Runs svn checkout, update, status, or diff, optionally outputting 544 """Runs svn checkout, update, status, or diff, optionally outputting
547 to stdout. 545 to stdout.
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 # Col 3 691 # Col 3
694 if wc_status[0].getAttribute('copied') == 'true': 692 if wc_status[0].getAttribute('copied') == 'true':
695 statuses[3] = '+' 693 statuses[3] = '+'
696 # Col 4 694 # Col 4
697 if wc_status[0].getAttribute('switched') == 'true': 695 if wc_status[0].getAttribute('switched') == 'true':
698 statuses[4] = 'S' 696 statuses[4] = 'S'
699 # TODO(maruel): Col 5 and 6 697 # TODO(maruel): Col 5 and 6
700 item = (''.join(statuses), file) 698 item = (''.join(statuses), file)
701 results.append(item) 699 results.append(item)
702 return results 700 return results
OLDNEW
« no previous file with comments | « gclient.py ('k') | gclient_utils.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698