aboutsummaryrefslogtreecommitdiffstats
path: root/libbe/command/util.py
blob: 439559286d8b8b1b8bfbd7527fd783f8b2345003 (plain) (blame)
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
106
107
108
109
110
111
112
113
114
115
116
# Copyright

import glob
import os.path

import libbe
import libbe.command

class Completer (object):
    def __init__(self, options):
        self.options = options
    def __call__(self, bugdir, fragment=None):
        return [fragment]

def complete_command(command, argument, fragment=None):
    """
    List possible command completions for fragment.

    command argument is not used.
    """
    return list(libbe.command.commands())

def complete_path(command, argument, fragment=None):
    """
    List possible path completions for fragment.

    command argument is not used.
    """
    if fragment == None:
        fragment = '.'
    comps = glob.glob(fragment+'*') + glob.glob(fragment+'/*')
    if len(comps) == 1 and os.path.isdir(comps[0]):
        comps.extend(glob.glob(comps[0]+'/*'))
    return comps
    
def complete_status(command, argument, fragment=None):
    return [fragment]
def complete_severity(command, argument, fragment=None):
    return [fragment]
def complete_assigned(command, argument, fragment=None):
    return [fragment]
def complete_extra_strings(command, argument, fragment=None):
    return [fragment]
def complete_bug_id(command, argument, fragment=None):
    return [fragment]
def complete_bug_comment_id(command, argument, fragment=None):
    return [fragment]

def select_values(string, possible_values, name="unkown"):
    """
    This function allows the user to select values from a list of
    possible values.  The default is to select all the values:

    >>> select_values(None, ['abc', 'def', 'hij'])
    ['abc', 'def', 'hij']

    The user selects values with a comma-separated limit_string.
    Prepending a minus sign to such a list denotes blacklist mode:

    >>> select_values('-abc,hij', ['abc', 'def', 'hij'])
    ['def']

    Without the leading -, the selection is in whitelist mode:

    >>> select_values('abc,hij', ['abc', 'def', 'hij'])
    ['abc', 'hij']

    In either case, appropriate errors are raised if on of the
    user-values is not in the list of possible values.  The name
    parameter lets you make the error message more clear:

    >>> select_values('-xyz,hij', ['abc', 'def', 'hij'], name="foobar")
    Traceback (most recent call last):
      ...
    UserError: Invalid foobar xyz
      ['abc', 'def', 'hij']
    >>> select_values('xyz,hij', ['abc', 'def', 'hij'], name="foobar")
    Traceback (most recent call last):
      ...
    UserError: Invalid foobar xyz
      ['abc', 'def', 'hij']
    """
    possible_values = list(possible_values) # don't alter the original
    if string == None:
        pass
    elif string.startswith('-'):
        blacklisted_values = set(string[1:].split(','))
        for value in blacklisted_values:
            if value not in possible_values:
                raise UserError('Invalid %s %s\n  %s'
                                % (name, value, possible_values))
            possible_values.remove(value)
    else:
        whitelisted_values = string.split(',')
        for value in whitelisted_values:
            if value not in possible_values:
                raise UserError('Invalid %s %s\n  %s'
                                % (name, value, possible_values))
        possible_values = whitelisted_values
    return possible_values

def bug_comment_from_user_id(bugdir, id):
    p = libbe.util.id.parse_user(bugdir, id)
    if not p['type'] in ['bug', 'comment']:
        raise libbe.command.UserError(
            '%s is a %s id, not a bug or comment id' % (id, p['type']))
    if p['bugdir'] != bugdir.uuid:
        raise libbe.command.UserError(
            "%s doesn't belong to this bugdir (%s)"
            % (id, bugdir.uuid))
    bug = bugdir.bug_from_uuid(p['bug'])
    if 'comment' in p:
        comment = bug.comment_from_uuid(p['comment'])
    else:
        comment = bug.comment_root
    return (bug, comment)