Files
platformio-core/platformio/commands/upgrade.py

156 lines
5.1 KiB
Python
Raw Permalink Normal View History

# Copyright (c) 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import os
import re
from zipfile import ZipFile
2014-12-03 20:16:50 +02:00
import click
2020-08-22 17:48:49 +03:00
from platformio import VERSION, __version__, app, exception
from platformio.clients.http import fetch_remote_content
from platformio.compat import WINDOWS
from platformio.proc import exec_command, get_pythonexe_path
2019-05-27 22:25:22 +03:00
from platformio.project.helpers import get_project_cache_dir
@click.command("upgrade", short_help="Upgrade PlatformIO to the latest version")
@click.option("--dev", is_flag=True, help="Use development branch")
def cli(dev):
if not dev and __version__ == get_latest_version():
2014-12-03 20:16:50 +02:00
return click.secho(
"You're up-to-date!\nPlatformIO %s is currently the "
2016-08-03 23:38:20 +03:00
"newest version available." % __version__,
fg="green",
)
click.secho("Please wait while upgrading PlatformIO ...", fg="yellow")
to_develop = dev or not all(c.isdigit() for c in __version__ if c != ".")
cmds = (
["pip", "install", "--upgrade", get_pip_package(to_develop)],
["platformio", "--version"],
)
cmd = None
2019-05-07 23:51:46 +03:00
r = {}
try:
for cmd in cmds:
cmd = [get_pythonexe_path(), "-m"] + cmd
r = exec_command(cmd)
# try pip with disabled cache
if r["returncode"] != 0 and cmd[2] == "pip":
cmd.insert(3, "--no-cache-dir")
r = exec_command(cmd)
assert r["returncode"] == 0
assert "version" in r["out"]
actual_version = r["out"].strip().split("version", 1)[1].strip()
click.secho(
"PlatformIO has been successfully upgraded to %s" % actual_version,
fg="green",
)
click.echo("Release notes: ", nl=False)
click.secho("https://docs.platformio.org/en/latest/history.html", fg="cyan")
if app.get_session_var("caller_id"):
click.secho(
"Warning! Please restart IDE to affect PIO Home changes", fg="yellow"
)
except Exception as e: # pylint: disable=broad-except
if not r:
raise exception.UpgradeError("\n".join([str(cmd), str(e)]))
permission_errors = ("permission denied", "not permitted")
if any(m in r["err"].lower() for m in permission_errors) and not WINDOWS:
click.secho(
"""
2015-09-02 13:42:01 +03:00
-----------------
Permission denied
-----------------
You need the `sudo` permission to install Python packages. Try
2015-12-07 22:44:31 +02:00
> sudo pip install -U platformio
2015-09-02 13:42:01 +03:00
WARNING! Don't use `sudo` for the rest PlatformIO commands.
2016-08-03 23:38:20 +03:00
""",
fg="yellow",
err=True,
)
raise exception.ReturnErrorCode(1)
raise exception.UpgradeError("\n".join([str(cmd), r["out"], r["err"]]))
return True
def get_pip_package(to_develop):
if not to_develop:
2018-03-04 11:29:03 +02:00
return "platformio"
dl_url = "https://github.com/platformio/platformio-core/archive/develop.zip"
2019-05-27 22:25:22 +03:00
cache_dir = get_project_cache_dir()
if not os.path.isdir(cache_dir):
os.makedirs(cache_dir)
pkg_name = os.path.join(cache_dir, "piocoredevelop.zip")
try:
with open(pkg_name, "w") as fp:
r = exec_command(
["curl", "-fsSL", dl_url], stdout=fp, universal_newlines=True
)
assert r["returncode"] == 0
# check ZIP structure
with ZipFile(pkg_name) as zp:
assert zp.testzip() is None
return pkg_name
except: # pylint: disable=bare-except
pass
return dl_url
def get_latest_version():
try:
if not str(VERSION[2]).isdigit():
try:
return get_develop_latest_version()
except: # pylint: disable=bare-except
pass
return get_pypi_latest_version()
except:
2015-09-02 13:42:01 +03:00
raise exception.GetLatestVersionError()
def get_develop_latest_version():
version = None
2020-08-22 17:48:49 +03:00
content = fetch_remote_content(
2017-03-02 17:09:22 +02:00
"https://raw.githubusercontent.com/platformio/platformio"
"/develop/platformio/__init__.py"
)
for line in content.split("\n"):
line = line.strip()
if not line.startswith("VERSION"):
continue
match = re.match(r"VERSION\s*=\s*\(([^\)]+)\)", line)
if not match:
continue
version = match.group(1)
for c in (" ", "'", '"'):
version = version.replace(c, "")
version = ".".join(version.split(","))
assert version
return version
def get_pypi_latest_version():
2020-08-22 17:48:49 +03:00
content = fetch_remote_content("https://pypi.org/pypi/platformio/json")
return json.loads(content)["info"]["version"]