bash.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import borgmatic.commands.arguments
  2. import borgmatic.commands.completion.actions
  3. def parser_flags(parser):
  4. '''
  5. Given an argparse.ArgumentParser instance, return its argument flags in a space-separated
  6. string.
  7. '''
  8. return ' '.join(option for action in parser._actions for option in action.option_strings)
  9. def bash_completion():
  10. '''
  11. Return a bash completion script for the borgmatic command. Produce this by introspecting
  12. borgmatic's command-line argument parsers.
  13. '''
  14. (
  15. unused_global_parser,
  16. action_parsers,
  17. global_plus_action_parser,
  18. ) = borgmatic.commands.arguments.make_parsers()
  19. global_flags = parser_flags(global_plus_action_parser)
  20. # Avert your eyes.
  21. return '\n'.join(
  22. (
  23. 'check_version() {',
  24. ' local this_script="$(cat "$BASH_SOURCE" 2> /dev/null)"',
  25. ' local installed_script="$(borgmatic --bash-completion 2> /dev/null)"',
  26. ' if [ "$this_script" != "$installed_script" ] && [ "$installed_script" != "" ];'
  27. f''' then cat << EOF\n{borgmatic.commands.completion.actions.upgrade_message(
  28. 'bash',
  29. 'sudo sh -c "borgmatic --bash-completion > $BASH_SOURCE"',
  30. '$BASH_SOURCE',
  31. )}\nEOF''',
  32. ' fi',
  33. '}',
  34. 'complete_borgmatic() {',
  35. )
  36. + tuple(
  37. ''' if [[ " ${COMP_WORDS[*]} " =~ " %s " ]]; then
  38. COMPREPLY=($(compgen -W "%s %s %s" -- "${COMP_WORDS[COMP_CWORD]}"))
  39. return 0
  40. fi'''
  41. % (
  42. action,
  43. parser_flags(action_parser),
  44. ' '.join(
  45. borgmatic.commands.completion.actions.available_actions(action_parsers, action)
  46. ),
  47. global_flags,
  48. )
  49. for action, action_parser in reversed(action_parsers.choices.items())
  50. )
  51. + (
  52. ' COMPREPLY=($(compgen -W "%s %s" -- "${COMP_WORDS[COMP_CWORD]}"))' # noqa: FS003
  53. % (
  54. ' '.join(borgmatic.commands.completion.actions.available_actions(action_parsers)),
  55. global_flags,
  56. ),
  57. ' (check_version &)',
  58. '}',
  59. '\ncomplete -o bashdefault -o default -F complete_borgmatic borgmatic',
  60. )
  61. )