bash.py 2.7 KB

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