| 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)) | 
|  |