# Copyright (C) 2008 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import itertools

from color import Coloring
from command import DEFAULT_LOCAL_JOBS, PagedCommand


class Prune(PagedCommand):
  common = True
  helpSummary = "Prune (delete) already merged topics"
  helpUsage = """
%prog [<project>...]
"""
  PARALLEL_JOBS = DEFAULT_LOCAL_JOBS

  def _ExecuteOne(self, project):
    """Process one project."""
    return project.PruneHeads()

  def Execute(self, opt, args):
    projects = self.GetProjects(args)

    # NB: Should be able to refactor this module to display summary as results
    # come back from children.
    def _ProcessResults(_pool, _output, results):
      return list(itertools.chain.from_iterable(results))

    all_branches = self.ExecuteInParallel(
        opt.jobs,
        self._ExecuteOne,
        projects,
        callback=_ProcessResults,
        ordered=True)

    if not all_branches:
      return

    class Report(Coloring):
      def __init__(self, config):
        Coloring.__init__(self, config, 'status')
        self.project = self.printer('header', attr='bold')

    out = Report(all_branches[0].project.config)
    out.project('Pending Branches')
    out.nl()

    project = None

    for branch in all_branches:
      if project != branch.project:
        project = branch.project
        out.nl()
        out.project('project %s/' % project.relpath)
        out.nl()

      print('%s %-33s ' % (
            branch.name == project.CurrentBranch and '*' or ' ',
            branch.name), end='')

      if not branch.base_exists:
        print('(ignoring: tracking branch is gone: %s)' % (branch.base,))
      else:
        commits = branch.commits
        date = branch.date
        print('(%2d commit%s, %s)' % (
            len(commits),
            len(commits) != 1 and 's' or ' ',
            date))
