# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Utility class to build the Skia master BuildFactory's for HouseKeeping bots.

Overrides SkiaFactory with Per-commit HouseKeeping steps."""


import builder_name_schema
import os
import tempfile

from buildbot.process.properties import WithProperties
from config_private import AUTOGEN_SVN_BASEURL
from skia_master_scripts import factory as skia_factory


# TODO: The HouseKeepingPerCommitFactory uses shell scripts, so it would break
# on Windows. For now, we reply on the fact that the housekeeping bot always
# runs on a Linux machine.
class HouseKeepingPerCommitFactory(skia_factory.SkiaFactory):
  """Overrides for HouseKeeping per-commit builds."""
  def __init__(self, **kwargs):
    skia_factory.SkiaFactory.__init__(self, build_targets=['tools', 'gm'],
                                      **kwargs)

  def Build(self, role=builder_name_schema.BUILDER_ROLE_HOUSEKEEPER,
            clobber=None):
    """Build and return the complete BuildFactory.

    role: string; type of builder.
    clobber: boolean indicating whether we should clean before building
    """
    if role != builder_name_schema.BUILDER_ROLE_HOUSEKEEPER:
      raise Exception('Housekeeping builders must have role "%s"' %
                      builder_name_schema.BUILDER_ROLE_HOUSEKEEPER)

    self.UpdateSteps()
    self.Compile(clobber)

    # TODO(borenet): Move these to a self-tests bot (http://skbug.com/2144)
    # Build tools and run their unittests.
    self._skia_cmd_obj.AddRunCommand(
        command=self.TargetPath.join('tools', 'tests', 'run.sh'),
        description='RunToolSelfTests')

    # Build GM and run its unittests.
    self._skia_cmd_obj.AddRunCommand(
        command=self.TargetPath.join('gm', 'tests', 'run.sh'),
        description='RunGmSelfTests')

    # Run unittests for Anroid platform_tools
    self._skia_cmd_obj.AddRunCommand(
        command=['python', self.TargetPath.join('platform_tools', 'android',
                                                'tests', 'run_all.py')],
        description='RunAndroidPlatformSelfTests')

    # Check for static initializers.
    self.AddSlaveScript(script='detect_static_initializers.py',
                        description='DetectStaticInitializers')

    if not self._do_patch_step:  # Do not run Pydoc & Doxygen steps if try job.
      # Generate and upload Buildbot Pydoc documentation.
      buildbot_pydoc_actual_svn_baseurl = '%s/%s' % (AUTOGEN_SVN_BASEURL,
                                                     'buildbot-docs')
      # pylint: disable=W0212
      update_buildbot_pydoc_path = self.TargetPath.join(
          self._skia_cmd_obj._local_slave_script_dir,
          'update-buildbot-pydoc.sh')
      buildbot_pydoc_working_dir = self.TargetPath.join(
          tempfile.gettempdir(), 'buildbot-docs')
      # Cleanup the previous (if any) buildbot pydoc working dir.
      self._skia_cmd_obj.AddRunCommand(
          command='rm -rf %s' % buildbot_pydoc_working_dir,
          description='CleanupBuildbotPydoc')
      # Generate Buildbot Pydoc documentation.
      self._skia_cmd_obj.AddRunCommand(
          command='BUILDBOT_PYDOC_TEMPDIR=%s bash %s' % (
              buildbot_pydoc_working_dir, update_buildbot_pydoc_path),
          description='UpdateBuildbotPydoc')
      if self._do_upload_results:
        # Upload Buildbot Pydoc.
        self._skia_cmd_obj.AddMergeIntoSvn(
            source_dir_path=self.TargetPath.join(
                buildbot_pydoc_working_dir, 'buildbot-docs'),
            dest_svn_url=buildbot_pydoc_actual_svn_baseurl,
            merge_dir_path=os.path.join(buildbot_pydoc_working_dir, 'merge'),
            svn_username_file=self._autogen_svn_username_file,
            svn_password_file=self._autogen_svn_password_file,
            commit_message=WithProperties(
                'UploadBuildbotPydoc of r%%(%s:-)s on %s' % (
                    'revision', self._builder_name)),
            description='UploadBuildbotPydoc')

      # Generate and upload Doxygen documentation.
      doxygen_actual_svn_baseurl = '%s/%s' % (AUTOGEN_SVN_BASEURL, 'docs')
      update_doxygen_path = self.TargetPath.join('tools', 'update-doxygen.sh')
      doxygen_working_dir = self.TargetPath.join(
          tempfile.gettempdir(), 'doxygen')
      # Cleanup the previous (if any) doxygen working dir.
      self._skia_cmd_obj.AddRunCommand(
          command='rm -rf %s' % doxygen_working_dir,
          description='CleanupDoxygen')
      # Generate Doxygen documentation.
      self._skia_cmd_obj.AddRunCommand(
          command='DOXYGEN_TEMPDIR=%s DOXYGEN_COMMIT=false bash %s' % (
              doxygen_working_dir, update_doxygen_path),
          description='UpdateDoxygen')
      if self._do_upload_results:
        # Upload Doxygen.
        self._skia_cmd_obj.AddMergeIntoSvn(
            source_dir_path=self.TargetPath.join(
                doxygen_working_dir, 'docs'),
            dest_svn_url=doxygen_actual_svn_baseurl,
            merge_dir_path=os.path.join(doxygen_working_dir, 'merge'),
            svn_username_file=self._autogen_svn_username_file,
            svn_password_file=self._autogen_svn_password_file,
            commit_message=WithProperties(
                'UploadDoxygen of r%%(%s:-)s on %s' % (
                    'revision', self._builder_name)),
            description='UploadDoxygen')

    self._skia_cmd_obj.AddRunCommand(
        command='python run_unittests', description='BuildbotSelfTests',
        workdir=self.TargetPath.join(os.pardir, os.pardir, os.pardir,
                                     os.pardir))

    self.AddSlaveScript(script='check_compile_times.py',
                        description='CheckCompileTimes')
    self.Validate()
    return self
