Index: gclient_scm.py |
diff --git a/gclient_scm.py b/gclient_scm.py |
index 5f04df014c27386b13b5df68569784cfd1e6c5e6..34d05a8d88981bd8e2d34b36f1951ec5fd08bda0 100644 |
--- a/gclient_scm.py |
+++ b/gclient_scm.py |
@@ -198,6 +198,22 @@ class SCMWrapper(object): |
# valid git or svn checkout. |
return False |
+ # TODO(borenet): Remove this once SCMWrapper._DeleteOrMove is enabled. |
+ # pylint: disable=R0201 |
+ def _DeleteOrMove(self, force): |
+ """Delete the checkout directory or move it out of the way. |
+ |
+ Args: |
+ force: bool; if True, delete the directory. Otherwise, just move it. |
+ """ |
+ gclient_utils.AddWarning('WARNING: Upcoming change in ' |
+ 'https://codereview.chromium.org/225403015 would ' |
+ 'cause %s to be deleted or moved to the side. ' |
+ 'This is intended to ease changes to DEPS in the ' |
+ 'future. If you are seeing this warning and ' |
+ 'haven\'t changed the DEPS file, please contact ' |
+ 'borenet@ immediately.' % self.checkout_path) |
+ |
class GitWrapper(SCMWrapper): |
"""Wrapper for Git""" |
@@ -360,6 +376,9 @@ class GitWrapper(SCMWrapper): |
if (not os.path.exists(self.checkout_path) or |
(os.path.isdir(self.checkout_path) and |
not os.path.exists(os.path.join(self.checkout_path, '.git')))): |
+ if (os.path.isdir(self.checkout_path) and |
+ not os.path.exists(os.path.join(self.checkout_path, '.git'))): |
+ self._DeleteOrMove(options.force) |
self._Clone(revision, url, options) |
self._UpdateBranchHeads(options, fetch=True) |
self.UpdateSubmoduleConfig() |
@@ -378,14 +397,6 @@ class GitWrapper(SCMWrapper): |
self.Print('________ unmanaged solution; skipping %s' % self.relpath) |
return self._Capture(['rev-parse', '--verify', 'HEAD']) |
- if not os.path.exists(os.path.join(self.checkout_path, '.git')): |
- raise gclient_utils.Error('\n____ %s%s\n' |
- '\tPath is not a git repo. No .git dir.\n' |
- '\tTo resolve:\n' |
- '\t\trm -rf %s\n' |
- '\tAnd run gclient sync again\n' |
- % (self.relpath, rev_str, self.relpath)) |
- |
# See if the url has changed (the unittests use git://foo for the url, let |
# that through). |
current_url = self._Capture(['config', 'remote.%s.url' % self.remote]) |
@@ -395,7 +406,7 @@ class GitWrapper(SCMWrapper): |
# Skip url auto-correction if remote.origin.gclient-auto-fix-url is set. |
# This allows devs to use experimental repos which have a different url |
# but whose branch(s) are the same as official repos. |
- if (current_url != url and |
+ if (current_url.rstrip('/') != url.rstrip('/') and |
url != 'git://foo' and |
subprocess2.capture( |
['git', 'config', 'remote.%s.gclient-auto-fix-url' % self.remote], |
@@ -1063,12 +1074,7 @@ class SVNWrapper(SCMWrapper): |
Raises: |
Error: if can't get URL for relative path. |
""" |
- # Only update if git or hg is not controlling the directory. |
- git_path = os.path.join(self.checkout_path, '.git') |
- if os.path.exists(git_path): |
- self.Print('________ found .git directory; skipping %s' % self.relpath) |
- return |
- |
+ # Only update if hg is not controlling the directory. |
hg_path = os.path.join(self.checkout_path, '.hg') |
if os.path.exists(hg_path): |
self.Print('________ found .hg directory; skipping %s' % self.relpath) |
@@ -1099,21 +1105,26 @@ class SVNWrapper(SCMWrapper): |
forced_revision = False |
rev_str = '' |
- # Get the existing scm url and the revision number of the current checkout. |
exists = os.path.exists(self.checkout_path) |
if exists and managed: |
+ # Git is only okay if it's a git-svn checkout of the right repo. |
+ if scm.GIT.IsGitSvn(self.checkout_path): |
+ remote_url = scm.GIT.Capture(['config', '--local', '--get', |
+ 'svn-remote.svn.url'], |
+ cwd=self.checkout_path).rstrip() |
+ if remote_url.rstrip('/') == base_url.rstrip('/'): |
+ print('\n_____ %s looks like a git-svn checkout. Skipping.' |
+ % self.relpath) |
+ return # TODO(borenet): Get the svn revision number? |
+ |
+ # Get the existing scm url and the revision number of the current checkout. |
+ if exists and managed: |
try: |
from_info = scm.SVN.CaptureLocalInfo( |
[], os.path.join(self.checkout_path, '.')) |
except (gclient_utils.Error, subprocess2.CalledProcessError): |
- if options.reset and options.delete_unversioned_trees: |
- self.Print('Removing troublesome path %s' % self.checkout_path) |
- gclient_utils.rmtree(self.checkout_path) |
- exists = False |
- else: |
- msg = ('Can\'t update/checkout %s if an unversioned directory is ' |
- 'present. Delete the directory and try again.') |
- raise gclient_utils.Error(msg % self.checkout_path) |
+ self._DeleteOrMove(options.force) |
+ exists = False |
BASE_URLS = { |
'/chrome/trunk/src': 'gs://chromium-svn-checkout/chrome/', |
@@ -1193,7 +1204,9 @@ class SVNWrapper(SCMWrapper): |
if not managed: |
self.Print(('________ unmanaged solution; skipping %s' % self.relpath)) |
- return self.Svnversion() |
+ if os.path.exists(os.path.join(self.checkout_path, '.svn')): |
+ return self.Svnversion() |
+ return |
if 'URL' not in from_info: |
raise gclient_utils.Error( |
@@ -1237,7 +1250,7 @@ class SVNWrapper(SCMWrapper): |
revision = str(from_info_live['Revision']) |
rev_str = ' at %s' % revision |
- if from_info['URL'] != base_url: |
+ if from_info['URL'].rstrip('/') != base_url.rstrip('/'): |
# The repository url changed, need to switch. |
try: |
to_info = scm.SVN.CaptureRemoteInfo(url) |