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

Side by Side Diff: gclient_scm.py

Issue 9404014: If both -R and -D are specified when updating, remove all untracked directories (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools/
Patch Set: If both -R and -D are specified when updating, remove all untracked directories Created 8 years, 10 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 | « gclient.py ('k') | tests/gclient_scm_test.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 (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 """Gclient-specific SCM-specific operations.""" 5 """Gclient-specific SCM-specific operations."""
6 6
7 import logging 7 import logging
8 import os 8 import os
9 import posixpath 9 import posixpath
10 import re 10 import re
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 if self._IsRebasing(): 435 if self._IsRebasing():
436 raise gclient_utils.Error('\n____ %s%s\n' 436 raise gclient_utils.Error('\n____ %s%s\n'
437 '\nConflict while rebasing this branch.\n' 437 '\nConflict while rebasing this branch.\n'
438 'Fix the conflict and run gclient again.\n' 438 'Fix the conflict and run gclient again.\n'
439 'See man git-rebase for details.\n' 439 'See man git-rebase for details.\n'
440 % (self.relpath, rev_str)) 440 % (self.relpath, rev_str))
441 441
442 if verbose: 442 if verbose:
443 print('Checked out revision %s' % self.revinfo(options, (), None)) 443 print('Checked out revision %s' % self.revinfo(options, (), None))
444 444
445 # If --reset and --delete_unversioned_trees are specified, remove any
446 # untracked directories.
447 if options.reset and options.delete_unversioned_trees:
448 # GIT.CaptureStatus() uses 'dit diff' to compare to a specific SHA1 (the
449 # merge-base by default), so doesn't include untracked files. So we use
450 # 'git ls-files --directory --others --exclude-standard' here directly.
451 paths = scm.GIT.Capture(
452 ['ls-files', '--directory', '--others', '--exclude-standard'],
453 self.checkout_path)
454 for path in (p for p in paths.splitlines() if p.endswith('/')):
455 full_path = os.path.join(self.checkout_path, path)
456 if not os.path.islink(full_path):
457 print('\n_____ removing unversioned directory %s' % path)
458 gclient_utils.RemoveDirectory(full_path)
459
460
445 def revert(self, options, args, file_list): 461 def revert(self, options, args, file_list):
446 """Reverts local modifications. 462 """Reverts local modifications.
447 463
448 All reverted files will be appended to file_list. 464 All reverted files will be appended to file_list.
449 """ 465 """
450 if not os.path.isdir(self.checkout_path): 466 if not os.path.isdir(self.checkout_path):
451 # revert won't work if the directory doesn't exist. It needs to 467 # revert won't work if the directory doesn't exist. It needs to
452 # checkout instead. 468 # checkout instead.
453 print('\n_____ %s is missing, synching instead' % self.relpath) 469 print('\n_____ %s is missing, synching instead' % self.relpath)
454 # Don't reuse the args. 470 # Don't reuse the args.
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 to_info['Repository Root'], 931 to_info['Repository Root'],
916 self.relpath] 932 self.relpath]
917 self._Run(command, options, cwd=self._root_dir) 933 self._Run(command, options, cwd=self._root_dir)
918 from_info['URL'] = from_info['URL'].replace( 934 from_info['URL'] = from_info['URL'].replace(
919 from_info['Repository Root'], 935 from_info['Repository Root'],
920 to_info['Repository Root']) 936 to_info['Repository Root'])
921 else: 937 else:
922 if not options.force and not options.reset: 938 if not options.force and not options.reset:
923 # Look for local modifications but ignore unversioned files. 939 # Look for local modifications but ignore unversioned files.
924 for status in scm.SVN.CaptureStatus(None, self.checkout_path): 940 for status in scm.SVN.CaptureStatus(None, self.checkout_path):
925 if status[0] != '?': 941 if status[0][0] != '?':
926 raise gclient_utils.Error( 942 raise gclient_utils.Error(
927 ('Can\'t switch the checkout to %s; UUID don\'t match and ' 943 ('Can\'t switch the checkout to %s; UUID don\'t match and '
928 'there is local changes in %s. Delete the directory and ' 944 'there is local changes in %s. Delete the directory and '
929 'try again.') % (url, self.checkout_path)) 945 'try again.') % (url, self.checkout_path))
930 # Ok delete it. 946 # Ok delete it.
931 print('\n_____ switching %s to a new checkout' % self.relpath) 947 print('\n_____ switching %s to a new checkout' % self.relpath)
932 gclient_utils.RemoveDirectory(self.checkout_path) 948 gclient_utils.RemoveDirectory(self.checkout_path)
933 # We need to checkout. 949 # We need to checkout.
934 command = ['checkout', url, self.checkout_path] 950 command = ['checkout', url, self.checkout_path]
935 command = self._AddAdditionalUpdateFlags(command, options, revision) 951 command = self._AddAdditionalUpdateFlags(command, options, revision)
936 self._RunAndGetFileList(command, options, file_list, self._root_dir) 952 self._RunAndGetFileList(command, options, file_list, self._root_dir)
937 return 953 return
938 954
939 # If the provided url has a revision number that matches the revision 955 # If the provided url has a revision number that matches the revision
940 # number of the existing directory, then we don't need to bother updating. 956 # number of the existing directory, then we don't need to bother updating.
941 if not options.force and str(from_info['Revision']) == revision: 957 if not options.force and str(from_info['Revision']) == revision:
942 if options.verbose or not forced_revision: 958 if options.verbose or not forced_revision:
943 print('\n_____ %s%s' % (self.relpath, rev_str)) 959 print('\n_____ %s%s' % (self.relpath, rev_str))
944 return 960 else:
961 command = ['update', self.checkout_path]
962 command = self._AddAdditionalUpdateFlags(command, options, revision)
963 self._RunAndGetFileList(command, options, file_list, self._root_dir)
945 964
946 command = ['update', self.checkout_path] 965 # If --reset and --delete_unversioned_trees are specified, remove any
947 command = self._AddAdditionalUpdateFlags(command, options, revision) 966 # untracked files and directories.
948 self._RunAndGetFileList(command, options, file_list, self._root_dir) 967 if options.reset and options.delete_unversioned_trees:
968 for status in scm.SVN.CaptureStatus(None, self.checkout_path):
969 full_path = os.path.join(self.checkout_path, status[1])
970 if (status[0][0] == '?'
971 and os.path.isdir(full_path)
972 and not os.path.islink(full_path)):
973 print('\n_____ removing unversioned directory %s' % status[1])
974 gclient_utils.RemoveDirectory(full_path)
949 975
950 def updatesingle(self, options, args, file_list): 976 def updatesingle(self, options, args, file_list):
951 filename = args.pop() 977 filename = args.pop()
952 if scm.SVN.AssertVersion("1.5")[0]: 978 if scm.SVN.AssertVersion("1.5")[0]:
953 if not os.path.exists(os.path.join(self.checkout_path, '.svn')): 979 if not os.path.exists(os.path.join(self.checkout_path, '.svn')):
954 # Create an empty checkout and then update the one file we want. Future 980 # Create an empty checkout and then update the one file we want. Future
955 # operations will only apply to the one file we checked out. 981 # operations will only apply to the one file we checked out.
956 command = ["checkout", "--depth", "empty", self.url, self.checkout_path] 982 command = ["checkout", "--depth", "empty", self.url, self.checkout_path]
957 self._Run(command, options, cwd=self._root_dir) 983 self._Run(command, options, cwd=self._root_dir)
958 if os.path.exists(os.path.join(self.checkout_path, filename)): 984 if os.path.exists(os.path.join(self.checkout_path, filename)):
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 new_command.append('--force') 1127 new_command.append('--force')
1102 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: 1128 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]:
1103 new_command.extend(('--accept', 'theirs-conflict')) 1129 new_command.extend(('--accept', 'theirs-conflict'))
1104 elif options.manually_grab_svn_rev: 1130 elif options.manually_grab_svn_rev:
1105 new_command.append('--force') 1131 new_command.append('--force')
1106 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: 1132 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]:
1107 new_command.extend(('--accept', 'postpone')) 1133 new_command.extend(('--accept', 'postpone'))
1108 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: 1134 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]:
1109 new_command.extend(('--accept', 'postpone')) 1135 new_command.extend(('--accept', 'postpone'))
1110 return new_command 1136 return new_command
OLDNEW
« no previous file with comments | « gclient.py ('k') | tests/gclient_scm_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698