module GHI

Constants

ALIASES

Attributes

v[RW]
v?[RW]

Public Class Methods

config(key, options = {}) click to toggle source
# File lib/ghi.rb, line 112
def config key, options = {}
  upcase = options.fetch :upcase, true
  flags = options[:flags]
  var = key.gsub('core', 'git').gsub '.', '_'
  var.upcase! if upcase
  value = ENV[var] || `git config #{flags} #{key}`
  value = `#{value[1..-1]}` if value.start_with? '!'
  value = value.chomp
  value unless value.empty?
end
execute(args) click to toggle source
# File lib/ghi.rb, line 12
    def execute args
      STDOUT.sync = true

      double_dash = args.index { |arg| arg == '--' }
      if index = args.index { |arg| arg !~ /^-/ }
        if double_dash.nil? || index < double_dash
          command_name = args.delete_at index
          command_args = args.slice! index, args.length
        end
      end
      command_args ||= []

      option_parser = OptionParser.new do |opts|
        opts.banner = <<EOF
usage: ghi [--version] [-p|--paginate|--no-pager] [--help] <command> [<args>]
           [ -- [<user>/]<repo>]
EOF
        opts.on('--version') { command_name = 'version' }
        opts.on '-p', '--paginate', '--[no-]pager' do |paginate|
          GHI::Formatting.paginate = paginate
        end
        opts.on '--help' do
          command_args.unshift(*args)
          command_args.unshift command_name if command_name
          args.clear
          command_name = 'help'
        end
        opts.on '--[no-]color' do |colorize|
          Formatting::Colors.colorize = colorize
        end
        opts.on '-l' do
          if command_name
            raise OptionParser::InvalidOption
          else
            command_name = 'list'
          end
        end
        opts.on '-v' do
          command_name ? self.v = true : command_name = 'version'
        end
        opts.on('-V') { command_name = 'version' }
      end

      begin
        option_parser.parse! args
      rescue OptionParser::InvalidOption => e
        warn e.message.capitalize
        abort option_parser.banner
      end

      if command_name.nil?
        command_name = 'list'
      end

      if command_name == 'help'
        Commands::Help.execute command_args, option_parser.banner
      else
        command_name = fetch_alias command_name, command_args
        begin
          command = Commands.const_get command_name.capitalize
        rescue NameError
          abort "ghi: '#{command_name}' is not a ghi command. See 'ghi --help'."
        end

        # Post-command help option parsing.
        Commands::Help.execute [command_name] if command_args.first == '--help'

        begin
          command.execute command_args
        rescue OptionParser::ParseError, Commands::MissingArgument => e
          warn "#{e.message.capitalize}\n"
          abort command.new([]).options.to_s
        rescue Client::Error => e
          if e.response.is_a?(Net::HTTPNotFound) && Authorization.token.nil?
            raise Authorization::Required
          else
            abort e.message
          end
        rescue SocketError => e
          abort "Couldn't find internet."
        rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT => e
          abort "Couldn't find GitHub."
        end
      end
    rescue Authorization::Required => e
      retry if Authorization.authorize!
      warn e.message
      if Authorization.token
        warn <<EOF.chomp

Not authorized for this action with your token. To regenerate a new token:
EOF
      end
      warn <<EOF

Please run 'ghi config --auth <username>'
EOF
      exit 1
    end

Private Class Methods

fetch_alias(command, args) click to toggle source
# File lib/ghi.rb, line 149
def fetch_alias command, args
  return command unless fetched = ALIASES[command]

  # If the <command> is an issue number, check the options to see if an
  # edit or show is desired.
  if fetched.first =~ /^\d+$/
    edit_options = Commands::Edit.new([]).options.top.list
    edit_options.reject! { |arg| !arg.is_a?(OptionParser::Switch) }
    edit_options.map! { |arg| [arg.short, arg.long] }
    edit_options.flatten!
    fetched.unshift((edit_options & args).empty? ? 'show' : 'edit')
  end

  command = fetched.shift
  args.unshift(*fetched)
  command
end