Index: gclient.py |
=================================================================== |
--- gclient.py (revision 15927) |
+++ gclient.py (working copy) |
@@ -752,7 +752,8 @@ |
Error: if can't get URL for relative path. |
""" |
# Only update if git is not controlling the directory. |
- git_path = os.path.join(self._root_dir, self.relpath, '.git') |
+ checkout_path = os.path.join(self._root_dir, self.relpath) |
+ git_path = os.path.join(checkout_path, '.git') |
if options.path_exists(git_path): |
print("________ found .git directory; skipping %s" % self.relpath) |
return |
@@ -777,17 +778,16 @@ |
if revision: |
rev_str = ' at %d' % revision |
- if not options.path_exists(os.path.join(self._root_dir, self.relpath)): |
+ if not options.path_exists(checkout_path): |
# We need to checkout. |
- command = ['checkout', url, os.path.join(self._root_dir, self.relpath)] |
+ command = ['checkout', url, checkout_path] |
if revision: |
command.extend(['--revision', str(revision)]) |
RunSVNAndGetFileList(command, self._root_dir, file_list) |
return |
# Get the existing scm url and the revision number of the current checkout. |
- from_info = CaptureSVNInfo(os.path.join(self._root_dir, self.relpath, '.'), |
- '.') |
+ from_info = CaptureSVNInfo(os.path.join(checkout_path, '.'), '.') |
if options.manually_grab_svn_rev: |
# Retrieve the current HEAD version because svn is slow at null updates. |
@@ -798,16 +798,12 @@ |
if from_info['URL'] != components[0]: |
to_info = CaptureSVNInfo(url, '.') |
- if from_info['Repository Root'] != to_info['Repository Root']: |
+ can_switch = ((from_info['Repository Root'] != to_info['Repository Root']) |
+ and (from_info['UUID'] == to_info['UUID'])) |
+ if can_switch: |
+ print("\n_____ relocating %s to a new checkout" % self.relpath) |
# We have different roots, so check if we can switch --relocate. |
# Subversion only permits this if the repository UUIDs match. |
- if from_info['UUID'] != to_info['UUID']: |
- raise Error("Can't switch the checkout to %s; UUID don't match. That " |
- "simply means in theory, gclient should verify you don't " |
- "have a local change, remove the old checkout and do a " |
- "fresh new checkout of the new repo. Contributions are " |
- "welcome." % url) |
- |
# Perform the switch --relocate, then rewrite the from_url |
# to reflect where we "are now." (This is the same way that |
# Subversion itself handles the metadata when switch --relocate |
@@ -823,6 +819,21 @@ |
from_info['URL'] = from_info['URL'].replace( |
from_info['Repository Root'], |
to_info['Repository Root']) |
+ else: |
+ if CaptureSVNStatus(checkout_path): |
+ raise Error("Can't switch the checkout to %s; UUID don't match and " |
+ "there is local changes in %s. Delete the directory and " |
+ "try again." % (url, checkout_path)) |
+ # Ok delete it. |
+ print("\n_____ switching %s to a new checkout" % self.relpath) |
+ RemoveDirectory(checkout_path) |
+ # We need to checkout. |
+ command = ['checkout', url, checkout_path] |
+ if revision: |
+ command.extend(['--revision', str(revision)]) |
+ RunSVNAndGetFileList(command, self._root_dir, file_list) |
+ return |
+ |
# If the provided url has a revision number that matches the revision |
# number of the existing directory, then we don't need to bother updating. |
@@ -831,7 +842,7 @@ |
print("\n_____ %s%s" % (self.relpath, rev_str)) |
return |
- command = ["update", os.path.join(self._root_dir, self.relpath)] |
+ command = ["update", checkout_path] |
if revision: |
command.extend(['--revision', str(revision)]) |
RunSVNAndGetFileList(command, self._root_dir, file_list) |