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

import argparse
import errno
import os
import shutil
import sys


def Main():
    parser = argparse.ArgumentParser(
        description='Create Mac Framework symlinks'
    )
    parser.add_argument('--framework', action='store', type=str, required=True)
    parser.add_argument('--version', action='store', type=str)
    parser.add_argument('--contents', action='store', type=str, nargs='+')
    parser.add_argument('--stamp', action='store', type=str, required=True)
    args = parser.parse_args()

    VERSIONS = 'Versions'
    CURRENT = 'Current'

    # Ensure the Foo.framework/Versions/A/ directory exists and create the
    # Foo.framework/Versions/Current symlink to it.
    if args.version:
        try:
            os.makedirs(
                os.path.join(args.framework, VERSIONS, args.version), 0o755
            )
        except OSError as e:
            if e.errno != errno.EEXIST:
                raise e
        _Relink(
            os.path.join(args.version),
            os.path.join(args.framework, VERSIONS, CURRENT),
        )

    # Establish the top-level symlinks in the framework bundle. The dest of
    # the symlinks may not exist yet.
    if args.contents:
        for item in args.contents:
            _Relink(
                os.path.join(VERSIONS, CURRENT, item),
                os.path.join(args.framework, item),
            )

    # Write out a stamp file.
    if args.stamp:
        with open(args.stamp, 'w') as f:
            f.write(str(args))

    return 0


def _Relink(dest, link):
    """Creates a symlink to |dest| named |link|. If |link| already exists,
    it is overwritten."""
    try:
        os.remove(link)
    except OSError as e:
        if e.errno != errno.ENOENT:
            shutil.rmtree(link)
    os.symlink(dest, link)


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