summaryrefslogblamecommitdiffstats
path: root/repo-mutate.sh
blob: f2f90dde0c9f7a0982838f128ceac459bec7e664 (plain) (tree)
























                                                                     
                                                      








                                                                      
                         





                                                                   
 

                         



                











                                   








                                         
                             





















































                                                                       
















                                                                     
##
# systr_repo_create_commit [<path>]
#
# Create a new commit directory within the repository.  This function
# is polymorphic for both local and remote repositories.  The new
# commit ID is printed to stdout.
##
function systr_repo_create_commit
{
    if [ $# -gt 0 ]; then
        path="$1"
    fi

    if [[ "$remote" == "" ]]; then
        (
            cd "$path"
            cd "revs/"
            mktemp -d XXXXXXXX
        )
    else
        ssh "$remote" "systrunk create-commit \"$path\""
    fi
}

##
# systr_repo_finish_commit <commit> <parent> [<merge>]
#
# Finish writing a commit by adding meta-data to the commit directory.
# The commit mesasge is taken from the file <commit>.mesg at the root
# of the repository directory.  If <merge> is given, it is written to
# .merge.systr in the commit.  This function is polymorphic for both
# local and remote repositories.
##
function systr_repo_finish_commit
{
    if [ $# -lt 2 ]; then
        echo "Fatal: too few arguments to systr_repo_finish_commit"
        exit 1
    fi

    commit="$1"
    parent="$2"

    if [ $# -gt 2 ]; then
        merge="$3"
    else
        merge=""
    fi

    if [ -f ".systr/author" ]; then
        read author <.systr/author
    else
        author="Anonymous"
    fi

    if [ -f ".systr/email" ]; then
        read email <.systr/email
    else
        email="<anon>"
    fi

    if [[ "$remote" == "" ]]; then
        (
            cd "$path"
            cd "revs/"
            cd "$commit"

            echo "$parent" >.commit.systr
            echo "$author" >.author.systr
            echo "$email"  >.email.systr
            date >.date.systr

            mv "../$commit.mesg" ".mesg.systr"

            if [[ "$merge" != "" ]]; then
                echo "$merge" >.merge.systr
            fi
        )
    else
        ssh "$remote" "systrunk finish-commit \"$commit\" \"$parent\" \
            \"$author\" \"$email\" \"$merge\""
    fi
}

##
# systr_repo_set_reference <symref> <commit>
#
# Update <symref> to point to <commit>.  If <symref> doesn't exist,
# it is created.  This function is polymorphic for both local and
# remote repositories.
##
function systr_repo_set_reference
{
    if [ $# -lt 2 ]; then
        echo "Fatal: too few arguments to systr_repo_set_reference"
        exit 1
    fi

    symref="$1"
    commit="$2"

    if [[ "$symref" == "BASE" ]]; then
        echo "Fatal: will not define BASE in the repository"
        exit 1
    elif [[ "$symref" == "TRAC" ]]; then
        echo "Fatal: will not define TRAC in the repository"
        exit 1
    elif [[ "$symref" == "NULL" ]]; then
        echo "Fatal: will not define NULL in the repository"
        exit 1
    elif [[ "$symref" == "MERG" ]]; then
        echo "Fatal: will not define MERG in the repository"
        exit 1
    fi

    if [[ "$remote" == "" ]]; then
        (
            cd "$path"
            cd "refs/"
            echo "$commit" >"$symref"
        )
    else
        ssh "$remote" "systrunk set-ref \"$symref\" \"$commit\""
    fi
}

##
# systr_repo_tag <name>
#
# Tag the current commit.  This creates a new branch which references
# BASE.
##
function systr_repo_tag
{
    if [ $# -lt 1 ]; then
        echo "Fatal: too few arguments to systr_repo_tag"
        exit 1
    fi

    name="$1"
    systr_repo_set_reference "$name" "$BASE"
}