# Copyright 2022 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.

# Module containing utility functions for building and testing
# monorepo checkouts combining Dart and Flutter

from recipe_engine import recipe_api


class MonorepoApi(recipe_api.RecipeApi):
  """Provides utilities to work with monorepo checkouts."""

  @property
  def is_monorepo(self):
    return self.is_monorepo_ci_build or self.is_monorepo_try_build

  @property
  def is_monorepo_ci_build(self):
    commit = self.m.buildbucket.build.input.gitiles_commit
    return commit.project == 'monorepo'

  @property
  def is_monorepo_try_build(self):
    input = self.m.buildbucket.build.input
    return (
        not input.gitiles_commit.project and input.gerrit_changes and
        input.gerrit_changes[0].host == 'dart-review.googlesource.com' and
        input.gerrit_changes[0].project == 'sdk'
    )

  @property
  def build_identifier(self):
    """Creates a unique identifier to use as an upload path for artifacts.

    If this is a subbuild spawned by an engine_v2 coordinator, use
    the try_build_identifier input property passed to this build by the
    coordinator.

    There is no commit hash usable for this, because a Gerrit try job
    patches the monorepo HEAD with an uncommitted patch from the Gerrit CL.
    The flutter framework's bin/internal/engine.version can be any string,
    and will be used to construct the download path for engine artifacts.

    Args:
      none

    Returns:
      The buildbucket id of the engine_v2/engine_v2 coordinator build or
      the build_identifer input property passed to this build.
    """
    parent_identifier = self.m.properties.get('build_identifier')
    if (parent_identifier):
      return str(parent_identifier)
    buildbucket_id = self.m.buildbucket.build.id
    if buildbucket_id:
      self.m.step.empty('get buildbucket id', step_text=str(buildbucket_id))
    else:
      self.m.step.empty(
          'get buildbucket id',
          status='INFRA_FAILURE',
          step_text='Try job has no buildbucket id'
      )
    return str(buildbucket_id)
