# 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
import multiprocessing

from color import Coloring
from command import DEFAULT_LOCAL_JOBS, PagedCommand, WORKER_BATCH_SIZE


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(results):
      return list(itertools.chain.from_iterable(results))

    # NB: Multiprocessing is heavy, so don't spin it up for one job.
    if len(projects) == 1 or opt.jobs == 1:
      all_branches = _ProcessResults(self._ExecuteOne(x) for x in projects)
    else:
      with multiprocessing.Pool(opt.jobs) as pool:
        results = pool.imap(
            self._ExecuteOne, projects,
            chunksize=WORKER_BATCH_SIZE)
        all_branches = _ProcessResults(results)

    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))
