2 from setuptools import Command
3 from distutils.util import convert_path
4 from distutils import log
5 from distutils.errors import *
6 from setuptools.command.setopt import edit_config, option_base, config_file
9 """Quote an argument for later parsing by shlex.split()"""
10 for c in '"', "'", "\\", "#":
11 if c in arg: return repr(arg)
12 if arg.split()!=[arg]:
17 class alias(option_base):
18 """Define a shortcut that invokes one or more commands"""
20 description = "define a shortcut to invoke one or more commands"
21 command_consumes_arguments = True
24 ('remove', 'r', 'remove (unset) the alias'),
25 ] + option_base.user_options
27 boolean_options = option_base.boolean_options + ['remove']
29 def initialize_options(self):
30 option_base.initialize_options(self)
34 def finalize_options(self):
35 option_base.finalize_options(self)
36 if self.remove and len(self.args)!=1:
37 raise DistutilsOptionError(
38 "Must specify exactly one argument (the alias name) when "
43 aliases = self.distribution.get_option_dict('aliases')
46 print "Command Aliases"
47 print "---------------"
49 print "setup.py alias", format_alias(alias, aliases)
52 elif len(self.args)==1:
56 elif alias in aliases:
57 print "setup.py alias", format_alias(alias, aliases)
60 print "No alias definition found for %r" % alias
64 command = ' '.join(map(shquote,self.args[1:]))
66 edit_config(self.filename, {'aliases': {alias:command}}, self.dry_run)
69 def format_alias(name, aliases):
70 source, command = aliases[name]
71 if source == config_file('global'):
72 source = '--global-config '
73 elif source == config_file('user'):
74 source = '--user-config '
75 elif source == config_file('local'):
78 source = '--filename=%r' % source
79 return source+name+' '+command