#!/usr/bin/env python
# Copyright (c) 2016 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.
"""Script to extract edits from clang tool output.

If a clang tool emits edits, then the edits should look like this:
    ...
    ==== BEGIN EDITS ====
    <edit1>
    <edit2>
    ...
    ==== END EDITS ====
    ...

extract_edits.py takes input that is concatenated from multiple tool invocations
and extract just the edits.  In other words, given the following input:
    ...
    ==== BEGIN EDITS ====
    <edit1>
    <edit2>
    ==== END EDITS ====
    ...
    ==== BEGIN EDITS ====
    <yet another edit1>
    <yet another edit2>
    ==== END EDITS ====
    ...
extract_edits.py would emit the following output:
    <edit1>
    <edit2>
    <yet another edit1>
    <yet another edit2>

This python script is mainly needed on Windows.
On unix this script can be replaced with running sed as follows:

    $ cat run_tool.debug.out \
        | sed '/^==== BEGIN EDITS ====$/,/^==== END EDITS ====$/{//!b};d'
        | sort | uniq
"""


import sys


def main():
  # TODO(dcheng): extract_edits.py should normalize paths. Doing this in
  # apply_edits.py is too late, as a common use case is to apply edits from many
  # different platforms.
  unique_lines = set()
  inside_marker_lines = False
  for line in sys.stdin:
    line = line.rstrip("\n\r")
    if line == '==== BEGIN EDITS ====':
      inside_marker_lines = True
      continue
    if line == '==== END EDITS ====':
      inside_marker_lines = False
      continue
    if inside_marker_lines and line not in unique_lines:
      unique_lines.add(line)
      print line
  return 0


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