|
|
|
@ -211,8 +211,8 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
# Interestingly enough, the following condition only works in the case we
|
|
|
|
|
# want: self is a 2nd level node. 3nd level node wouldn't need this since
|
|
|
|
|
# they already have their parent as a requirement.
|
|
|
|
|
if self.parent in self.root_parent().dependencies:
|
|
|
|
|
root_deps = self.root_parent().dependencies
|
|
|
|
|
root_deps = self.root.dependencies
|
|
|
|
|
if self.parent in root_deps:
|
|
|
|
|
for i in range(0, root_deps.index(self.parent)):
|
|
|
|
|
value = root_deps[i]
|
|
|
|
|
if value.name:
|
|
|
|
@ -230,7 +230,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
if j.should_process:
|
|
|
|
|
yield j
|
|
|
|
|
|
|
|
|
|
for obj in yield_full_tree(self.root_parent()):
|
|
|
|
|
for obj in yield_full_tree(self.root):
|
|
|
|
|
if obj is self or not obj.name:
|
|
|
|
|
continue
|
|
|
|
|
# Step 1: Find any requirements self may need.
|
|
|
|
@ -277,7 +277,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
raise gclient_utils.Error(
|
|
|
|
|
'Couldn\'t find %s in %s, referenced by %s (parent: %s)\n%s' % (
|
|
|
|
|
sub_target, ref.name, self.name, self.parent.name,
|
|
|
|
|
str(self.root_parent())))
|
|
|
|
|
str(self.root)))
|
|
|
|
|
|
|
|
|
|
# Call LateOverride() again.
|
|
|
|
|
parsed_url = found_dep.LateOverride(found_dep.url)
|
|
|
|
@ -295,7 +295,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
parent_url = self.parent.parsed_url
|
|
|
|
|
if isinstance(parent_url, self.FileImpl):
|
|
|
|
|
parent_url = parent_url.file_location
|
|
|
|
|
scm = gclient_scm.CreateSCM(parent_url, self.root_dir(), None)
|
|
|
|
|
scm = gclient_scm.CreateSCM(parent_url, self.root.root_dir, None)
|
|
|
|
|
parsed_url = scm.FullUrlForRelativeUrl(url)
|
|
|
|
|
else:
|
|
|
|
|
parsed_url = url
|
|
|
|
@ -326,7 +326,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
'Var': var.Lookup,
|
|
|
|
|
'deps_os': {},
|
|
|
|
|
}
|
|
|
|
|
filepath = os.path.join(self.root_dir(), self.name, self.deps_file)
|
|
|
|
|
filepath = os.path.join(self.root.root_dir, self.name, self.deps_file)
|
|
|
|
|
if not os.path.isfile(filepath):
|
|
|
|
|
logging.info('%s: No %s file found at %s' % (self.name, self.deps_file,
|
|
|
|
|
filepath))
|
|
|
|
@ -342,9 +342,9 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
# load os specific dependencies if defined. these dependencies may
|
|
|
|
|
# override or extend the values defined by the 'deps' member.
|
|
|
|
|
if 'deps_os' in local_scope:
|
|
|
|
|
for deps_os_key in self.enforced_os():
|
|
|
|
|
for deps_os_key in self.root.enforced_os:
|
|
|
|
|
os_deps = local_scope['deps_os'].get(deps_os_key, {})
|
|
|
|
|
if len(self.enforced_os()) > 1:
|
|
|
|
|
if len(self.root.enforced_os) > 1:
|
|
|
|
|
# Ignore any conflict when including deps for more than one
|
|
|
|
|
# platform, so we collect the broadest set of dependencies
|
|
|
|
|
# available. We may end up with the wrong revision of something for
|
|
|
|
@ -450,7 +450,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
if not command in (None, 'cleanup', 'diff', 'pack', 'status'):
|
|
|
|
|
options.revision = self.parsed_url.GetRevision()
|
|
|
|
|
scm = gclient_scm.SVNWrapper(self.parsed_url.GetPath(),
|
|
|
|
|
self.root_dir(),
|
|
|
|
|
self.root.root_dir,
|
|
|
|
|
self.name)
|
|
|
|
|
scm.RunCommand('updatesingle', options,
|
|
|
|
|
args + [self.parsed_url.GetFilename()],
|
|
|
|
@ -460,7 +460,8 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
options = copy.copy(options)
|
|
|
|
|
options.revision = revision_overrides.get(self.name)
|
|
|
|
|
maybeGetParentRevision(options)
|
|
|
|
|
scm = gclient_scm.CreateSCM(self.parsed_url, self.root_dir(), self.name)
|
|
|
|
|
scm = gclient_scm.CreateSCM(
|
|
|
|
|
self.parsed_url, self.root.root_dir, self.name)
|
|
|
|
|
scm.RunCommand(command, options, args, self._file_list)
|
|
|
|
|
maybeConvertToDateRevision(options)
|
|
|
|
|
self._file_list = [os.path.join(self.name, f.strip())
|
|
|
|
@ -490,7 +491,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
if (options.force or
|
|
|
|
|
isinstance(self.parsed_url, self.FileImpl) or
|
|
|
|
|
gclient_scm.GetScmName(self.parsed_url) in ('git', None) or
|
|
|
|
|
os.path.isdir(os.path.join(self.root_dir(), self.name, '.git'))):
|
|
|
|
|
os.path.isdir(os.path.join(self.root.root_dir, self.name, '.git'))):
|
|
|
|
|
for hook_dict in self.deps_hooks:
|
|
|
|
|
self._RunHookAction(hook_dict, [])
|
|
|
|
|
else:
|
|
|
|
@ -502,7 +503,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
if not os.path.isabs(file_list[i]):
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
prefix = os.path.commonprefix([self.root_dir().lower(),
|
|
|
|
|
prefix = os.path.commonprefix([self.root.root_dir.lower(),
|
|
|
|
|
file_list[i].lower()])
|
|
|
|
|
file_list[i] = file_list[i][len(prefix):]
|
|
|
|
|
|
|
|
|
@ -542,7 +543,7 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
gclient_utils.CheckCallAndFilterAndHeader(
|
|
|
|
|
command, cwd=self.root_dir(), always=True)
|
|
|
|
|
command, cwd=self.root.root_dir, always=True)
|
|
|
|
|
except (gclient_utils.Error, subprocess2.CalledProcessError), e:
|
|
|
|
|
# Use a discrete exit status code of 2 to indicate that a hook action
|
|
|
|
|
# failed. Users of this script may wish to treat hook action failures
|
|
|
|
@ -550,12 +551,6 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
print >> sys.stderr, 'Error: %s' % str(e)
|
|
|
|
|
sys.exit(2)
|
|
|
|
|
|
|
|
|
|
def root_dir(self):
|
|
|
|
|
return self.parent.root_dir()
|
|
|
|
|
|
|
|
|
|
def enforced_os(self):
|
|
|
|
|
return self.parent.enforced_os()
|
|
|
|
|
|
|
|
|
|
def recursion_limit(self):
|
|
|
|
|
return self.parent.recursion_limit() - 1
|
|
|
|
|
|
|
|
|
@ -615,12 +610,13 @@ class Dependency(GClientKeywords, gclient_utils.WorkItem):
|
|
|
|
|
i = i.parent
|
|
|
|
|
return out
|
|
|
|
|
|
|
|
|
|
def root_parent(self):
|
|
|
|
|
"""Returns the root object, normally a GClient object."""
|
|
|
|
|
d = self
|
|
|
|
|
while d.parent:
|
|
|
|
|
d = d.parent
|
|
|
|
|
return d
|
|
|
|
|
@property
|
|
|
|
|
def root(self):
|
|
|
|
|
"""Returns the root node, a GClient object."""
|
|
|
|
|
if not self.parent:
|
|
|
|
|
# This line is to signal pylint that it could be a GClient instance.
|
|
|
|
|
return self or GClient(None, None)
|
|
|
|
|
return self.parent.root
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GClient(Dependency):
|
|
|
|
@ -680,7 +676,7 @@ solutions = [
|
|
|
|
|
enforced_os = [self.DEPS_OS_CHOICES.get(sys.platform, 'unix')]
|
|
|
|
|
if 'all' in enforced_os:
|
|
|
|
|
enforced_os = self.DEPS_OS_CHOICES.itervalues()
|
|
|
|
|
self._enforced_os = list(set(enforced_os))
|
|
|
|
|
self._enforced_os = tuple(set(enforced_os))
|
|
|
|
|
self._root_dir = root_dir
|
|
|
|
|
self.config_content = None
|
|
|
|
|
|
|
|
|
@ -713,7 +709,7 @@ solutions = [
|
|
|
|
|
self.deps_parsed = True
|
|
|
|
|
|
|
|
|
|
def SaveConfig(self):
|
|
|
|
|
gclient_utils.FileWrite(os.path.join(self.root_dir(),
|
|
|
|
|
gclient_utils.FileWrite(os.path.join(self.root_dir,
|
|
|
|
|
self._options.config_filename),
|
|
|
|
|
self.config_content)
|
|
|
|
|
|
|
|
|
@ -752,7 +748,7 @@ solutions = [
|
|
|
|
|
result += ' %s: %s,\n' % (pprint.pformat(entry.name),
|
|
|
|
|
pprint.pformat(entry.parsed_url))
|
|
|
|
|
result += '}\n'
|
|
|
|
|
file_path = os.path.join(self.root_dir(), self._options.entries_filename)
|
|
|
|
|
file_path = os.path.join(self.root_dir, self._options.entries_filename)
|
|
|
|
|
logging.info(result)
|
|
|
|
|
gclient_utils.FileWrite(file_path, result)
|
|
|
|
|
|
|
|
|
@ -764,7 +760,7 @@ solutions = [
|
|
|
|
|
entries file hasn't been created yet.
|
|
|
|
|
"""
|
|
|
|
|
scope = {}
|
|
|
|
|
filename = os.path.join(self.root_dir(), self._options.entries_filename)
|
|
|
|
|
filename = os.path.join(self.root_dir, self._options.entries_filename)
|
|
|
|
|
if not os.path.exists(filename):
|
|
|
|
|
return {}
|
|
|
|
|
try:
|
|
|
|
@ -842,11 +838,11 @@ solutions = [
|
|
|
|
|
continue
|
|
|
|
|
# Fix path separator on Windows.
|
|
|
|
|
entry_fixed = entry.replace('/', os.path.sep)
|
|
|
|
|
e_dir = os.path.join(self.root_dir(), entry_fixed)
|
|
|
|
|
e_dir = os.path.join(self.root_dir, entry_fixed)
|
|
|
|
|
# Use entry and not entry_fixed there.
|
|
|
|
|
if entry not in entries and os.path.exists(e_dir):
|
|
|
|
|
file_list = []
|
|
|
|
|
scm = gclient_scm.CreateSCM(prev_url, self.root_dir(), entry_fixed)
|
|
|
|
|
scm = gclient_scm.CreateSCM(prev_url, self.root_dir, entry_fixed)
|
|
|
|
|
scm.status(self._options, [], file_list)
|
|
|
|
|
modified_files = file_list != []
|
|
|
|
|
if (not self._options.delete_unversioned_trees or
|
|
|
|
@ -859,7 +855,7 @@ solutions = [
|
|
|
|
|
else:
|
|
|
|
|
# Delete the entry
|
|
|
|
|
print('\n________ deleting \'%s\' in \'%s\'' % (
|
|
|
|
|
entry_fixed, self.root_dir()))
|
|
|
|
|
entry_fixed, self.root_dir))
|
|
|
|
|
gclient_utils.RemoveDirectory(e_dir)
|
|
|
|
|
# record the current list of entries for next time
|
|
|
|
|
self._SaveEntries()
|
|
|
|
@ -883,7 +879,7 @@ solutions = [
|
|
|
|
|
else:
|
|
|
|
|
original_url = dep.parsed_url
|
|
|
|
|
url, _ = gclient_utils.SplitUrlRevision(original_url)
|
|
|
|
|
scm = gclient_scm.CreateSCM(original_url, self.root_dir(), dep.name)
|
|
|
|
|
scm = gclient_scm.CreateSCM(original_url, self.root_dir, dep.name)
|
|
|
|
|
if not os.path.isdir(scm.checkout_path):
|
|
|
|
|
return None
|
|
|
|
|
return '%s@%s' % (url, scm.revinfo(self._options, [], None))
|
|
|
|
@ -931,10 +927,12 @@ solutions = [
|
|
|
|
|
"""No DEPS to parse for a .gclient file."""
|
|
|
|
|
raise gclient_utils.Error('Internal error')
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def root_dir(self):
|
|
|
|
|
"""Root directory of gclient checkout."""
|
|
|
|
|
return self._root_dir
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def enforced_os(self):
|
|
|
|
|
"""What deps_os entries that are to be parsed."""
|
|
|
|
|
return self._enforced_os
|
|
|
|
|