Improve Package Manager when check for updates // Resolve #892

This commit is contained in:
Ivan Kravets
2017-01-30 20:21:16 +02:00
parent 1d1c677c81
commit 1143012216
7 changed files with 111 additions and 100 deletions

View File

@ -14,7 +14,7 @@
import sys import sys
VERSION = (3, 3, "0a8") VERSION = (3, 3, "0a9")
__version__ = ".".join([str(s) for s in VERSION]) __version__ = ".".join([str(s) for s in VERSION])
__title__ = "platformio" __title__ = "platformio"

View File

@ -212,10 +212,11 @@ class LibraryManager(BasePkgManager):
item = v item = v
return item return item
def get_latest_repo_version(self, name, requirements): def get_latest_repo_version(self, name, requirements, silent=False):
item = self.max_satisfying_repo_version( item = self.max_satisfying_repo_version(
util.get_api_result( util.get_api_result(
"/lib/info/%d" % self.get_pkg_id_by_name(name, requirements), "/lib/info/%d" % self.get_pkg_id_by_name(
name, requirements, silent=silent),
cache_valid="1d")['versions'], cache_valid="1d")['versions'],
requirements) requirements)
return item['name'] if item else None return item['name'] if item else None

View File

@ -103,7 +103,11 @@ class PkgRepoMixin(object):
item = v item = v
return item return item
def get_latest_repo_version(self, name, requirements): def get_latest_repo_version( # pylint: disable=unused-argument
self,
name,
requirements,
silent=False):
version = None version = None
for versions in PackageRepoIterator(name, self.repositories): for versions in PackageRepoIterator(name, self.repositories):
pkgdata = self.max_satisfying_repo_version(versions, requirements) pkgdata = self.max_satisfying_repo_version(versions, requirements)
@ -193,14 +197,16 @@ class PkgInstallerMixin(object):
else: else:
pkg_dir = dirname(pkg_dir) pkg_dir = dirname(pkg_dir)
is_vcs_pkg = False
if isfile(path) and path.endswith(self.VCS_MANIFEST_NAME): if isfile(path) and path.endswith(self.VCS_MANIFEST_NAME):
is_vcs_pkg = True
pkg_dir = dirname(dirname(path)) pkg_dir = dirname(dirname(path))
# return from cache # return from cache
if self.package_dir in PkgInstallerMixin._INSTALLED_CACHE: if self.package_dir in PkgInstallerMixin._INSTALLED_CACHE:
for manifest in PkgInstallerMixin._INSTALLED_CACHE[self. for manifest in PkgInstallerMixin._INSTALLED_CACHE[self.
package_dir]: package_dir]:
if manifest['__pkg_dir'] == pkg_dir: if not is_vcs_pkg and manifest['__pkg_dir'] == pkg_dir:
return manifest return manifest
manifest = {} manifest = {}
@ -491,8 +497,14 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
package_dir = self.get_package_dir(name, requirements, url) package_dir = self.get_package_dir(name, requirements, url)
if not package_dir: if not package_dir:
return None return None
manifest = self.load_manifest(package_dir) is_vcs_pkg = False
if self.get_vcs_manifest_path(package_dir): manifest_path = self.get_vcs_manifest_path(package_dir)
if manifest_path:
is_vcs_pkg = True
manifest = self.load_manifest(manifest_path)
else:
manifest = self.load_manifest(package_dir)
if is_vcs_pkg:
vcs = VCSClientFactory.newClient( vcs = VCSClientFactory.newClient(
package_dir, manifest['url'], silent=True) package_dir, manifest['url'], silent=True)
if not vcs.can_be_updated: if not vcs.can_be_updated:
@ -500,7 +512,8 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
latest = vcs.get_latest_revision() latest = vcs.get_latest_revision()
else: else:
try: try:
latest = self.get_latest_repo_version(name, requirements) latest = self.get_latest_repo_version(
name, requirements, silent=True)
except (exception.PlatformioException, ValueError): except (exception.PlatformioException, ValueError):
return None return None
if not latest: if not latest:

