#!/usr/bin/env python3
#
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import subprocess
import utils


def patch_and_filter(dest_dir, relative_patches_dir):
  os.chdir(dest_dir)

  utils.filter_file(
      "build/landmines.py", lambda line: not "gyp_environment" in line
  )
  utils.commit("filter gyp_environment out of build/landmines.py")

  patch(dest_dir, relative_patches_dir)


def patch(dest_dir, relative_patches_dir=os.curdir):
  """Applies the *.patch files in |relative_patches_dir|.

  Args:
    relative_patches_dir: A directory path relative to the current directory.
        Defaults to the directory of this file.

  Raises:
    subprocess.CalledProcessError if the patch couldn't be applied.
  """
  patches_dir = os.path.join(
      os.path.dirname(os.path.realpath(__file__)), relative_patches_dir
  )
  assert os.path.isdir(patches_dir)

  os.chdir(dest_dir)
  for p in utils.find(["*.patch"], patches_dir):
    print("applying patch %s" % os.path.basename(p))
    try:
      utils.system(["git", "apply", p])
      utils.commit("applied patch %s" % os.path.basename(p))
    except subprocess.CalledProcessError:
      print("ERROR: patch %s failed to apply" % os.path.basename(p))
      raise
