#!/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)')
    print('Clobber because of libc++ issue - take 6 (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())