View File

@ -116,6 +116,14 @@ class GitClient(VCSClientBase):
output = output.replace("*", "") # fix active branch output = output.replace("*", "") # fix active branch
return [b.strip() for b in output.split("\n")] return [b.strip() for b in output.split("\n")]
def get_current_branch(self):
output = self.get_cmd_output(["branch"])
for line in output.split("\n"):
line = line.strip()
if line.startswith("*"):
return line[1:].strip()
return None
def get_tags(self): def get_tags(self):
output = self.get_cmd_output(["tag", "-l"]) output = self.get_cmd_output(["tag", "-l"])
return [t.strip() for t in output.split("\n")] return [t.strip() for t in output.split("\n")]
@ -151,11 +159,12 @@ class GitClient(VCSClientBase):
def get_latest_revision(self): def get_latest_revision(self):
if not self.can_be_updated: if not self.can_be_updated:
return self.get_latest_revision() return self.get_latest_revision()
branch = self.get_current_branch()
result = self.get_cmd_output(["ls-remote"]) result = self.get_cmd_output(["ls-remote"])
for line in result.split("\n"): for line in result.split("\n"):
line = line.strip() ref_pos = line.strip().find("refs/heads/" + branch)
if "HEAD" in line: if ref_pos > 0:
return line.split("HEAD", 1)[0].strip()[:7] return line[:ref_pos].strip()[:7]
return None return None

View File

