#!/usr/bin/env python
#
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
""" Copies paths, creates if they do not exist.
"""

import argparse
import errno
import json
import os
import platform
import shutil
import subprocess
import sys


def EnsureParentExists(path):
  dir_name, _ = os.path.split(path)
  if not os.path.exists(dir_name):
    os.makedirs(dir_name)


def SameStat(s1, s2):
  return s1.st_ino == s2.st_ino and s1.st_dev == s2.st_dev


def SameFile(f1, f2):
  if not os.path.exists(f2):
    return False
  s1 = os.stat(f1)
  s2 = os.stat(f2)
  return SameStat(s1, s2)


def CopyPath(src, dst):
  try:
    EnsureParentExists(dst)
    shutil.copytree(src, dst)
  except OSError as exc:
    if exc.errno == errno.ENOTDIR:
      if not SameFile(src, dst):
        shutil.copyfile(src, dst)
    else:
      raise


def main():
  parser = argparse.ArgumentParser()

  parser.add_argument(
      '--file-list', dest='file_list', action='store', required=True)

  args = parser.parse_args()

  files = open(args.file_list, 'r')
  files_to_copy = files.read().split()
  num_files = len(files_to_copy) / 2

  for i in range(num_files):
    CopyPath(files_to_copy[i], files_to_copy[num_files + i])

  return 0


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