File: bash_when.py

package info (click to toggle)
crazy-complete 0.3.6-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,404 kB
  • sloc: python: 7,949; sh: 4,636; makefile: 74
file content (57 lines) | stat: -rw-r--r-- 1,693 bytes parent folder | download | duplicates (2)
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
'''Code for creating when conditions in Bash.'''

from . import when
from . import shell


def _generate_option_is(commandline, variable_manager, obj):
    conditions = []

    for o in commandline.get_options_by_option_strings(obj.options):
        have_option = '(( ${#%s[@]} ))' % variable_manager.capture_variable(o)
        value_equals = []

        for value in obj.values:
            value_equals.append('[[ "${%s[-1]}" == %s ]]' % (
                variable_manager.capture_variable(o),
                shell.escape(value)
            ))

        if len(value_equals) == 1:
            cond = '{ %s && %s; }' % (have_option, value_equals[0])
        else:
            cond = '{ %s && { %s; } }' % (have_option, ' || '.join(value_equals))

        conditions.append(cond)

    if len(conditions) == 1:
        return conditions[0]

    return '{ %s; }' % ' || '.join(conditions)


def _generate_has_option(commandline, variable_manager, obj):
    conditions = []

    for o in commandline.get_options_by_option_strings(obj.options):
        cond = '(( ${#%s[@]} ))' % variable_manager.capture_variable(o)
        conditions.append(cond)

    if len(conditions) == 1:
        return conditions[0]

    return '{ %s; }' % ' || '.join(conditions)


def generate_when_conditions(commandline, variable_manager, when_):
    '''Generate when condition code.'''

    parsed = when.parse_when(when_)

    if isinstance(parsed, when.OptionIs):
        return _generate_option_is(commandline, variable_manager, parsed)

    if isinstance(parsed, when.HasOption):
        return _generate_has_option(commandline, variable_manager, parsed)

    raise AssertionError('invalid instance of `parse`')