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)
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
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())