#!/usr/bin/env python3
# Copyright 2020 the V8 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.
"""
Compare two folders and print any differences between files to both a
results file and stderr.

Specifically we use this to compare the output of Torque generator for
both x86 and x64 (-m32) toolchains.
"""

import difflib
import filecmp
import itertools
import os
import sys

assert len(sys.argv) > 3

folder1 = sys.argv[1]
folder2 = sys.argv[2]
results_file_name = sys.argv[3]

with open(results_file_name, "w") as results_file:
  def write(line):
    # Print line to both results file and stderr
    sys.stderr.write(line)
    results_file.write(line)

  def has_one_sided_diff(dcmp, side, side_list):
    # Check that we do not have files only on one side of the comparison
    if side_list:
      write("Some files exist only in %s\n" % side)
      for fl in side_list:
        write(fl)
    return side_list

  def has_content_diff(dcmp):
    # Check that we do not have content differences in the common files
    _, diffs, _ = filecmp.cmpfiles(
          dcmp.left, dcmp.right,
          dcmp.common_files, shallow=False)
    if diffs:
      write("Found content differences between %s and %s\n" %
        (dcmp.left, dcmp.right))
      for name in diffs:
        write("File diff %s\n" % name)
        left_file = os.path.join(dcmp.left, name)
        right_file = os.path.join(dcmp.right, name)
        with open(left_file) as f1, open(right_file) as f2:
          diff = difflib.unified_diff(
              f1.readlines(), f2.readlines(),
              dcmp.left, dcmp.right)
          for l in itertools.islice(diff, 100):
            write(l)
        write("\n\n")
    return diffs

  dcmp = filecmp.dircmp(folder1, folder2)
  has_diffs = has_one_sided_diff(dcmp, dcmp.left, dcmp.left_only) \
    or has_one_sided_diff(dcmp, dcmp.right, dcmp.right_only) \
    or has_content_diff(dcmp)

if has_diffs:
  sys.exit(1)
