#!/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


# pylint: disable=line-too-long
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)')
        print('Clobber because b/367066321')
    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())
