Files
platformio-core/platformio/__main__.py

135 lines
4.3 KiB
Python
Raw 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.
2017-04-28 01:38:25 +03:00
import os
import sys
from traceback import format_exc
import click
from platformio import __version__, exception, maintenance, util
from platformio.commands import PlatformioCLI
from platformio.compat import CYGWIN
2019-05-30 23:42:15 +03:00
@click.command(cls=PlatformioCLI,
context_settings=dict(help_option_names=["-h", "--help"]))
@click.version_option(__version__, prog_name="PlatformIO")
2019-09-23 20:51:02 +03:00
@click.option("--force", "-f", is_flag=True, help="DEPRECATE")
@click.option("--caller", "-c", help="Caller ID (service)")
@click.option("--no-ansi",
2019-05-30 23:42:15 +03:00
is_flag=True,
2019-09-23 20:51:02 +03:00
help="Do not print ANSI control characters")
@click.pass_context
2019-09-23 20:51:02 +03:00
def cli(ctx, force, caller, no_ansi):
try:
if (no_ansi or str(
os.getenv(
"PLATFORMIO_NO_ANSI",
os.getenv("PLATFORMIO_DISABLE_COLOR"))).lower() == "true"):
# pylint: disable=protected-access
click._compat.isatty = lambda stream: False
elif str(
os.getenv(
"PLATFORMIO_FORCE_ANSI",
os.getenv("PLATFORMIO_FORCE_COLOR"))).lower() == "true":
# pylint: disable=protected-access
click._compat.isatty = lambda stream: True
except: # pylint: disable=bare-except
pass
maintenance.on_platformio_start(ctx, force, caller)
@cli.resultcallback()
@click.pass_context
2019-09-23 20:51:02 +03:00
def process_result(ctx, result, *_, **__):
maintenance.on_platformio_end(ctx, result)
@util.memoized()
def configure():
if CYGWIN:
raise exception.CygwinEnvDetected()
# https://urllib3.readthedocs.org
# /en/latest/security.html#insecureplatformwarning
try:
import urllib3
urllib3.disable_warnings()
except (AttributeError, ImportError):
pass
2015-09-10 20:31:26 +03:00
# Handle IOError issue with VSCode's Terminal (Windows)
click_echo_origin = [click.echo, click.secho]
def _safe_echo(origin, *args, **kwargs):
try:
click_echo_origin[origin](*args, **kwargs)
except IOError:
2018-09-20 14:55:55 +03:00
(sys.stderr.write if kwargs.get("err") else sys.stdout.write)(
"%s\n" % (args[0] if args else ""))
click.echo = lambda *args, **kwargs: _safe_echo(0, *args, **kwargs)
click.secho = lambda *args, **kwargs: _safe_echo(1, *args, **kwargs)
def main(argv=None):
exit_code = 0
prev_sys_argv = sys.argv[:]
if argv:
assert isinstance(argv, list)
sys.argv = argv
try:
configure()
2019-09-23 20:51:02 +03:00
cli() # pylint: disable=no-value-for-parameter
except SystemExit:
pass
except Exception as e: # pylint: disable=broad-except
if not isinstance(e, exception.ReturnErrorCode):
maintenance.on_platformio_exception(e)
error_str = "Error: "
if isinstance(e, exception.PlatformioException):
error_str += str(e)
else:
error_str += format_exc()
error_str += """
2015-11-26 22:02:59 +02:00
============================================================
An unexpected error occurred. Further steps:
* Verify that you have the latest version of PlatformIO using
2015-12-18 19:58:09 +02:00
`pip install -U platformio` command
* Try to find answer in FAQ Troubleshooting section
2018-08-15 19:44:02 +03:00
https://docs.platformio.org/page/faq.html
2015-12-18 19:58:09 +02:00
2015-11-26 22:02:59 +02:00
* Report this problem to the developers
2016-12-04 18:59:07 +02:00
https://github.com/platformio/platformio-core/issues
2015-11-26 22:02:59 +02:00
============================================================
"""
click.secho(error_str, fg="red", err=True)
exit_code = int(str(e)) if str(e).isdigit() else 1
sys.argv = prev_sys_argv
return exit_code
2017-04-28 01:38:25 +03:00
def debug_gdb_main():
return main([sys.argv[0], "debug", "--interface", "gdb"] + sys.argv[1:])
2017-04-28 01:38:25 +03:00
if __name__ == "__main__":
2017-04-28 01:38:25 +03:00
sys.exit(main())