summaryrefslogtreecommitdiffstats
path: root/commit.sh
blob: ff346ff580b44f2430b591412b80f917fc2f98ab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
##
# systr_record_commit_mesg <commit> [<mesg>]
#
# Setup and present user with an editor to enter a commit message for
# the given commit ID.  If <mesg> is given, that content will be the
# default in the opened text file.  Once user is finished, the file is
# moved into the repository root, awaiting a call to systr_repo_finish_commit.
##
function systr_record_commit_mesg
{
    if [ $# -eq 0 ]; then
        echo "Fatal: too few arguments to systr_record_commit_mesg"
        exit 1
    fi

    commit="$1"

    if [ $# -gt 1 ]; then
        mesg="$2"
    else
        mesg=""
    fi

    echo "$mesg" >.systr/commit-edit-mesg.txt
    echo "# --" >>.systr/commit-edit-mesg.txt
    systrunk status | sed 's/^/# /' >>.systr/commit-edit-mesg.txt
    vi .systr/commit-edit-mesg.txt
    sed '/^#/ d' <.systr/commit-edit-mesg.txt >.systr/commit.mesg

    if [[ "$remote" == "" ]]; then
        mv .systr/commit.mesg "$path/revs/$commit.mesg"
    else
        ssh "$remote" "systrunk message-commit \"$commit\"" <.systr/commit.mesg
    fi
}

##
# systrunk commit [<branch>=TRAC]
#
# Create a snapshot of the current state of the worktree and record
# it in the repository.  Your worktree must be up-to-date with <branch>
# before you can commit.  The branch committed to is updated to
# reference the new commit.  If <branch> does not exist in the
# repository, it is created.  If <branch> is a commit ID instead of
# a symbolic reference, the new commit will not exist on any branch,
# but an anonymous one referenced by TRAC.
##
function systr_commit
{
    if [ $# -ne 0 ]; then
        branch=$1
    else
        branch="$TRAC"
    fi

    branchcommit=$(systr_repo_resolve_reference "$branch") || branchcommit="$BASE"

    if [[ "$BASE" != "$branchcommit" ]]; then
        echo "Worktree is out-of-date, won't commit"
        exit 1
    fi

    commit=$(systr_repo_create_commit)
    systr_record_commit_mesg "$commit"
    echo "Sending files..."
    systr_rsync_normal . "$path/revs/$commit" "../$branchcommit"
    systr_repo_finish_commit "$commit" "$branchcommit"
    echo "$commit" >.systr/BASE

    if [[ "$branch" != "$branchcommit" ]]; then
        systr_repo_set_reference "$branch" "$commit"
    fi

    if [[ "$TRAC" == "$BASE" ]]; then
        echo "$commit" >.systr/TRAC
    else
        echo "$branch" >.systr/TRAC
    fi
}