class GHI::Commands::Milestone

Attributes

edit[RW]
reverse[RW]
web[RW]

Public Instance Methods

execute() click to toggle source
# File lib/ghi/commands/milestone.rb, line 82
def execute
  self.action = 'index'
  require_repo
  extract_milestone

  begin
    options.parse! args
  rescue OptionParser::AmbiguousOption => e
    fallback.parse! e.args
  end

  milestone and case action
    when 'create' then self.action = 'update'
    when 'index'  then self.action = 'show'
  end

  if reverse
    assigns[:sort] ||= 'created'
    assigns[:direction] = 'asc'
  end

  case action
  when 'index'
    if web
      Web.new(repo).open 'milestones', assigns
    else
      assigns[:per_page] = 100
      state = assigns[:state] || 'open'
      print format_state state, "# #{repo} #{state} milestones"
      print "\n" unless paginate?
      res = throb(0, format_state(state, '#')) { api.get uri, assigns }
      page do
        milestones = res.body
        if verbose
          puts milestones.map { |m| format_milestone m }
        else
          puts format_milestones(milestones)
        end
        break unless res.next_page
        res = throb { api.get res.next_page }
      end
    end
  when 'show'
    if web
      List.execute %W(-w -M #{milestone} -- #{repo})
    else
      m = throb { api.get uri }.body
      page do
        puts format_milestone(m)
        puts 'Issues:'
        args.unshift(*%W(-q -M #{milestone} -- #{repo}))
        args.unshift '-v' if verbose
        List.execute args
        break
      end
    end
  when 'create'
    if web
      Web.new(repo).open 'issues/milestones/new'
    else
      if assigns[:title].nil?
        e = Editor.new 'GHI_MILESTONE'
        message = e.gets format_milestone_editor
        e.unlink 'Empty milestone.' if message.nil? || message.empty?
        assigns[:title], assigns[:description] = message.split(/\n+/, 2)
      end
      m = throb { api.post uri, assigns }.body
      puts 'Milestone #%d created.' % m['number']
      e.unlink if e
    end
  when 'update'
    if web
      Web.new(repo).open "issues/milestones/#{milestone}/edit"
    else
      if edit || assigns.empty?
        m = throb { api.get "/repos/#{repo}/milestones/#{milestone}" }.body
        e = Editor.new "GHI_MILESTONE_#{milestone}"
        message = e.gets format_milestone_editor(m)
        e.unlink 'Empty milestone.' if message.nil? || message.empty?
        assigns[:title], assigns[:description] = message.split(/\n+/, 2)
      end
      if assigns[:title] && m
        t_match = assigns[:title].strip == m['title'].strip
        if assigns[:description]
          b_match = assigns[:description].strip == m['description'].strip
        end
        if t_match && b_match
          e.unlink if e
          abort 'No change.' if assigns.dup.delete_if { |k, v|
            [:title, :description].include? k
          }
        end
      end
      m = throb { api.patch uri, assigns }.body
      puts format_milestone(m)
      puts 'Updated.'
      e.unlink if e
    end
  when 'destroy'
    require_milestone
    throb { api.delete uri }
    puts 'Milestone deleted.'
  end
end
options() click to toggle source
# File lib/ghi/commands/milestone.rb, line 17
      def options
        OptionParser.new do |opts|
          opts.banner = <<EOF
usage: ghi milestone [<modification options>] [<milestoneno>]
   or: ghi milestone -D <milestoneno>
   or: ghi milestone -l [-c] [-v]
EOF
          opts.separator ''
          opts.on '-l', '--list', 'list milestones' do
            self.action = 'index'
          end
          opts.on '-c', '--[no-]closed', 'show closed milestones' do |closed|
            assigns[:state] = closed ? 'closed' : 'open'
          end
          opts.on(
            '-S', '--sort <on>', %w(due_date completeness),
            {'d'=>'due_date', 'due'=>'due_date', 'c'=>'completeness'},
            "'due_date' or 'completeness'"
          ) do |sort|
            assigns[:sort] = sort
          end
          opts.on '--reverse', 'reverse (ascending) sort order' do
            self.reverse = !reverse
          end
          opts.on '-v', '--verbose', 'list milestones verbosely' do
            self.verbose = true
          end
          opts.on('-w', '--web') { self.web = true }
          opts.separator ''
          opts.separator 'Milestone modification options'
          opts.on(
            '-m', '--message [<text>]', 'change milestone description'
          ) do |text|
            self.action = 'create'
            self.edit = true
            next unless text
            assigns[:title], assigns[:description] = text.split(/\n+/, 2)
          end
          # FIXME: We already describe --[no-]closed; describe this, too?
          opts.on(
            '-s', '--state <in>', %w(open closed),
            {'o'=>'open', 'c'=>'closed'}, "'open' or 'closed'"
          ) do |state|
            self.action = 'create'
            assigns[:state] = state
          end
          opts.on(
            '--due <on>', 'when milestone should be complete',
            "e.g., '2012-04-30'"
          ) do |date|
            self.action = 'create'
            begin
              # TODO: Better parsing.
              assigns[:due_on] = DateTime.parse(date).strftime
            rescue ArgumentError => e
              raise OptionParser::InvalidArgument, e.message
            end
          end
          opts.on '-D', '--delete', 'delete milestone' do
            self.action = 'destroy'
          end
          opts.separator ''
        end
      end

Private Instance Methods

fallback() click to toggle source
# File lib/ghi/commands/milestone.rb, line 197
def fallback
  OptionParser.new do |opts|
    opts.on '-d' do
      self.action = 'destroy'
    end
  end
end
uri() click to toggle source
# File lib/ghi/commands/milestone.rb, line 189
def uri
  if milestone
    "/repos/#{repo}/milestones/#{milestone}"
  else
    "/repos/#{repo}/milestones"
  end
end