#!/usr/bin/env python3
#
# 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())
