#!/usr/bin/env python3
# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Simple script to download the pinned Node modules from GCS.

This script exists because the node_modules archive currently contains
a node_modules/.bin directory with a bunch of symlinked files in it,
and download_from_google_storage.py won't let you have archives with
symlinks.

In theory we should probably rebuild the node_modules distro without
the ./bin directory (using `npm install --no-bin-lnks`) but that would
cause the build scripts to fail and we'd have to replace `npmw` with
something else.
"""

import argparse
import hashlib
import os
import sys
import tarfile
from urllib.request import urlopen

import common


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.parse_args()

    with open(os.path.join(common.REPO_DIR, 'node_modules.tar.gz.sha1')) as fp:
        expected_sha1 = fp.read().strip()

    actual_sha1 = None
    tgz = os.path.join(common.REPO_DIR, 'node_modules.tar.gz')
    if os.path.exists(tgz):
        with open(tgz, 'rb') as fp:
            s = hashlib.sha1()
            s.update(fp.read())
            actual_sha1 = s.hexdigest()

    # TODO(crbug.com/1457681): Consider whether we should validate that
    # node_modules/ and all of the expected files exist as well.
    if actual_sha1 == expected_sha1:
        return 0

    url = 'https://storage.googleapis.com/%s/%s' % (
        'chromium-website-lob-storage', expected_sha1)
    with urlopen(url) as url_fp, open(tgz, 'wb') as tgz_fp:
        tgz_fp.write(url_fp.read())

    try:
        # TODO(crbug.com/1457681): download_from_google_storage puts in a fair
        # amount of effort to not clobber an existing directory until it is sure
        # it can extract the archive completely. Consider whether we should do
        # the same.
        with tarfile.open(tgz, 'r:gz') as tar:
            tar.extractall(path=common.REPO_DIR)
        return 0
    except Exception as e:
        print(e)
        return 1


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