#!/usr/bin/python

# Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

import os

import bot
import bot_utils

utils = bot_utils.GetUtils()

HOST_OS = utils.GuessOS()


def ArchiveArtifacts(tarfile, builddir, channel):
    namer = bot_utils.GCSNamer(channel=channel)
    gsutil = bot_utils.GSUtil()
    revision = utils.GetArchiveVersion()
    # Archive the src tar to the src dir
    remote_tarfile = '/'.join(
        [namer.src_directory(revision),
         os.path.basename(tarfile)])
    gsutil.upload(tarfile, remote_tarfile, public=True)
    # Archive all files except the tar file to the linux packages dir
    for entry in os.listdir(builddir):
        full_path = os.path.join(builddir, entry)
        # We expect a flat structure, not subdirectories
        assert (os.path.isfile(full_path))
        if full_path != tarfile:
            package_dir = namer.linux_packages_directory(revision)
            remote_file = '/'.join([package_dir, os.path.basename(entry)])
            gsutil.upload(full_path, remote_file, public=True)


if __name__ == '__main__':
    bot_name, _ = bot.GetBotName()
    channel = bot_utils.GetChannelFromName(bot_name)
    if channel != bot_utils.Channel.BLEEDING_EDGE:
        builddir = os.path.join(bot_utils.DART_DIR, utils.GetBuildDir(HOST_OS),
                                'src_and_installation')
        version = utils.GetVersion()
        tarfilename = 'dart-%s.tar.gz' % version
        tarfile = os.path.join(builddir, tarfilename)
        ArchiveArtifacts(tarfile, builddir, channel)
    else:
        print 'Not uploading artifacts on bleeding edge'
