#!/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():
  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())
