#!/usr/bin/env python3

# Copyright (C) 2021 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1.  Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import os
import sys
import time

from webkitpy import webkitscmpy
from webkitcorepy.string_utils import pluralize
from webkitscmpy import local, remote


SYNC_TIME_LIMIT = 5 * 60  # 5 minutes


def main():
    cache_path = None
    try:
        repo = local.Scm.from_path(os.path.dirname(__file__))
        cache_path = os.path.join(repo.root_path, '.git' if repo.is_git else '.svn', 'svn-webkit-org-cache.json')
    except OSError:
        pass

    mirror = remote.GitHub('https://github.com/WebKit/WebKit')
    repository = remote.Svn('https://svn.webkit.org/repository/webkit', cache_path=cache_path)

    mirror_tip = mirror.commit(branch='main')
    canonical_tip = repository.commit(branch='trunk')

    timestamps_equal = mirror_tip.timestamp == canonical_tip.timestamp

    if timestamps_equal and mirror_tip.identifier == canonical_tip.identifier:
        print('GitHub and svn.webkit.org are in sync')
        print(f'HEAD commit on GitHub {mirror_tip} matches HEAD commit on svn.webkit.org {canonical_tip}')
        return 0

    if timestamps_equal and mirror_tip.identifier != canonical_tip.identifier:
        print('ERROR: GitHub and svn.webkit.org are out of sync')
        print(f'HEAD commit on GitHub {mirror_tip} out of sync with HEAD commit on svn.webkit.org {canonical_tip}')
        return 1

    difference = canonical_tip.identifier - mirror_tip.identifier
    if time.time() < canonical_tip.timestamp + SYNC_TIME_LIMIT:
        print('GitHub is {} behind svn.webkit.org, but might be updating, This is ok.'.format(pluralize(difference, 'commit')))
        print(f'HEAD commit on GitHub {mirror_tip} slightly behind HEAD commit on svn.webkit.org {canonical_tip}')
        return 0

    print('ERROR: GitHub is not syncing from svn.webkit.org and is {} behind'.format(pluralize(difference, 'commit')))
    print(f'HEAD commit on GitHub {mirror_tip} out of sync with HEAD commit on svn.webkit.org {canonical_tip}')
    return 1


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

