summaryrefslogtreecommitdiff
path: root/gitlab/cli.py
blob: f23fff9d3e00eff0cdf925a42a97d83f06ab9775 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2013-2017 Gauvain Pocentek <gauvain@pocentek.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

from __future__ import print_function
from __future__ import absolute_import
import argparse
import importlib
import re
import sys

import gitlab.config

camel_re = re.compile('(.)([A-Z])')


def die(msg, e=None):
    if e:
        msg = "%s (%s)" % (msg, e)
    sys.stderr.write(msg + "\n")
    sys.exit(1)


def what_to_cls(what):
    return "".join([s.capitalize() for s in what.split("-")])


def cls_to_what(cls):
    return camel_re.sub(r'\1-\2', cls.__name__).lower()


def _get_base_parser():
    parser = argparse.ArgumentParser(
        description="GitLab API Command Line Interface")
    parser.add_argument("--version", help="Display the version.",
                        action="store_true")
    parser.add_argument("-v", "--verbose", "--fancy",
                        help="Verbose mode",
                        action="store_true")
    parser.add_argument("-c", "--config-file", action='append',
                        help=("Configuration file to use. Can be used "
                              "multiple times."))
    parser.add_argument("-g", "--gitlab",
                        help=("Which configuration section should "
                              "be used. If not defined, the default selection "
                              "will be used."),
                        required=False)

    return parser


def _get_parser(cli_module):
    parser = _get_base_parser()
    return cli_module.extend_parser(parser)


def main():
    if "--version" in sys.argv:
        print(gitlab.__version__)
        exit(0)

    parser = _get_base_parser()
    (options, args) = parser.parse_known_args(sys.argv)

    config = gitlab.config.GitlabConfigParser(options.gitlab,
                                              options.config_file)
    cli_module = importlib.import_module('gitlab.v%s.cli' % config.api_version)
    parser = _get_parser(cli_module)
    args = parser.parse_args(sys.argv[1:])
    config_files = args.config_file
    gitlab_id = args.gitlab
    verbose = args.verbose
    action = args.action
    what = args.what

    args = args.__dict__
    # Remove CLI behavior-related args
    for item in ('gitlab', 'config_file', 'verbose', 'what', 'action',
                 'version'):
        args.pop(item)
    args = {k: v for k, v in args.items() if v is not None}

    try:
        gl = gitlab.Gitlab.from_config(gitlab_id, config_files)
        gl.auth()
    except Exception as e:
        die(str(e))

    cli_module.run(gl, what, action, args, verbose)

    sys.exit(0)