#!/usr/bin/env python2.7
# Copyright 2019 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.

import argparse
import sys
import tarfile
import os


def main():
    parser = argparse.ArgumentParser('Archives a directory')
    parser.add_argument('--src',
                        help='Path to the directory to archive',
                        required=True)
    parser.add_argument('--dst',
                        help='Path to the archive',
                        required=True)
    parser.add_argument('--depfile',
                        help='Path to dependency file',
                        required=True)
    args = parser.parse_args()

    deps = []

    with tarfile.open(args.dst, "w:gz") as tar:
        for (dirpath, dirnames, filenames) in os.walk(args.src):
            for filename in filenames:
                path = os.path.join(dirpath, filename)
                deps.append(os.path.relpath(path))
                tar.add(path, arcname=os.path.relpath(path, args.src))

    with open(args.depfile, 'w') as depfile:
        depfile.write('%s: %s\n' % (args.dst, ' '.join(sorted(deps))))

    return 0


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