#!/usr/bin/env vpython3

# Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.
"""
This file emits the list of reasons why a particular build needs to be clobbered
(or a list of 'landmines').
"""

import os
import sys

SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
CHECKOUT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir))
sys.path.insert(0, os.path.join(CHECKOUT_ROOT, 'build'))
import landmine_utils

host_os = landmine_utils.host_os  # pylint: disable=invalid-name


def print_landmines():  # pylint: disable=invalid-name
  """
  ALL LANDMINES ARE EMITTED FROM HERE.
  """
  # DO NOT add landmines as part of a regular CL. Landmines are a last-effort
  # bandaid fix if a CL that got landed has a build dependency bug and all
  # bots need to be cleaned up. If you're writing a new CL that causes build
  # dependency problems, fix the dependency problems instead of adding a
  # landmine.
  # See the Chromium version in src/build/get_landmines.py for usage examples.
  print('Clobber to remove out/{Debug,Release}/args.gn (webrtc:5070)')
  if host_os() == 'win':
    print('Clobber to resolve some issues with corrupt .pdb files on bots.')
    print('Clobber due to corrupt .pdb files (after #14623)')
    print('Clobber due to Win 64-bit Debug linking error (crbug.com/668961)')
    print('Clobber due to Win Clang Debug linking errors in '
          'https://codereview.webrtc.org/2786603002')
    print('Clobber due to Win Debug linking errors in '
          'https://codereview.webrtc.org/2832063003/')
    print('Clobber win x86 bots (issues with isolated files).')
    print('Clobber because of libc++ issue')
    print('Clobber because of libc++ issue - take 2')
    print('Clobber because of libc++ issue - take 3')
    print('Clobber because of libc++ issue - take 4 (crbug.com/1337238)')
    print('Clobber because of libc++ issue - take 5 (crbug.com/1337238)')
  if host_os() == 'mac':
    print('Clobber due to iOS compile errors (crbug.com/694721)')
    print('Clobber to unblock https://codereview.webrtc.org/2709573003')
    print('Clobber to fix https://codereview.webrtc.org/2709573003 after '
          'landing')
    print('Clobber to fix https://codereview.webrtc.org/2767383005 before'
          'landing (changing rtc_executable -> rtc_test on iOS)')
    print('Clobber to fix https://codereview.webrtc.org/2767383005 before'
          'landing (changing rtc_executable -> rtc_test on iOS)')
    print('Another landmine for low_bandwidth_audio_test (webrtc:7430)')
    print('Clobber to change neteq_rtpplay type to executable')
    print('Clobber to remove .xctest files.')
    print('Clobber to remove .xctest files (take 2).')
    print('Switching rtc_executable to rtc_test')


def main():
  print_landmines()
  return 0


if __name__ == '__main__':
  sys.exit(main())
