alias.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from distutils.errors import DistutilsOptionError
  2. from setuptools.command.setopt import edit_config, option_base, config_file
  3. def shquote(arg):
  4. """Quote an argument for later parsing by shlex.split()"""
  5. for c in '"', "'", "\\", "#":
  6. if c in arg: return repr(arg)
  7. if arg.split() != [arg]:
  8. return repr(arg)
  9. return arg
  10. class alias(option_base):
  11. """Define a shortcut that invokes one or more commands"""
  12. description = "define a shortcut to invoke one or more commands"
  13. command_consumes_arguments = True
  14. user_options = [
  15. ('remove', 'r', 'remove (unset) the alias'),
  16. ] + option_base.user_options
  17. boolean_options = option_base.boolean_options + ['remove']
  18. def initialize_options(self):
  19. option_base.initialize_options(self)
  20. self.args = None
  21. self.remove = None
  22. def finalize_options(self):
  23. option_base.finalize_options(self)
  24. if self.remove and len(self.args) != 1:
  25. raise DistutilsOptionError(
  26. "Must specify exactly one argument (the alias name) when "
  27. "using --remove"
  28. )
  29. def run(self):
  30. aliases = self.distribution.get_option_dict('aliases')
  31. if not self.args:
  32. print("Command Aliases")
  33. print("---------------")
  34. for alias in aliases:
  35. print("setup.py alias", format_alias(alias, aliases))
  36. return
  37. elif len(self.args)==1:
  38. alias, = self.args
  39. if self.remove:
  40. command = None
  41. elif alias in aliases:
  42. print("setup.py alias", format_alias(alias, aliases))
  43. return
  44. else:
  45. print("No alias definition found for %r" % alias)
  46. return
  47. else:
  48. alias = self.args[0]
  49. command = ' '.join(map(shquote,self.args[1:]))
  50. edit_config(self.filename, {'aliases': {alias:command}}, self.dry_run)
  51. def format_alias(name, aliases):
  52. source, command = aliases[name]
  53. if source == config_file('global'):
  54. source = '--global-config '
  55. elif source == config_file('user'):
  56. source = '--user-config '
  57. elif source == config_file('local'):
  58. source = ''
  59. else:
  60. source = '--filename=%r' % source
  61. return source+name+' '+command