#!/usr/bin/env python3

"""Merges sources of a Dart target and its dependencies"""

# 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.

import argparse
import json
import os
import sys


def main():
  parser = argparse.ArgumentParser(
      'Merges sources of a Dart target and its dependencies',
      fromfile_prefix_chars='@'
  )
  parser.add_argument(
      '--output',
      help='Path to output the final list',
      type=argparse.FileType('w'),
      required=True
  )
  parser.add_argument(
      '--depfile',
      help='Path to the depfile to generate',
      type=argparse.FileType('w'),
      required=True
  )
  parser.add_argument(
      '--sources',
      help='Sources of this target',
      nargs='*',
  )
  parser.add_argument(
      '--source_lists',
      help='Files containing lists of Dart sources',
      nargs='*'
  )
  args = parser.parse_args()

  args.depfile.write(
      '{}: {}\n'.format(args.output.name, ' '.join(args.source_lists))
  )

  # Merges sources of this target, and all of its dependencies.
  all_sources = set(args.sources)
  for f in args.source_lists:
    with open(f, 'r') as f:
      all_sources.update(json.load(f))
  json.dump(sorted(all_sources), args.output)


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