aboutsummaryrefslogtreecommitdiffstats
path: root/libbe/command/set.py
blob: ac580d91f954438ca2f53080bc66a8f251e0340c (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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# Copyright (C) 2005-2010 Aaron Bentley <abentley@panoramicfeedback.com>
#                         Gianluca Montecchi <gian@grys.it>
#                         Marien Zwart <marien.zwart@gmail.com>
#                         Thomas Gerigk <tgerigk@gmx.de>
#                         W. Trevor King <wking@drexel.edu>
#
# This file is part of Bugs Everywhere.
#
# Bugs Everywhere 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.
#
# Bugs Everywhere 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 Bugs Everywhere.  If not, see <http://www.gnu.org/licenses/>.


import textwrap

import libbe
import libbe.bugdir
import libbe.command
import libbe.command.util
from libbe.storage.util.settings_object import EMPTY


class Set (libbe.command.Command):
    """Change bug directory settings

    >>> import sys
    >>> import libbe.bugdir
    >>> bd = libbe.bugdir.SimpleBugDir(memory=False)
    >>> io = libbe.command.StringInputOutput()
    >>> io.stdout = sys.stdout
    >>> ui = libbe.command.UserInterface(io=io)
    >>> ui.storage_callbacks.set_storage(bd.storage)
    >>> cmd = Set(ui=ui)

    >>> ret = ui.run(cmd, args=['target'])
    None
    >>> ret = ui.run(cmd, args=['target', 'abcdefg'])
    >>> ret = ui.run(cmd, args=['target'])
    abcdefg
    >>> ret = ui.run(cmd, args=['target', 'none'])
    >>> ret = ui.run(cmd, args=['target'])
    None
    >>> ui.cleanup()
    >>> bd.cleanup()
    """
    name = 'set'

    def __init__(self, *args, **kwargs):
        libbe.command.Command.__init__(self, *args, **kwargs)
        self.args.extend([
                libbe.command.Argument(
                    name='setting', metavar='SETTING', optional=True,
                    completion_callback=complete_bugdir_settings),
                libbe.command.Argument(
                    name='value', metavar='VALUE', optional=True)
                ])

    def _run(self, **params):
        bugdir = self._get_bugdir()
        if params['setting'] == None:
            keys = bugdir.settings_properties
            keys.sort()
            for key in keys:
                print >> self.stdout, \
                    '%16s: %s' % (key, _value_string(bugdir, key))
            return 0
        if params['setting'] not in bugdir.settings_properties:
            msg = 'Invalid setting %s\n' % params['setting']
            msg += 'Allowed settings:\n  '
            msg += '\n  '.join(bugdir.settings_properties)
            raise libbe.command.UserError(msg)
        if params['value'] == None:
            print _value_string(bugdir, params['setting'])
        else:
            if params['value'] == 'none':
                params['value'] = EMPTY
            old_setting = bugdir.settings.get(params['setting'])
            attr = bugdir._setting_name_to_attr_name(params['setting'])
            setattr(bugdir, attr, params['value'])
        return 0

    def _long_help(self):
        return """
Show or change per-tree settings.

If name and value are supplied, the name is set to a new value.
If no value is specified, the current value is printed.
If no arguments are provided, all names and values are listed.

To unset a setting, set it to "none".

Allowed settings are:

%s""" % ('\n'.join(get_bugdir_settings()),)

def get_bugdir_settings():
    settings = []
    for s in libbe.bugdir.BugDir.settings_properties:
        settings.append(s)
    settings.sort()
    documented_settings = []
    for s in settings:
        set = getattr(libbe.bugdir.BugDir, s)
        dstr = set.__doc__.strip()
        # per-setting comment adjustments
        if s == 'vcs_name':
            lines = dstr.split('\n')
            while lines[0].startswith('This property defaults to') == False:
                lines.pop(0)
            assert len(lines) != None, \
                'Unexpected vcs_name docstring:\n  "%s"' % dstr
            lines.insert(
                0, 'The name of the revision control system to use.\n')
            dstr = '\n'.join(lines)
        doc = textwrap.wrap(dstr, width=70, initial_indent='  ',
                            subsequent_indent='  ')
        documented_settings.append('%s\n%s' % (s, '\n'.join(doc)))
    return documented_settings

def _value_string(bugdir, setting):
    val = bugdir.settings.get(setting, EMPTY)
    if val == EMPTY:
        default = getattr(bugdir, bugdir._setting_name_to_attr_name(setting))
        if default not in [None, EMPTY]:
            val = 'None (%s)' % default
        else:
            val = None
    return str(val)

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

    Neither the command nor argument arguments are used.
    """
    return libbe.bugdir.BugDir.settings_properties