# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Standalone python script to unzip an archive. Intended to be used by 'zip'
recipe module internally. Should not be used elsewhere.
"""

import json
import os
import shutil
import subprocess
import sys
import zipfile


def unzip_with_subprocess(zip_file, output, quiet):
  """Unzips an archive using 'zip' utility.

  Works only on Linux and Mac, uses system 'zip' program.

  Args:
    zip_file: absolute path to an archive to unzip.
    output: existing directory to unzip to.
    quiet (bool): If True, instruct the subprocess to unzip with
        minimal output.

  Returns:
    Exit code (0 on success).
  """
  args = ['unzip']
  if quiet:
    args += ['-q']
  args += [zip_file]

  return subprocess.call(
      args=args,
      cwd=output)


def unzip_with_python(zip_file, output):
  """Unzips an archive using 'zipfile' python module.

  Works everywhere where python works (Windows and Posix).

  Args:
    zip_file: absolute path to an archive to unzip.
    output: existing directory to unzip to.

  Returns:
    Exit code (0 on success).
  """
  with zipfile.ZipFile(zip_file) as zip_file_obj:
    for name in zip_file_obj.namelist():
      print('Extracting %s' % name)
      zip_file_obj.extract(name, output)
  return 0


def main():
  # See zip/api.py, def unzip(...) for format of |data|.
  data = json.load(sys.stdin)
  output = data['output']
  zip_file = data['zip_file']
  quiet = data['quiet']

  # Archive path should exist and be an absolute path to a file.
  assert os.path.exists(zip_file), zip_file
  assert os.path.isfile(zip_file), zip_file

  # Output path should be an absolute path, and should NOT exist.
  assert os.path.isabs(output), output
  assert not os.path.exists(output), output

  print('Unzipping %s...' % zip_file)
  exit_code = -1
  try:
    os.makedirs(output)
    if sys.platform == 'win32':
      # Used on Windows, since there's no builtin 'unzip' utility there.
      exit_code = unzip_with_python(zip_file, output)
    else:
      # On mac and linux 'unzip' utility handles symlink and file modes.
      exit_code = unzip_with_subprocess(zip_file, output, quiet)
  finally:
    # On non-zero exit code or on unexpected exception, clean up.
    if exit_code:
      shutil.rmtree(output, ignore_errors=True)
  return exit_code


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