Exemple #1
0
    def install_from_url(self, url, spec, checksum=None, silent=False):
        spec = self.ensure_spec(spec)
        tmp_dir = tempfile.mkdtemp(prefix="pkg-installing-",
                                   dir=self.get_tmp_dir())
        vcs = None
        try:
            if url.startswith("file://"):
                _url = url[7:]
                if os.path.isfile(_url):
                    self.unpack(_url, tmp_dir)
                else:
                    fs.rmtree(tmp_dir)
                    shutil.copytree(_url, tmp_dir, symlinks=True)
            elif url.startswith(("http://", "https://")):
                dl_path = self.download(url, checksum, silent=silent)
                assert os.path.isfile(dl_path)
                self.unpack(dl_path, tmp_dir)
            else:
                vcs = VCSClientFactory.new(tmp_dir, url)
                assert vcs.export()

            root_dir = self.find_pkg_root(tmp_dir, spec)
            pkg_item = PackageItem(
                root_dir,
                self.build_metadata(
                    root_dir, spec,
                    vcs.get_current_revision() if vcs else None),
            )
            pkg_item.dump_meta()
            return self._install_tmp_pkg(pkg_item)
        finally:
            if os.path.isdir(tmp_dir):
                fs.rmtree(tmp_dir)
Exemple #2
0
    def _update(self, pkg, outdated, silent=False):
        if pkg.metadata.spec.external:
            vcs = VCSClientFactory.new(pkg.path, pkg.metadata.spec.url)
            assert vcs.update()
            pkg.metadata.version = self._fetch_vcs_latest_version(pkg)
            pkg.dump_meta()
            return pkg

        new_pkg = self.install(
            PackageSpec(
                id=pkg.metadata.spec.id,
                owner=pkg.metadata.spec.owner,
                name=pkg.metadata.spec.name,
                requirements=outdated.wanted or outdated.latest,
            ),
            silent=silent,
        )
        if new_pkg:
            old_pkg = self.get_package(
                PackageSpec(
                    id=pkg.metadata.spec.id,
                    owner=pkg.metadata.spec.owner,
                    name=pkg.metadata.name,
                    requirements=pkg.metadata.version,
                )
            )
            if old_pkg:
                self.uninstall(old_pkg, silent=silent, skip_dependencies=True)
        return new_pkg
Exemple #3
0
 def _fetch_vcs_latest_version(self, pkg):
     vcs = None
     try:
         vcs = VCSClientFactory.new(pkg.path, pkg.metadata.spec.url, silent=True)
     except VCSBaseException:
         return None
     if not vcs.can_be_updated:
         return None
     return str(
         self.build_metadata(
             pkg.path, pkg.metadata.spec, vcs_revision=vcs.get_latest_revision()
         ).version
     )
