blob: a8a262b79fcfafd4d9d97e4af0f507d7e5cb38eb [file] [log] [blame]
#!/usr/bin/env python
# utils/update-checkout - Utility to update your local checkouts -*- python -*-
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See http://swift.org/LICENSE.txt for license information
# See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
from __future__ import print_function
import argparse
import os
import sys
sys.path.append(os.path.dirname(__file__))
from SwiftBuildSupport import (
SWIFT_SOURCE_ROOT,
WorkingDirectory,
check_call,
check_output,
)
def update_working_copy(repo_path, branch):
if not os.path.isdir(repo_path):
return
print("--- Updating '" + repo_path + "' ---")
with WorkingDirectory(repo_path):
if branch:
status = check_output(['git', 'status', '--porcelain'])
if status:
print("Please, commit your changes.")
print(status)
exit(1)
check_call(['git', 'checkout', branch])
# Prior to Git 2.6, this is the way to do a "git pull
# --rebase" that respects rebase.autostash. See
# http://stackoverflow.com/a/30209750/125349
check_call(["git", "fetch"])
check_call(["git", "rebase", "FETCH_HEAD"])
def obtain_additional_swift_sources(with_ssh, branch):
additional_repos = {
'llvm': 'apple/swift-llvm',
'clang': 'apple/swift-clang',
'lldb': 'apple/swift-lldb',
'cmark': 'apple/swift-cmark',
'swift-integration-tests': 'apple/swift-integration-tests',
}
for dir_name, repo in additional_repos.items():
with WorkingDirectory(SWIFT_SOURCE_ROOT):
if not os.path.isdir(os.path.join(dir_name, ".git")):
print("--- Cloning '" + dir_name + "' ---")
if with_ssh is True:
remote = "git@github.com:" + repo + '.git'
else:
remote = "https://github.com/" + repo + '.git'
check_call(['git', 'clone', remote, dir_name])
if branch:
src_path = SWIFT_SOURCE_ROOT + "/" + dir_name + "/" + ".git"
check_call(['git', '--git-dir', src_path, '--work-tree', os.path.join(SWIFT_SOURCE_ROOT, dir_name), 'checkout', branch])
def main():
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description="""
repositories.
By default, updates your checkouts of Swift, and LLDB.""")
parser.add_argument("-a", "--all",
help="also update checkouts of LLVM, and Clang",
action="store_true")
parser.add_argument("--clone",
help="Obtain Sources for Swift and Related Projects",
action="store_true")
parser.add_argument("--clone-with-ssh",
help="Obtain Sources for Swift and Related Projects via SSH",
action="store_true")
parser.add_argument("--branch",
help="Obtain Sources for specific branch")
args = parser.parse_args()
clone = args.clone
clone_with_ssh = args.clone_with_ssh
branch = args.branch
if clone or clone_with_ssh:
obtain_additional_swift_sources(clone_with_ssh, branch)
return 0
if args.all:
update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "llvm"), branch)
update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "clang"), branch)
update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "swift"), branch)
update_working_copy(
os.path.join(SWIFT_SOURCE_ROOT, "swift", "benchmark", "PerfTestSuite"), branch)
update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "cmark"), branch)
update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "lldb"), branch)
update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "swift-integration-tests"), branch)
return 0
if __name__ == "__main__":
sys.exit(main())