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

DEPS = [
  'recipe_engine/context',
  'recipe_engine/file',
  'recipe_engine/path',
  'recipe_engine/platform',
  'recipe_engine/step',
  'tar',
]


def RunSteps(api):
  # Ensure that tar binary is installed.
  api.tar.ensure_tar()

  # Ensuring again should have no effect.
  api.tar.ensure_tar()

  # Prepare files.
  temp = api.path.mkdtemp('tar-example')
  api.step('touch a', ['touch', temp.join('a')])
  api.step('touch b', ['touch', temp.join('b')])
  api.file.ensure_directory('mkdirs', temp.join('sub', 'dir'))
  api.step('touch c', ['touch', temp.join('sub', 'dir', 'c')])

  # Build a tar file.
  archive = api.tar.create(temp.join('more.tar.gz'), compression='gzip')
  archive.add(temp.join('a'), temp)
  with api.context(cwd=temp):
    archive.add(temp.join('b'))
  archive.add(temp.join('sub', 'dir', 'c'), temp.join('sub'))
  archive.tar('taring more')

  # Coverage for 'output' property.
  api.step('report', ['echo', archive.path])

  # Extract the archive into a directory stripping one path component.
  api.tar.extract('untaring', temp.join('output.tar'),
                  directory=temp.join('output'), strip_components=1)
  # List untarped content.
  with api.context(cwd=temp.join('output')):
    api.step('listing', ['find'])
  # Clean up.
  api.file.rmtree('rmtree %s' % temp, temp)


def GenTests(api):
  for platform in ('linux', 'mac'):
    yield api.test(platform) + api.platform.name(platform)
