Index: gclient.py |
=================================================================== |
--- gclient.py (revision 43902) |
+++ gclient.py (working copy) |
@@ -429,6 +429,29 @@ |
def __str__(self): |
return 'From("%s")' % self.module_name |
+ class FileImpl: |
+ """Used to implement the File('') syntax which lets you sync a single file |
+ from an SVN repo.""" |
+ |
+ def __init__(self, file_location): |
+ self.file_location = file_location |
+ |
+ def __str__(self): |
+ return 'File("%s")' % self.file_location |
+ |
+ def GetPath(self): |
+ return os.path.split(self.file_location)[0] |
+ |
+ def GetFilename(self): |
+ rev_tokens = self.file_location.split('@') |
+ return os.path.split(rev_tokens[0])[1] |
+ |
+ def GetRevision(self): |
+ rev_tokens = self.file_location.split('@') |
+ if len(rev_tokens) > 1: |
+ return rev_tokens[1] |
+ return None |
+ |
class _VarImpl: |
def __init__(self, custom_vars, local_scope): |
self._custom_vars = custom_vars |
@@ -461,7 +484,12 @@ |
# Eval the content |
local_scope = {} |
var = self._VarImpl(custom_vars, local_scope) |
- global_scope = {"From": self.FromImpl, "Var": var.Lookup, "deps_os": {}} |
+ global_scope = { |
+ "File": self.FileImpl, |
+ "From": self.FromImpl, |
+ "Var": var.Lookup, |
+ "deps_os": {}, |
+ } |
exec(solution_deps_content, global_scope, local_scope) |
deps = local_scope.get("deps", {}) |
@@ -560,14 +588,14 @@ |
# |
# If multiple solutions all have the same From reference, then we |
# should only add one to our list of dependencies. |
- if type(url) != str: |
+ if isinstance(url, self.FromImpl): |
if url.module_name in solution_urls: |
# Already parsed. |
continue |
if d in deps and type(deps[d]) != str: |
if url.module_name == deps[d].module_name: |
continue |
- else: |
+ elif isinstance(url, str): |
parsed_url = urlparse.urlparse(url) |
scheme = parsed_url[0] |
if not scheme: |
@@ -728,12 +756,20 @@ |
scm = gclient_scm.CreateSCM(url, self._root_dir, d) |
scm.RunCommand(command, self._options, args, file_list) |
self._options.revision = None |
+ elif isinstance(deps[d], self.FileImpl): |
+ file = deps[d] |
+ self._options.revision = file.GetRevision() |
+ if run_scm: |
+ scm = gclient_scm.CreateSCM(file.GetPath(), self._root_dir, d) |
+ scm.RunCommand("updatesingle", self._options, |
+ args + [file.GetFilename()], file_list) |
+ |
if command == 'update' and not self._options.verbose: |
pm.end() |
# Second pass for inherited deps (via the From keyword) |
for d in deps_to_process: |
- if type(deps[d]) != str: |
+ if isinstance(deps[d], self.FromImpl): |
filename = os.path.join(self._root_dir, |
deps[d].module_name, |
self._options.deps_file) |
@@ -885,7 +921,7 @@ |
# Second pass for inherited deps (via the From keyword) |
for d in deps_to_process: |
- if type(deps[d]) != str: |
+ if isinstance(deps[d], self.FromImpl): |
deps_parent_url = entries[deps[d].module_name] |
if deps_parent_url.find("@") < 0: |
raise gclient_utils.Error("From %s missing revisioned url" % |