Commit 22013468 by Sébastien Eustace

Fix update with locked extras

parent 06a2bd17
...@@ -423,11 +423,19 @@ class VersionSolver: ...@@ -423,11 +423,19 @@ class VersionSolver:
self._incompatibilities[term.dependency.name].append(incompatibility) self._incompatibilities[term.dependency.name].append(incompatibility)
def _get_locked(self, package_name): # type: (str) -> Union[Any, None] def _get_locked(self, package_name): # type: (str) -> Union[Package, None]
if package_name in self._use_latest: if package_name in self._use_latest:
return return
return self._locked.get(package_name) locked = self._locked.get(package_name)
if not locked:
return
for dep in self._root.all_requires:
if dep.name == locked.name:
locked.requires_extras = dep.extras
return locked
def _log(self, text): def _log(self, text):
self._provider.debug(text, self._solution.attempted_solutions) self._provider.debug(text, self._solution.attempted_solutions)
...@@ -275,7 +275,6 @@ class Provider: ...@@ -275,7 +275,6 @@ class Provider:
won't return incompatibilities that have already been returned by a won't return incompatibilities that have already been returned by a
previous call to _incompatibilities_for(). previous call to _incompatibilities_for().
""" """
# TODO: Check python versions
if package.source_type in ['git', 'file', 'directory']: if package.source_type in ['git', 'file', 'directory']:
dependencies = package.requires dependencies = package.requires
elif package.is_root(): elif package.is_root():
......
...@@ -18,8 +18,19 @@ class Repository(BaseRepository): ...@@ -18,8 +18,19 @@ class Repository(BaseRepository):
def package(self, name, version, extras=None): def package(self, name, version, extras=None):
name = name.lower() name = name.lower()
if extras is None:
extras = []
for package in self.packages: for package in self.packages:
if name == package.name and package.version.text == version: if name == package.name and package.version.text == version:
# Activate extra dependencies
for extra in extras:
if extra in package.extras:
for extra_dep in package.extras[extra]:
for dep in package.requires:
if dep.name == extra_dep.lower():
dep.activate()
return package return package
def find_packages(self, name, constraint=None, def find_packages(self, name, constraint=None,
......
[[package]]
name = "A"
version = "1.0"
description = ""
category = "main"
optional = false
python-versions = "*"
platform = "*"
[package.dependencies]
"B" = "^1.0"
"C" = "^1.0"
[[package]]
name = "B"
version = "1.0"
description = ""
category = "main"
optional = false
python-versions = "*"
platform = "*"
[[package]]
name = "C"
version = "1.1"
description = ""
category = "main"
optional = false
python-versions = "*"
platform = "*"
[package.requirements]
python = "~2.7"
[[package]]
name = "D"
version = "1.1"
description = ""
category = "main"
optional = false
python-versions = "*"
platform = "*"
[metadata]
python-versions = "*"
platform = "*"
content-hash = "123456789"
[metadata.hashes]
"A" = []
"B" = []
"C" = []
"D" = []
...@@ -685,3 +685,75 @@ def test_run_update_all_with_lock(installer, locker, repo, package): ...@@ -685,3 +685,75 @@ def test_run_update_all_with_lock(installer, locker, repo, package):
expected = fixture('update-with-lock') expected = fixture('update-with-lock')
assert locker.written_data == expected assert locker.written_data == expected
def test_run_update_with_locked_extras(installer, locker, repo, package):
locker.locked(True)
locker.mock_lock_data({
'package': [{
'name': 'A',
'version': '1.0',
'category': 'main',
'optional': False,
'platform': '*',
'python-versions': '*',
'checksum': [],
'dependencies': {
'B': '^1.0',
'C': '^1.0',
}
}, {
'name': 'B',
'version': '1.0',
'category': 'dev',
'optional': False,
'platform': '*',
'python-versions': '*',
'checksum': []
}, {
'name': 'C',
'version': '1.1',
'category': 'dev',
'optional': False,
'platform': '*',
'python-versions': '*',
'checksum': [],
'requirements': {
'python': '~2.7'
}
}],
'metadata': {
'python-versions': '*',
'platform': '*',
'content-hash': '123456789',
'hashes': {
'A': [],
'B': [],
'C': [],
}
}
})
package_a = get_package('A', '1.0')
package_a.extras['foo'] = ['B']
b_dependency = get_dependency('B', '^1.0', optional=True)
b_dependency.in_extras.append('foo')
c_dependency = get_dependency('C', '^1.0')
c_dependency.python_versions = '~2.7'
package_a.requires.append(b_dependency)
package_a.requires.append(c_dependency)
repo.add_package(package_a)
repo.add_package(get_package('B', '1.0'))
repo.add_package(get_package('C', '1.1'))
repo.add_package(get_package('D', '1.1'))
package.add_dependency('A', {'version': '^1.0', 'extras': ['foo']})
package.add_dependency('D', '^1.0')
installer.update(True)
installer.whitelist('D')
installer.run()
expected = fixture('update-with-locked-extras')
assert locker.written_data == expected
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment