aboutsummaryrefslogtreecommitdiffstats
path: root/becommands/status.py
blob: bf66c2649f61b30c1d9765f08acc1a349633fc9d (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 (C) 2008-2009 Gianluca Montecchi <gian@grys.it>
#                         W. Trevor King <wking@drexel.edu>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
"""Show or change a bug's status"""
from libbe import cmdutil, bugdir, bug
__desc__ = __doc__

def execute(args, manipulate_encodings=True):
    """
    >>> import os
    >>> bd = bugdir.SimpleBugDir()
    >>> os.chdir(bd.root)
    >>> execute(["a"], manipulate_encodings=False)
    open
    >>> execute(["a", "closed"], manipulate_encodings=False)
    >>> execute(["a"], manipulate_encodings=False)
    closed
    >>> execute(["a", "none"], manipulate_encodings=False)
    Traceback (most recent call last):
    UserError: Invalid status: none
    >>> bd.cleanup()
    """
    parser = get_parser()
    options, args = parser.parse_args(args)
    complete(options, args, parser)
    if len(args) not in (1,2):
        raise cmdutil.UsageError
    bd = bugdir.BugDir(from_disk=True,
                       manipulate_encodings=manipulate_encodings)
    bug = cmdutil.bug_from_id(bd, args[0])
    if len(args) == 1:
        print bug.status
    else:
        try:
            bug.status = args[1]
        except ValueError, e:
            if e.name != "status":
                raise
            raise cmdutil.UserError ("Invalid status: %s" % e.value)

def get_parser():
    parser = cmdutil.CmdOptionParser("be status BUG-ID [STATUS]")
    return parser


def help():
    try: # See if there are any per-tree status configurations
        bd = bugdir.BugDir(from_disk=True,
                           manipulate_encodings=False)
    except bugdir.NoBugDir, e:
        pass # No tree, just show the defaults
    longest_status_len = max([len(s) for s in bug.status_values])
    active_statuses = []
    for status in bug.active_status_values :
        description = bug.status_description[status]
        s = "%*s : %s" % (longest_status_len, status, description)
        active_statuses.append(s)
    inactive_statuses = []
    for status in bug.inactive_status_values :
        description = bug.status_description[status]
        s = "%*s : %s" % (longest_status_len, status, description)
        inactive_statuses.append(s)
    longhelp="""
Show or change a bug's status.

If no status is specified, the current value is printed.  If a status
is specified, it will be assigned to the bug.

There are two classes of statuses, active and inactive, which are only
important for commands like "be list" that show only active bugs by
default.

Active status levels are:
  %s
Inactive status levels are:
  %s

You can overide the list of allowed statuses on a per-repository basis.
See "be set --help" for more details.
""" % ('\n  '.join(active_statuses), '\n  '.join(inactive_statuses))
    return get_parser().help_str() + longhelp

def complete(options, args, parser):
    for option,value in cmdutil.option_value_pairs(options, parser):
        if value == "--complete":
            # no argument-options at the moment, so this is future-proofing
            raise cmdutil.GetCompletions()
    for pos,value in enumerate(args):
        if value == "--complete":
            try: # See if there are any per-tree status configurations
                bd = bugdir.BugDir(from_disk=True,
                                   manipulate_encodings=False)
            except bugdir.NoBugDir:
                bd = None
            if pos == 0: # fist positional argument is a bug id 
                ids = []
                if bd != None:
                    bd.load_all_bugs()
                    ids = [bd.bug_shortname(bg) for bg in bd]
                raise cmdutil.GetCompletions(ids)
            elif pos == 1: # second positional argument is a status
                raise cmdutil.GetCompletions(bug.status_values)
            raise cmdutil.GetCompletions()