#!/usr/bin/env python
#===--- update-checkout - Utility to update your local checkouts -----------===#
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2015 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 *


def update_git_svn(repo_path):
    with WorkingDirectory(repo_path):
        use_stash = (check_output([ "git", "status", "--porcelain" ]) != "")
        if use_stash:
            check_call([ "git", "stash", "save", "--all"])

        # Try first to pull from an upstream Git repo, assuming there is one
        if check_output([ "git", "remote" ]) != "":
            check_call([ "git", "pull", "--rebase" ])
            check_call([ "git", "svn", "rebase", "-l" ])
        else:
            check_call([ "git", "svn", "rebase" ])

        if use_stash:
            check_call([ "git", "stash", "pop" ])


def update_working_copy(repo_path):
    if not os.path.isdir(repo_path):
        return

    print("--- Updating '" + repo_path + "' ---")
    with WorkingDirectory(repo_path):
        if os.path.isdir(os.path.join(".git", "svn")):
            update_git_svn(repo_path)
        elif os.path.isdir(".git"):
            check_call([ "git", "pull" ])
        else:
            check_call([ "svn", "update" ])


def main():
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description="""
repositories.

By default, updates your checkouts of Swift, SourceKit, LLDB, and SwiftPM.""")
    parser.add_argument("-a", "--all",
        help="also update checkouts of llbuild, LLVM, and Clang",
        action="store_true")
    args = parser.parse_args()

    if args.all:
        update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "llbuild"))
        update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "llvm"))
        update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "clang"))

    update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "swift"))
    update_working_copy(
        os.path.join(SWIFT_SOURCE_ROOT, "swift", "benchmark", "PerfTestSuite"))
    update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "SourceKit"))
    update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "cmark"))
    update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "lldb"))
    update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "swiftpm"))
    update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "swift-corelibs-foundation"))
    update_working_copy(os.path.join(SWIFT_SOURCE_ROOT, "swift-corelibs-xctest"))

    return 0


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