@ -100,10 +100,21 @@ def test_global_lib_list(clirunner, validate_cliresult, isolated_pio_home):
assert set(items1) == set(items2) assert set(items1) == set(items2)
def test_global_lib_update_check(clirunner, validate_cliresult,
isolated_pio_home):
result = clirunner.invoke(
cmd_lib, ["-g", "update", "--only-check", "--json-output"])
validate_cliresult(result)
output = json.loads(result.output)
assert set(["PJON", "RadioHead"]) == set([l['name'] for l in output])
def test_global_lib_update(clirunner, validate_cliresult, isolated_pio_home): def test_global_lib_update(clirunner, validate_cliresult, isolated_pio_home):
result = clirunner.invoke(cmd_lib, ["-g", "update"]) result = clirunner.invoke(cmd_lib, ["-g", "update"])
validate_cliresult(result) validate_cliresult(result)
assert all([s in result.output for s in ("[Up-to-date]", "[VCS]")]) assert "[Up-to-date]" in result.output
assert re.search(r"Updating PJON\s+@ 1fb26fd\s+\[[a-z\d]{7}\]",
result.output)
def test_global_lib_uninstall(clirunner, validate_cliresult, def test_global_lib_uninstall(clirunner, validate_cliresult,
@ -124,9 +135,8 @@ def test_global_lib_uninstall(clirunner, validate_cliresult,
def test_lib_show(clirunner, validate_cliresult, isolated_pio_home): def test_lib_show(clirunner, validate_cliresult, isolated_pio_home):
result = clirunner.invoke(cmd_lib, ["show", "64"]) result = clirunner.invoke(cmd_lib, ["show", "64"])
validate_cliresult(result) validate_cliresult(result)
assert all([ assert all(
s in result.output for s in ("ArduinoJson", "Arduino", "Atmel AVR") [s in result.output for s in ("ArduinoJson", "Arduino", "Atmel AVR")])
])
result = clirunner.invoke(cmd_lib, ["show", "OneWire"]) result = clirunner.invoke(cmd_lib, ["show", "OneWire"])
validate_cliresult(result) validate_cliresult(result)
assert "OneWire" in result.output assert "OneWire" in result.output

View File

@ -13,30 +13,12 @@
# limitations under the License. # limitations under the License.
import json import json
import os
from os.path import join
from platformio import exception, util from platformio import exception
from platformio.commands import platform as cli_platform from platformio.commands import platform as cli_platform
def test_list_json_output(clirunner, validate_cliresult): def test_search_json_output(clirunner, validate_cliresult, isolated_pio_home):
result = clirunner.invoke(cli_platform.platform_list, ["--json-output"])
validate_cliresult(result)
list_result = json.loads(result.output)
assert isinstance(list_result, list)
assert len(list_result)
platforms = [item['name'] for item in list_result]
assert "titiva" in platforms
def test_list_raw_output(clirunner, validate_cliresult):
result = clirunner.invoke(cli_platform.platform_list)
validate_cliresult(result)
assert "teensy" in result.output
def test_search_json_output(clirunner, validate_cliresult):
result = clirunner.invoke(cli_platform.platform_search, result = clirunner.invoke(cli_platform.platform_search,
["arduino", "--json-output"]) ["arduino", "--json-output"])
validate_cliresult(result) validate_cliresult(result)
@ -47,82 +29,75 @@ def test_search_json_output(clirunner, validate_cliresult):
assert "atmelsam" in platforms assert "atmelsam" in platforms
def test_search_raw_output(clirunner, validate_cliresult): def test_search_raw_output(clirunner, validate_cliresult, isolated_pio_home):
result = clirunner.invoke(cli_platform.platform_search, ["arduino"]) result = clirunner.invoke(cli_platform.platform_search, ["arduino"])
validate_cliresult(result) validate_cliresult(result)
assert "teensy" in result.output assert "teensy" in result.output
def test_install_uknown_from_registry(clirunner, validate_cliresult): def test_install_unknown_version(clirunner, validate_cliresult,
result = clirunner.invoke(cli_platform.platform_install, isolated_pio_home):
["uknown-platform"])
assert result.exit_code == -1
assert isinstance(result.exception, exception.UnknownPackage)
def test_install_from_vcs(clirunner, validate_cliresult):
result = clirunner.invoke(cli_platform.platform_install, [
"https://github.com/platformio/"
"platform-espressif8266.git#feature/stage"
])
validate_cliresult(result)
assert "espressif8266_stage" in result.output
def test_install_uknown_version(clirunner, validate_cliresult):
result = clirunner.invoke(cli_platform.platform_install, result = clirunner.invoke(cli_platform.platform_install,
["atmelavr@99.99.99"]) ["atmelavr@99.99.99"])
assert result.exit_code == -1 assert result.exit_code == -1
assert isinstance(result.exception, exception.UndefinedPackageVersion) assert isinstance(result.exception, exception.UndefinedPackageVersion)
def test_complex(clirunner, validate_cliresult): def test_install_unknown_from_registry(clirunner, validate_cliresult,
with clirunner.isolated_filesystem(): isolated_pio_home):
os.environ["PLATFORMIO_HOME_DIR"] = os.getcwd() result = clirunner.invoke(cli_platform.platform_install,
try: ["unknown-platform"])
result = clirunner.invoke( assert result.exit_code == -1
cli_platform.platform_install, assert isinstance(result.exception, exception.UnknownPackage)
["teensy", "--with-package", "framework-arduinoteensy"])
validate_cliresult(result)
assert all([
s in result.output
for s in ("teensy", "Downloading", "Unpacking")
])
# show platform information
result = clirunner.invoke(cli_platform.platform_show, ["teensy"])
validate_cliresult(result)
assert "teensy" in result.output
# list platforms def test_install_known_version(clirunner, validate_cliresult,
result = clirunner.invoke(cli_platform.platform_list, isolated_pio_home):
["--json-output"]) result = clirunner.invoke(cli_platform.platform_install,
validate_cliresult(result) ["atmelavr@1.1.0", "--skip-default-package"])
list_result = json.loads(result.output) validate_cliresult(result)
assert isinstance(list_result, list) assert "atmelavr @ 1.1.0" in result.output
assert len(list_result) == 1
assert list_result[0]["name"] == "teensy"
assert list_result[0]["packages"] == ["framework-arduinoteensy"]
# try to install again
result = clirunner.invoke(cli_platform.platform_install,
["teensy"])
validate_cliresult(result)
assert "is already installed" in result.output
# try to update def test_install_from_vcs(clirunner, validate_cliresult, isolated_pio_home):
for _ in range(2): result = clirunner.invoke(cli_platform.platform_install, [
result = clirunner.invoke(cli_platform.platform_update) "https://github.com/platformio/"
validate_cliresult(result) "platform-espressif8266.git#feature/stage", "--skip-default-package"
assert "teensy" in result.output ])
assert "Up-to-date" in result.output validate_cliresult(result)
assert "Out-of-date" not in result.output assert "espressif8266_stage" in result.output
# try to uninstall
result = clirunner.invoke(cli_platform.platform_uninstall, def test_list_json_output(clirunner, validate_cliresult, isolated_pio_home):
["teensy"]) result = clirunner.invoke(cli_platform.platform_list, ["--json-output"])
validate_cliresult(result) validate_cliresult(result)
for folder in ("platforms", "packages"): list_result = json.loads(result.output)
assert len(os.listdir(join(util.get_home_dir(), folder))) == 0 assert isinstance(list_result, list)
finally: assert len(list_result)
del os.environ["PLATFORMIO_HOME_DIR"] platforms = [item['name'] for item in list_result]
assert set(["atmelavr", "espressif8266_stage"]) == set(platforms)
def test_list_raw_output(clirunner, validate_cliresult, isolated_pio_home):
result = clirunner.invoke(cli_platform.platform_list)
validate_cliresult(result)
assert all(
[s in result.output for s in ("atmelavr", "espressif8266_stage")])
def test_update_check(clirunner, validate_cliresult, isolated_pio_home):
result = clirunner.invoke(cli_platform.platform_update,
["--only-check", "--json-output"])
validate_cliresult(result)
output = json.loads(result.output)
assert len(output) == 1
assert output[0]['name'] == "atmelavr"
def test_uninstall(clirunner, validate_cliresult, isolated_pio_home):
result = clirunner.invoke(cli_platform.platform_uninstall,
["atmelavr", "espressif8266_stage"])
validate_cliresult(result)
assert len(
[d.basename
for d in isolated_pio_home.join("platforms").listdir()]) == 0

View File

@ -13,6 +13,7 @@
# limitations under the License. # limitations under the License.
import json import json
import re
from time import time from time import time
from platformio import app, maintenance from platformio import app, maintenance
@ -135,7 +136,8 @@ def test_check_and_update_libraries(clirunner, validate_cliresult,
assert ("There are the new updates for libraries (ArduinoJson)" in assert ("There are the new updates for libraries (ArduinoJson)" in
result.output) result.output)
assert "Please wait while updating libraries" in result.output assert "Please wait while updating libraries" in result.output
assert "[Out-of-date]" in result.output assert re.search(r"Updating ArduinoJson\s+@ 5.6.7\s+\[[\d\.]+\]",
result.output)
# check updated version # check updated version
result = clirunner.invoke(cli_pio, ["lib", "-g", "list", "--json-output"]) result = clirunner.invoke(cli_pio, ["lib", "-g", "list", "--json-output"])
@ -188,7 +190,8 @@ def test_check_and_update_platforms(clirunner, validate_cliresult,
validate_cliresult(result) validate_cliresult(result)
assert "There are the new updates for platforms (native)" in result.output assert "There are the new updates for platforms (native)" in result.output
assert "Please wait while updating platforms" in result.output assert "Please wait while updating platforms" in result.output
assert "[Out-of-date]" in result.output assert re.search(r"Updating native\s+@ 0.0.0\s+\[[\d\.]+\]",
result.output)
# check updated version # check updated version
result = clirunner.invoke(cli_pio, ["platform", "list", "--json-output"]) result = clirunner.invoke(cli_pio, ["platform", "list", "--json-output"])