#!/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.
""" Generate a Fuchsia repo capable of serving Fuchsia archives over the
network.
"""
import argparse
import collections
import json
import os
import subprocess
import sys


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

  parser.add_argument('--pm-bin', dest='pm_bin', action='store', required=True)
  parser.add_argument(
      '--repo-dir', dest='repo_dir', action='store', required=True)
  parser.add_argument(
      '--archive', dest='archives', action='append', required=True)

  args = parser.parse_args()

  assert os.path.exists(args.pm_bin)

  if not os.path.exists(args.repo_dir):
    pm_newrepo_command = [args.pm_bin, 'newrepo', '-repo', args.repo_dir]
    subprocess.check_call(pm_newrepo_command)

  pm_publish_command = [
      args.pm_bin,
      'publish',
      '-C',  # Remove all previous registrations.
      '-a',  # Publish archives from an archive (mode).
      '-repo',
      args.repo_dir
  ]

  for archive in args.archives:
    pm_publish_command.append('-f')
    pm_publish_command.append(archive)

  subprocess.check_call(pm_publish_command)

  return 0


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