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