# Copyright 2012 Google 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:
#
# * Redistributions of source code must retain the above copyright
#   notice, this list of conditions and the following disclaimer.
# * 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.
# * Neither the name of Google Inc. nor the names of its contributors
#   may be used to endorse or promote products derived from this software
#   without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
# OWNER OR 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.

shtk_import cli
shtk_import process


shtk_cvs_fetch() {
    local cvsroot="${1}"; shift
    local module="${1}"; shift
    local tag="${1}"; shift
    local directory="${1}"; shift

    if [ -d "${directory}" ]; then
        shtk_cvs_update "${cvsroot}" "${tag}" "${directory}"
    else
        shtk_cvs_checkout "${cvsroot}" "${module}" "${tag}" "${directory}"
    fi
}


shtk_cvs_checkout() {
    local cvsroot="${1}"; shift
    local module="${1}"; shift
    local tag="${1}"; shift
    local directory="${1}"; shift

    local rflag=
    [ -z "${tag}" ] || rflag="-r${tag}"

    [ ! -d "${directory}" ] || shtk_cli_error "Cannot checkout into" \
        "${directory}; directory already exists"
    mkdir -p "${directory}"
    mkdir "${directory}"/.cvs-checkout \
        || shtk_cli_error "Failed to create ${directory}"
    ( cd "${directory}"/.cvs-checkout &&
        shtk_process_run cvs -d"${cvsroot}" -q checkout -P ${rflag} \
        "${module}" ) || shtk_cli_error "CVS checkout failed"
    mv "${directory}"/.cvs-checkout/"${module}"/* "${directory}"/ \
        || true  # Maybe the checkout yielded no files...
    rm -rf "${directory}"/.cvs-checkout
}


shtk_cvs_update() {
    local cvsroot="${1}"; shift
    local tag="${1}"; shift
    local directory="${1}"; shift

    local rflag=
    [ -z "${tag}" ] || rflag="-r${tag}"

    [ -d "${directory}" ] || shtk_cli_error "Cannot update ${directory};" \
        "directory does not exist"

    if [ -d "${directory}/.cvs-checkout" ]; then
        # Attempt to resume a previously aborted shtk_cvs_checkout.
        mv "${directory}"/.cvs-checkout/*/* "${directory}"/ \
            || true  # Maybe the checkout yielded no files...
        rm -rf "${directory}"/.cvs-checkout
    fi

    ( cd "${directory}" && \
        shtk_process_run cvs -d"${cvsroot}" -q update -d -P ${rflag} ) \
        || shtk_cli_error "CVS update failed"
}
