1"""Main entry point for dvc CLI."""
2
3from __future__ import unicode_literals
4
5import dvc.logger as logger
6from dvc.cli import parse_args
7from dvc.command.base import CmdBase
8from dvc.analytics import Analytics
9from dvc.exceptions import NotDvcRepoError, DvcParserError
10
11
12def main(argv=None):
13    """Run dvc CLI command.
14
15    Args:
16        argv: optional list of arguments to parse. sys.argv is used by default.
17
18    Returns:
19        int: command's return code.
20    """
21    args = None
22    cmd = None
23    try:
24        args = parse_args(argv)
25
26        # Init loglevel early in case we'll run
27        # into errors before setting it properly
28        CmdBase.set_loglevel(args)
29
30        cmd = args.func(args)
31
32        ret = cmd.run_cmd()
33    except KeyboardInterrupt:
34        logger.error("interrupted by the user")
35        ret = 252
36    except NotDvcRepoError:
37        logger.error()
38        ret = 253
39    except DvcParserError:
40        ret = 254
41    except Exception:  # pylint: disable=broad-except
42        logger.error("unexpected error")
43        ret = 255
44
45    Analytics().send_cmd(cmd, args, ret)
46
47    return ret
48