Chromium Code Reviews| 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 """Gclient-specific SCM-specific operations.""" | 5 """Gclient-specific SCM-specific operations.""" |
| 6 | 6 |
| 7 import collections | 7 import collections |
| 8 import logging | 8 import logging |
| 9 import os | 9 import os |
| 10 import posixpath | 10 import posixpath |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 295 if revision.startswith('refs/'): | 295 if revision.startswith('refs/'): |
| 296 rev_type = "branch" | 296 rev_type = "branch" |
| 297 elif revision.startswith(self.remote + '/'): | 297 elif revision.startswith(self.remote + '/'): |
| 298 # For compatibility with old naming, translate 'origin' to 'refs/heads' | 298 # For compatibility with old naming, translate 'origin' to 'refs/heads' |
| 299 revision = revision.replace(self.remote + '/', 'refs/heads/') | 299 revision = revision.replace(self.remote + '/', 'refs/heads/') |
| 300 rev_type = "branch" | 300 rev_type = "branch" |
| 301 else: | 301 else: |
| 302 # hash is also a tag, only make a distinction at checkout | 302 # hash is also a tag, only make a distinction at checkout |
| 303 rev_type = "hash" | 303 rev_type = "hash" |
| 304 | 304 |
| 305 if (not os.path.exists(self.checkout_path) or | 305 if (not os.path.exists(self.checkout_path)): |
| 306 (os.path.isdir(self.checkout_path) and | |
| 307 not os.path.exists(os.path.join(self.checkout_path, '.git')))): | |
| 308 self._Clone(revision, url, options) | 306 self._Clone(revision, url, options) |
| 309 self.UpdateSubmoduleConfig() | 307 self.UpdateSubmoduleConfig() |
| 310 if file_list is not None: | 308 if file_list is not None: |
| 311 files = self._Capture(['ls-files']).splitlines() | 309 files = self._Capture(['ls-files']).splitlines() |
| 312 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) | 310 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) |
| 313 if not verbose: | 311 if not verbose: |
| 314 # Make the output a little prettier. It's nice to have some whitespace | 312 # Make the output a little prettier. It's nice to have some whitespace |
| 315 # between projects when cloning. | 313 # between projects when cloning. |
| 316 print('') | 314 print('') |
| 317 return self._Capture(['rev-parse', '--verify', 'HEAD']) | 315 return self._Capture(['rev-parse', '--verify', 'HEAD']) |
| 318 | 316 |
| 319 if not managed: | 317 if not managed: |
| 320 self._UpdateBranchHeads(options, fetch=False) | 318 self._UpdateBranchHeads(options, fetch=False) |
| 321 self.UpdateSubmoduleConfig() | 319 self.UpdateSubmoduleConfig() |
| 322 print ('________ unmanaged solution; skipping %s' % self.relpath) | 320 print ('________ unmanaged solution; skipping %s' % self.relpath) |
| 323 return self._Capture(['rev-parse', '--verify', 'HEAD']) | 321 return self._Capture(['rev-parse', '--verify', 'HEAD']) |
| 324 | 322 |
| 325 if not os.path.exists(os.path.join(self.checkout_path, '.git')): | 323 if not os.path.exists(os.path.join(self.checkout_path, '.git')): |
| 326 raise gclient_utils.Error('\n____ %s%s\n' | 324 if options.force: |
| 327 '\tPath is not a git repo. No .git dir.\n' | 325 # Delete and re-sync. |
| 328 '\tTo resolve:\n' | 326 print('_____ Conflicting directory found in %s. Removing.' |
| 329 '\t\trm -rf %s\n' | 327 % self.checkout_path) |
| 330 '\tAnd run gclient sync again\n' | 328 gclient_utils.rmtree(self.checkout_path) |
| 331 % (self.relpath, rev_str, self.relpath)) | 329 self._Clone(revision, url, options) |
| 330 self.UpdateSubmoduleConfig() | |
| 331 if file_list is not None: | |
| 332 files = self._Capture(['ls-files']).splitlines() | |
| 333 file_list.extend([os.path.join(self.checkout_path, f) for f in files]) | |
| 334 if not verbose: | |
| 335 # Make the output a little prettier. It's nice to have some whitespace | |
| 336 # between projects when cloning. | |
| 337 print('') | |
| 338 return self._Capture(['rev-parse', '--verify', 'HEAD']) | |
| 339 else: | |
| 340 raise gclient_utils.Error('\n____ %s%s\n' | |
| 341 '\tPath is not a git repo. No .git dir.\n' | |
| 342 '\tTo resolve:\n' | |
| 343 '\t\trm -rf %s\n' | |
| 344 '\tAnd run gclient sync again\n' | |
| 345 '\tOr run with --force\n' | |
| 346 % (self.relpath, rev_str, self.relpath)) | |
| 332 | 347 |
| 333 # See if the url has changed (the unittests use git://foo for the url, let | 348 # See if the url has changed (the unittests use git://foo for the url, let |
| 334 # that through). | 349 # that through). |
| 335 current_url = self._Capture(['config', 'remote.%s.url' % self.remote]) | 350 current_url = self._Capture(['config', 'remote.%s.url' % self.remote]) |
| 336 return_early = False | 351 return_early = False |
| 337 # TODO(maruel): Delete url != 'git://foo' since it's just to make the | 352 # TODO(maruel): Delete url != 'git://foo' since it's just to make the |
| 338 # unit test pass. (and update the comment above) | 353 # unit test pass. (and update the comment above) |
| 339 # Skip url auto-correction if remote.origin.gclient-auto-fix-url is set. | 354 # Skip url auto-correction if remote.origin.gclient-auto-fix-url is set. |
| 340 # This allows devs to use experimental repos which have a different url | 355 # This allows devs to use experimental repos which have a different url |
| 341 # but whose branch(s) are the same as official repos. | 356 # but whose branch(s) are the same as official repos. |
| 342 if (current_url != url and | 357 if (current_url.rstrip('/') != url.rstrip('/') and |
| 343 url != 'git://foo' and | 358 url != 'git://foo' and |
| 344 subprocess2.capture( | 359 subprocess2.capture( |
| 345 ['git', 'config', 'remote.%s.gclient-auto-fix-url' % self.remote], | 360 ['git', 'config', 'remote.%s.gclient-auto-fix-url' % self.remote], |
| 346 cwd=self.checkout_path).strip() != 'False'): | 361 cwd=self.checkout_path).strip() != 'False'): |
| 347 print('_____ switching %s to a new upstream' % self.relpath) | 362 print('_____ switching %s to a new upstream' % self.relpath) |
| 348 # Make sure it's clean | 363 # Make sure it's clean |
| 349 self._CheckClean(rev_str) | 364 self._CheckClean(rev_str) |
| 350 # Switch over to the new upstream | 365 # Switch over to the new upstream |
| 351 self._Run(['remote', 'set-url', self.remote, url], options) | 366 self._Run(['remote', 'set-url', self.remote, url], options) |
| 352 self._FetchAndReset(revision, file_list, options) | 367 self._FetchAndReset(revision, file_list, options) |
| (...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1097 filter_fn=SvnDiffFilterer(self.relpath).Filter) | 1112 filter_fn=SvnDiffFilterer(self.relpath).Filter) |
| 1098 | 1113 |
| 1099 def update(self, options, args, file_list): | 1114 def update(self, options, args, file_list): |
| 1100 """Runs svn to update or transparently checkout the working copy. | 1115 """Runs svn to update or transparently checkout the working copy. |
| 1101 | 1116 |
| 1102 All updated files will be appended to file_list. | 1117 All updated files will be appended to file_list. |
| 1103 | 1118 |
| 1104 Raises: | 1119 Raises: |
| 1105 Error: if can't get URL for relative path. | 1120 Error: if can't get URL for relative path. |
| 1106 """ | 1121 """ |
| 1107 # Only update if git or hg is not controlling the directory. | 1122 # Only update if hg is not controlling the directory. |
| 1108 git_path = os.path.join(self.checkout_path, '.git') | |
| 1109 if os.path.exists(git_path): | |
| 1110 print('________ found .git directory; skipping %s' % self.relpath) | |
| 1111 return | |
| 1112 | |
| 1113 hg_path = os.path.join(self.checkout_path, '.hg') | 1123 hg_path = os.path.join(self.checkout_path, '.hg') |
| 1114 if os.path.exists(hg_path): | 1124 if os.path.exists(hg_path): |
| 1115 print('________ found .hg directory; skipping %s' % self.relpath) | 1125 print('________ found .hg directory; skipping %s' % self.relpath) |
| 1116 return | 1126 return |
| 1117 | 1127 |
| 1118 if args: | 1128 if args: |
| 1119 raise gclient_utils.Error("Unsupported argument(s): %s" % ",".join(args)) | 1129 raise gclient_utils.Error("Unsupported argument(s): %s" % ",".join(args)) |
| 1120 | 1130 |
| 1121 # revision is the revision to match. It is None if no revision is specified, | 1131 # revision is the revision to match. It is None if no revision is specified, |
| 1122 # i.e. the 'deps ain't pinned'. | 1132 # i.e. the 'deps ain't pinned'. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1133 # Reconstruct the url. | 1143 # Reconstruct the url. |
| 1134 url = '%s@%s' % (url, revision) | 1144 url = '%s@%s' % (url, revision) |
| 1135 rev_str = ' at %s' % revision | 1145 rev_str = ' at %s' % revision |
| 1136 else: | 1146 else: |
| 1137 managed = False | 1147 managed = False |
| 1138 revision = None | 1148 revision = None |
| 1139 else: | 1149 else: |
| 1140 forced_revision = False | 1150 forced_revision = False |
| 1141 rev_str = '' | 1151 rev_str = '' |
| 1142 | 1152 |
| 1153 exists = os.path.exists(self.checkout_path) | |
| 1154 if exists and managed: | |
| 1155 # Git is only okay if it's a git-svn checkout of the right repo. | |
| 1156 if scm.GIT.IsGitSvn(self.checkout_path): | |
| 1157 remote_url = scm.GIT.Capture(['config', '--local', '--get', | |
| 1158 'svn-remote.svn.url'], | |
| 1159 cwd=self.checkout_path).rstrip() | |
| 1160 if remote_url.rstrip('/') == base_url.rstrip('/'): | |
| 1161 print('\n_____ %s looks like a git-svn checkout. Skipping.' | |
| 1162 % self.relpath) | |
| 1163 return # TODO(borenet): Get the svn revision number? | |
| 1164 | |
| 1143 # Get the existing scm url and the revision number of the current checkout. | 1165 # Get the existing scm url and the revision number of the current checkout. |
| 1144 exists = os.path.exists(self.checkout_path) | |
| 1145 if exists and managed: | 1166 if exists and managed: |
| 1146 try: | 1167 try: |
| 1147 from_info = scm.SVN.CaptureLocalInfo( | 1168 from_info = scm.SVN.CaptureLocalInfo( |
| 1148 [], os.path.join(self.checkout_path, '.')) | 1169 [], os.path.join(self.checkout_path, '.')) |
| 1149 except (gclient_utils.Error, subprocess2.CalledProcessError): | 1170 except (gclient_utils.Error, subprocess2.CalledProcessError): |
| 1150 if options.reset and options.delete_unversioned_trees: | 1171 if options.force or options.reset and options.delete_unversioned_trees: |
|
szager1
2014/03/03 21:20:17
Please add parentheses for grouping, don't rely on
borenet
2014/03/03 21:26:52
Done.
| |
| 1151 print 'Removing troublesome path %s' % self.checkout_path | 1172 print 'Removing troublesome path %s' % self.checkout_path |
| 1152 gclient_utils.rmtree(self.checkout_path) | 1173 gclient_utils.rmtree(self.checkout_path) |
| 1153 exists = False | 1174 exists = False |
| 1154 else: | 1175 else: |
| 1155 msg = ('Can\'t update/checkout %s if an unversioned directory is ' | 1176 msg = ('Can\'t update/checkout %s if an unversioned directory is ' |
| 1156 'present. Delete the directory and try again.') | 1177 'present. Delete the directory and try again.') |
| 1157 raise gclient_utils.Error(msg % self.checkout_path) | 1178 raise gclient_utils.Error(msg % self.checkout_path) |
| 1158 | 1179 |
| 1159 BASE_URLS = { | 1180 BASE_URLS = { |
| 1160 '/chrome/trunk/src': 'gs://chromium-svn-checkout/chrome/', | 1181 '/chrome/trunk/src': 'gs://chromium-svn-checkout/chrome/', |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1270 if d[0][0] == '!': | 1291 if d[0][0] == '!': |
| 1271 print 'You can pass --force to enable automatic removal.' | 1292 print 'You can pass --force to enable automatic removal.' |
| 1272 raise e | 1293 raise e |
| 1273 | 1294 |
| 1274 # Retrieve the current HEAD version because svn is slow at null updates. | 1295 # Retrieve the current HEAD version because svn is slow at null updates. |
| 1275 if options.manually_grab_svn_rev and not revision: | 1296 if options.manually_grab_svn_rev and not revision: |
| 1276 from_info_live = scm.SVN.CaptureRemoteInfo(from_info['URL']) | 1297 from_info_live = scm.SVN.CaptureRemoteInfo(from_info['URL']) |
| 1277 revision = str(from_info_live['Revision']) | 1298 revision = str(from_info_live['Revision']) |
| 1278 rev_str = ' at %s' % revision | 1299 rev_str = ' at %s' % revision |
| 1279 | 1300 |
| 1280 if from_info['URL'] != base_url: | 1301 if from_info['URL'].rstrip('/') != base_url.rstrip('/'): |
| 1281 # The repository url changed, need to switch. | 1302 # The repository url changed, need to switch. |
| 1282 try: | 1303 try: |
| 1283 to_info = scm.SVN.CaptureRemoteInfo(url) | 1304 to_info = scm.SVN.CaptureRemoteInfo(url) |
| 1284 except (gclient_utils.Error, subprocess2.CalledProcessError): | 1305 except (gclient_utils.Error, subprocess2.CalledProcessError): |
| 1285 # The url is invalid or the server is not accessible, it's safer to bail | 1306 # The url is invalid or the server is not accessible, it's safer to bail |
| 1286 # out right now. | 1307 # out right now. |
| 1287 raise gclient_utils.Error('This url is unreachable: %s' % url) | 1308 raise gclient_utils.Error('This url is unreachable: %s' % url) |
| 1288 can_switch = ((from_info['Repository Root'] != to_info['Repository Root']) | 1309 can_switch = ((from_info['Repository Root'] != to_info['Repository Root']) |
| 1289 and (from_info['UUID'] == to_info['UUID'])) | 1310 and (from_info['UUID'] == to_info['UUID'])) |
| 1290 if can_switch: | 1311 if can_switch: |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1506 new_command.append('--force') | 1527 new_command.append('--force') |
| 1507 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1528 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
| 1508 new_command.extend(('--accept', 'theirs-conflict')) | 1529 new_command.extend(('--accept', 'theirs-conflict')) |
| 1509 elif options.manually_grab_svn_rev: | 1530 elif options.manually_grab_svn_rev: |
| 1510 new_command.append('--force') | 1531 new_command.append('--force') |
| 1511 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1532 if command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
| 1512 new_command.extend(('--accept', 'postpone')) | 1533 new_command.extend(('--accept', 'postpone')) |
| 1513 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: | 1534 elif command[0] != 'checkout' and scm.SVN.AssertVersion('1.6')[0]: |
| 1514 new_command.extend(('--accept', 'postpone')) | 1535 new_command.extend(('--accept', 'postpone')) |
| 1515 return new_command | 1536 return new_command |
| OLD | NEW |