# Downloads dill files from CIPD for each supported ABI version.

import os
import subprocess
import sys
import utils


def procWait(p):
  while p.returncode is None:
    p.communicate()
    p.poll()
  return p.returncode


def findAbiVersion(version):
  cmd = ['cipd', 'instances', 'dart/abiversions/%d' % version]
  p = subprocess.Popen(cmd,
                       stdout = subprocess.PIPE,
                       stderr = subprocess.PIPE,
                       shell = utils.IsWindows(),
                       cwd = utils.DART_DIR)
  return procWait(p) == 0


def downloadAbiDills(oldest_abi_version, abi_version):
  cmd = ['cipd', 'ensure', '-root', 'tools/abiversions', '-ensure-file', '-']
  ensure_file = ''
  for i in xrange(oldest_abi_version, abi_version + 1):
    ensure_file += '@Subdir %d\ndart/abiversions/%d latest\n\n' % (i, i)
  if not ensure_file:
    return 0
  p = subprocess.Popen(cmd,
                       stdin = subprocess.PIPE,
                       stdout = subprocess.PIPE,
                       stderr = subprocess.PIPE,
                       shell = utils.IsWindows(),
                       cwd = utils.DART_DIR)
  p.communicate(ensure_file)
  p.stdin.close()
  return procWait(p)


def main():
  abi_version = int(utils.GetAbiVersion())
  oldest_abi_version = int(utils.GetOldestSupportedAbiVersion())

  # The latest abi version may not have an entry in CIPD yet, so check first.
  if not findAbiVersion(abi_version):
    abi_version -= 1

  return downloadAbiDills(oldest_abi_version, abi_version)


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