summaryrefslogtreecommitdiffstats
path: root/checkout.sh
blob: e340706d630dbcb9af3fb3ed316c3cce63c5fd35 (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
##
# systr_init_wktree <path>
#
# Assert that the repository exists, then setup the .systr directory
# at the CWD.
##
function systr_init_wktree
{
    if [ $# -lt 1 ]; then
        echo "Fatal: too few args to init_wktree" >&2
        exit 1
    fi

    path="$1"
    systr_repo_check "$path"

    mkdir .systr
    echo "$path" >.systr/path
    echo "NULL"  >.systr/BASE
    echo "NULL"  >.systr/TRAC
    echo "NULL"  >.systr/MERG
    date >.systr/updated

    echo "Setup worktree at $(pwd)"
}

##
# systrunk checkout <commit> [<path>]
#
# Reset a worktree to the state at <commit>.  If <path> is given,
# checkout also initializes a new worktree at the CWD.  While
# resetting to <commit>, all local uncommitted changes are lost.
#
# After checkout, BASE and TRAC will be set to <commit>.
##
function systr_checkout
{
    if [ $# -lt 1 ]; then
        echo "Fatal: too few arguments to systr_checkout" >&2
        exit 1
    fi

    version="$1"

    if [ $# -gt 1 ]; then
        systr_init_wktree "$2"
        read path <.systr/path
        read BASE <.systr/BASE
        read TRAC <.systr/TRAC
    fi

    if [[ "$version" == "NULL" ]]; then
        echo "Checking out NULL :: Checkout not performed"
        exit
    fi

    if [[ "$version" == "TRAC" ]]; then
        version="$TRAC"
    fi

    commit=$(systr_repo_resolve_reference "$version")
    echo "$commit" >.systr/BASE

    if [[ "$version" != "BASE" ]]; then
        echo "$version" >.systr/TRAC
    fi

    if [[ "$commit" == "NULL" ]]; then
        echo "Nothing to checkout"
        exit
    fi

    echo "Checking out files..."
    systr_rsync_normal "$path/revs/$commit/" .
    date >.systr/updated
}