Index: gclient.py |
=================================================================== |
--- gclient.py (revision 15714) |
+++ gclient.py (working copy) |
@@ -557,19 +557,18 @@ |
def CaptureSVNInfo(options, relpath, in_directory): |
- """Runs 'svn info' on an existing path. |
+ """Returns a dictionary from the svn info output for the given file. |
Args: |
relpath: The directory where the working copy resides relative to |
the directory given by in_directory. |
in_directory: The directory where svn is to be run. |
- |
- Returns: |
- An object with fields corresponding to the output of 'svn info' |
""" |
dom = ParseXML(CaptureSVN(options, ["info", "--xml", relpath], in_directory)) |
- result = PrintableObject() |
+ result = {} |
if dom: |
+ def C(item, f): |
+ if item is not None: return f(item) |
# /info/entry/ |
# url |
# reposityory/(root|uuid) |
@@ -578,11 +577,18 @@ |
# str() the results because they may be returned as Unicode, which |
# interferes with the higher layers matching up things in the deps |
# dictionary. |
- result = PrintableObject() |
- result.root = str(GetNamedNodeText(dom, 'root')) |
- result.url = str(GetNamedNodeText(dom, 'url')) |
- result.uuid = str(GetNamedNodeText(dom, 'uuid')) |
- result.revision = int(GetNodeNamedAttributeText(dom, 'entry', 'revision')) |
+ # TODO(maruel): Fix at higher level instead (!) |
+ result['Repository Root'] = C(GetNamedNodeText(dom, 'root'), str) |
+ result['URL'] = C(GetNamedNodeText(dom, 'url'), str) |
+ result['UUID'] = C(GetNamedNodeText(dom, 'uuid'), str) |
+ result['Revision'] = C(GetNodeNamedAttributeText(dom, 'entry', 'revision'), |
+ int) |
+ result['Node Kind'] = C(GetNodeNamedAttributeText(dom, 'entry', 'kind'), |
+ str) |
+ result['Schedule'] = C(GetNamedNodeText(dom, 'schedule'), str) |
+ result['Path'] = C(GetNodeNamedAttributeText(dom, 'entry', 'path'), str) |
+ result['Copied From URL'] = C(GetNamedNodeText(dom, 'copy-from-url'), str) |
+ result['Copied From Rev'] = C(GetNamedNodeText(dom, 'copy-from-rev'), str) |
return result |
@@ -781,17 +787,21 @@ |
if options.manually_grab_svn_rev: |
# Retrieve the current HEAD version because svn is slow at null updates. |
if not revision: |
- from_info_live = CaptureSVNInfo(options, from_info.url, '.') |
- revision = int(from_info_live.revision) |
+ from_info_live = CaptureSVNInfo(options, from_info['URL'], '.') |
+ revision = int(from_info_live['Revision']) |
rev_str = ' at %d' % revision |
- if from_info.url != components[0]: |
+ if from_info['URL'] != components[0]: |
to_info = CaptureSVNInfo(options, url, '.') |
- if from_info.root != to_info.root: |
+ if from_info['Repository Root'] != to_info['Repository Root']: |
# 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" % url) |
+ 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 |
@@ -800,14 +810,18 @@ |
# can update to a revision or have to switch to a different |
# branch work as expected. |
# TODO(maruel): TEST ME ! |
- command = ["switch", "--relocate", from_info.root, to_info.root, |
+ command = ["switch", "--relocate", |
+ from_info['Repository Root'], |
+ to_info['Repository Root'], |
self.relpath] |
RunSVN(options, command, self._root_dir) |
- from_info.url = from_info.url.replace(from_info.root, to_info.root) |
+ from_info['URL'] = from_info['URL'].replace( |
+ from_info['Repository Root'], |
+ to_info['Repository Root']) |
# 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. |
- if not options.force and from_info.revision == revision: |
+ if not options.force and from_info['Revision'] == revision: |
if options.verbose or not forced_revision: |
print >>options.stdout, ("\n_____ %s%s" % ( |
self.relpath, rev_str)) |