def test_saving_deps(clirunner, validate_cliresult, isolated_pio_core,
                     tmpdir_factory):
    regclient = RegistryClient()
    project_dir = tmpdir_factory.mktemp("project")
    project_dir.join("platformio.ini").write("""
[env]
lib_deps = ArduinoJson

[env:one]
board = devkit

[env:two]
framework = foo
lib_deps =
    CustomLib
    ArduinoJson @ 5.10.1
""")
    result = clirunner.invoke(
        cmd_lib,
        [
            "-d",
            str(project_dir), "install", "64", "knolleary/PubSubClient@~2.7"
        ],
    )
    validate_cliresult(result)
    aj_pkg_data = regclient.get_package(PackageType.LIBRARY, "bblanchon",
                                        "ArduinoJson")
    config = ProjectConfig(os.path.join(str(project_dir), "platformio.ini"))
    assert sorted(config.get("env:one", "lib_deps")) == sorted([
        "bblanchon/ArduinoJson@^%s" % aj_pkg_data["version"]["name"],
        "knolleary/PubSubClient@~2.7",
    ])
    assert sorted(config.get("env:two", "lib_deps")) == sorted([
        "CustomLib",
        "bblanchon/ArduinoJson@^%s" % aj_pkg_data["version"]["name"],
        "knolleary/PubSubClient@~2.7",
    ])

    # ensure "build" version without NPM spec
    result = clirunner.invoke(
        cmd_lib,
        [
            "-d",
            str(project_dir), "-e", "one", "install",
            "mbed-sam-grove/LinkedList"
        ],
    )
    validate_cliresult(result)
    ll_pkg_data = regclient.get_package(PackageType.LIBRARY, "mbed-sam-grove",
                                        "LinkedList")
    config = ProjectConfig(os.path.join(str(project_dir), "platformio.ini"))
    assert sorted(config.get("env:one", "lib_deps")) == sorted([
        "bblanchon/ArduinoJson@^%s" % aj_pkg_data["version"]["name"],
        "knolleary/PubSubClient@~2.7",
        "mbed-sam-grove/LinkedList@%s" % ll_pkg_data["version"]["name"],
    ])

    # check external package via Git repo
    result = clirunner.invoke(
        cmd_lib,
        [
            "-d",
            str(project_dir),
            "-e",
            "one",
            "install",
            "https://github.com/OttoWinter/async-mqtt-client.git#v0.8.3 @ 0.8.3",
        ],
    )
    validate_cliresult(result)
    config = ProjectConfig(os.path.join(str(project_dir), "platformio.ini"))
    assert len(config.get("env:one", "lib_deps")) == 4
    assert config.get("env:one", "lib_deps")[3] == (
        "https://github.com/OttoWinter/async-mqtt-client.git#v0.8.3 @ 0.8.3")

    # test uninstalling
    # from all envs
    result = clirunner.invoke(
        cmd_lib, ["-d", str(project_dir), "uninstall", "ArduinoJson"])
    validate_cliresult(result)
    # from "one" env
    result = clirunner.invoke(
        cmd_lib,
        [
            "-d",
            str(project_dir),
            "-e",
            "one",
            "uninstall",
            "knolleary/PubSubClient@~2.7",
        ],
    )
    validate_cliresult(result)
    config = ProjectConfig(os.path.join(str(project_dir), "platformio.ini"))
    assert len(config.get("env:one", "lib_deps")) == 2
    assert len(config.get("env:two", "lib_deps")) == 2
    assert config.get("env:one", "lib_deps") == [
        "mbed-sam-grove/LinkedList@%s" % ll_pkg_data["version"]["name"],
        "https://github.com/OttoWinter/async-mqtt-client.git#v0.8.3 @ 0.8.3",
    ]
    assert config.get("env:two", "lib_deps") == [
        "CustomLib",
        "knolleary/PubSubClient@~2.7",
    ]

    # test list
    result = clirunner.invoke(cmd_lib, ["-d", str(project_dir), "list"])
    validate_cliresult(result)
    assert "Version: 0.8.3+sha." in result.stdout
    assert (
        "Source: git+https://github.com/OttoWinter/async-mqtt-client.git#v0.8.3"
        in result.stdout)
    result = clirunner.invoke(
        cmd_lib, ["-d", str(project_dir), "list", "--json-output"])
    validate_cliresult(result)
    data = {}
    for key, value in json.loads(result.stdout).items():
        data[os.path.basename(key)] = value
    ame_lib = next(item for item in data["one"]
                   if item["name"] == "AsyncMqttClient-esphome")
    ame_vcs = VCSClientFactory.new(ame_lib["__pkg_dir"], ame_lib["__src_url"])
    assert len(data["two"]) == 1
    assert data["two"][0]["name"] == "PubSubClient"
    assert "__pkg_dir" in data["one"][0]
    assert (ame_lib["__src_url"] ==
            "git+https://github.com/OttoWinter/async-mqtt-client.git#v0.8.3")
    assert ame_lib["version"] == ("0.8.3+sha.%s" %
                                  ame_vcs.get_current_revision())