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


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