lin
2025-07-30 fcd736bf35fd93b563e9bbf594f2aa7b62028cc9
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
from distutils.errors import DistutilsOptionError
 
from setuptools.extern.six.moves import map
 
from setuptools.command.setopt import edit_config, option_base, config_file
 
 
def shquote(arg):
    """Quote an argument for later parsing by shlex.split()"""
    for c in '"', "'", "\\", "#":
        if c in arg:
            return repr(arg)
    if arg.split() != [arg]:
        return repr(arg)
    return arg
 
 
class alias(option_base):
    """Define a shortcut that invokes one or more commands"""
 
    description = "define a shortcut to invoke one or more commands"
    command_consumes_arguments = True
 
    user_options = [
        ('remove', 'r', 'remove (unset) the alias'),
    ] + option_base.user_options
 
    boolean_options = option_base.boolean_options + ['remove']
 
    def initialize_options(self):
        option_base.initialize_options(self)
        self.args = None
        self.remove = None
 
    def finalize_options(self):
        option_base.finalize_options(self)
        if self.remove and len(self.args) != 1:
            raise DistutilsOptionError(
                "Must specify exactly one argument (the alias name) when "
                "using --remove"
            )
 
    def run(self):
        aliases = self.distribution.get_option_dict('aliases')
 
        if not self.args:
            print("Command Aliases")
            print("---------------")
            for alias in aliases:
                print("setup.py alias", format_alias(alias, aliases))
            return
 
        elif len(self.args) == 1:
            alias, = self.args
            if self.remove:
                command = None
            elif alias in aliases:
                print("setup.py alias", format_alias(alias, aliases))
                return
            else:
                print("No alias definition found for %r" % alias)
                return
        else:
            alias = self.args[0]
            command = ' '.join(map(shquote, self.args[1:]))
 
        edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run)
 
 
def format_alias(name, aliases):
    source, command = aliases[name]
    if source == config_file('global'):
        source = '--global-config '
    elif source == config_file('user'):
        source = '--user-config '
    elif source == config_file('local'):
        source = ''
    else:
        source = '--filename=%r' % source
    return source + name + ' ' + command