aboutsummaryrefslogtreecommitdiffstats
path: root/becommands/target.py
blob: cc67df94a0a1ac4784bf8b76f5748dea045a0ad1 (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
# Copyright (C) 2005 Aaron Bentley and Panometrics, Inc.
# <abentley@panoramicfeedback.com>
#
#    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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
"""Show or change a bug's target for fixing"""
from libbe import cmdutil, bugdir, settings_object
__desc__ = __doc__

def execute(args, test=False):
    """
    >>> import os
    >>> bd = bugdir.simple_bug_dir()
    >>> os.chdir(bd.root)
    >>> execute(["a"], test=True)
    No target assigned.
    >>> execute(["a", "tomorrow"], test=True)
    >>> execute(["a"], test=True)
    tomorrow
    >>> execute(["list"], test=True)
    tomorrow
    >>> execute(["a", "none"], test=True)
    >>> execute(["a"], test=True)
    No target assigned.
    """
    parser = get_parser()
    options, args = parser.parse_args(args)
    cmdutil.default_complete(options, args, parser,
                             bugid_args={0: lambda bug : bug.active==True})
    if len(args) not in (1, 2):
        raise cmdutil.UsageError
    bd = bugdir.BugDir(from_disk=True, manipulate_encodings=not test)
    if len(args) == 1 and args[0] == "list":
        ts = set([bd.bug_from_uuid(bug).target for bug in bd.list_uuids()])
        for target in sorted(ts):
            if target and isinstance(target, str):
                print target
        return
    bug = bd.bug_from_shortname(args[0])
    if len(args) == 1:
        if bug.target is None or bug.target is settings_object.EMPTY:
            print "No target assigned."
        else:
            print bug.target
    else:
        assert len(args) == 2
        if args[1] == "none":
            bug.target = None
        else:
            bug.target = args[1]
        bd.save()

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

longhelp="""
Show or change a bug's target for fixing.  

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

Targets are freeform; any text may be specified.  They will generally be
milestone names or release numbers.

The value "none" can be used to unset the target.

"list" can be used in place of a bug-ID to show all existing targets.
"""

def help():
    return get_parser().help_str() + longhelp