#!/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())