fastlane/lib/fastlane/auto_complete.rb in fastlane-2.67.0 vs fastlane/lib/fastlane/auto_complete.rb in fastlane-2.68.0.beta.20171129010003

- old
+ new

@@ -1,18 +1,24 @@ require 'fileutils' module Fastlane # Enable tab auto completion class AutoComplete - def self.execute + # This method copies the tab auto completion scripts to the user's home folder, + # while optionally adding custom commands for which to enable auto complete + # @param [Array] options An array of all options (e.g. --custom fl) + def self.execute(args, options) shell = ENV['SHELL'] if shell.end_with? "fish" fish_completions_dir = "~/.config/fish/completions" - confirm = UI.confirm "This will copy a fish script into #{fish_completions_dir} that provides the command tab completion. If the directory does not exist it will be created. Sound good?" - return unless confirm + if UI.interactive? + confirm = UI.confirm "This will copy a fish script into #{fish_completions_dir} that provides the command tab completion. If the directory does not exist it will be created. Sound good?" + return unless confirm + end + fish_completions_dir = File.expand_path fish_completions_dir FileUtils.mkdir_p fish_completions_dir completion_script_path = File.join(Fastlane::ROOT, 'lib', 'assets', 'completions', 'completion.fish') final_completion_script_path = File.join(fish_completions_dir, 'fastlane.fish') @@ -20,23 +26,57 @@ FileUtils.cp completion_script_path, final_completion_script_path UI.success "Copied! You can now use tab completion for lanes" else fastlane_conf_dir = "~/.fastlane" - confirm = UI.confirm "This will copy a shell script into #{fastlane_conf_dir} that provides the command tab completion. Sound good?" - return unless confirm + if UI.interactive? + confirm = UI.confirm "This will copy a shell script into #{fastlane_conf_dir} that provides the command tab completion. Sound good?" + return unless confirm + end + # create the ~/.fastlane directory fastlane_conf_dir = File.expand_path fastlane_conf_dir FileUtils.mkdir_p fastlane_conf_dir # then copy all of the completions files into it from the gem completion_script_path = File.join(Fastlane::ROOT, 'lib', 'assets', 'completions') FileUtils.cp_r completion_script_path, fastlane_conf_dir + custom_commands = options.custom.to_s.split(',') + + Fastlane::SHELLS.each do |shell_name| + open("#{fastlane_conf_dir}/completions/completion.#{shell_name}", 'a') do |file| + default_line_prefix = Helper.bundler? ? "bundle exec " : "" + + file.puts self.get_auto_complete_line(shell_name, "#{default_line_prefix}fastlane") + + custom_commands.each do |command| + auto_complete_line = self.get_auto_complete_line(shell_name, command) + + next if auto_complete_line.nil? + + file.puts auto_complete_line + end + end + end + UI.success "Copied! To use auto complete for fastlane, add the following line to your favorite rc file (e.g. ~/.bashrc)" UI.important " . ~/.fastlane/completions/completion.sh" UI.success "Don't forget to source that file in your current shell! 🐚" end + end + + # Helper to get the auto complete register script line + def self.get_auto_complete_line(shell, command) + if shell == :bash + prefix = "complete -F" + elsif shell == :zsh + prefix = "compctl -K" + else + return nil + end + + return "#{prefix} _fastlane_complete #{command}" end end end