lib/gitlab/shell.rb in gitlab-3.2.0 vs lib/gitlab/shell.rb in gitlab-3.3.0
- old
+ new
@@ -1,26 +1,42 @@
require 'gitlab'
require 'gitlab/help'
require 'gitlab/cli_helpers'
+require 'gitlab/shell_history'
require 'readline'
+require 'shellwords'
class Gitlab::Shell
extend Gitlab::CLI::Helpers
+ # Start gitlab shell and run infinite loop waiting for user input
def self.start
+ history.load
actions = Gitlab.actions
comp = proc { |s| actions.map(&:to_s).grep(/^#{Regexp.escape(s)}/) }
Readline.completion_proc = comp
Readline.completion_append_character = ' '
client = Gitlab::Client.new(endpoint: '')
- while buf = Readline.readline("gitlab> ", true)
+ while buf = Readline.readline('gitlab> ')
+ trap('INT') { quit_shell } # capture ctrl-c
+
next if buf.nil? || buf.empty?
- buf = buf.split.map(&:chomp)
+ quit_shell if buf == 'exit'
+
+ history << buf
+
+ begin
+ buf = Shellwords.shellwords(buf)
+ rescue ArgumentError => e
+ puts e.message
+ next
+ end
+
cmd = buf.shift
args = buf.count > 0 ? buf : []
if cmd == 'help'
methods = []
@@ -30,20 +46,42 @@
name: action.to_s,
owner: client.method(action).owner.to_s
}
end
- args[0].nil? ? Gitlab::Help.get_help(methods) : Gitlab::Help.get_help(methods, args[0])
+ args[0].nil? ? Gitlab::Help.get_help(methods) :
+ Gitlab::Help.get_help(methods, args[0])
next
end
+ syntax_errors = false
+
+ begin
+ yaml_load_and_symbolize_hash!(args)
+ rescue
+ syntax_errors = true
+ end
+
+ # errors have been displayed, return to the prompt
+ next if syntax_errors
+
data = if actions.include?(cmd.to_sym)
confirm_command(cmd)
gitlab_helper(cmd, args)
else
- "'#{cmd}' is not a valid command. See the 'help' for a list of valid commands."
+ "'#{cmd}' is not a valid command. " +
+ "See the 'help' for a list of valid commands."
end
output_table(cmd, args, data)
end
+ end
+
+ def self.quit_shell
+ history.save
+ exit
+ end
+
+ def self.history
+ @history ||= History.new
end
end