summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--checkout.sh61
1 files changed, 61 insertions, 0 deletions
diff --git a/checkout.sh b/checkout.sh
new file mode 100644
index 0000000..5ea4b70
--- /dev/null
+++ b/checkout.sh
@@ -0,0 +1,61 @@
+##
+# systrunk checkout [[<remote>] <path>] <version>
+#
+# Reset a worktree to the state at <version>. If <path> is given,
+# checkout also initializes a new worktree at the CWD. If <remote>
+# is given, the path is assumed to be located on a remote machine
+# and is contacted over SSH. While resetting to the state at
+# <version>, all local uncommitted changes are lost.
+#
+# After checkout, BASE and TRAC will be set to <version>.
+##
+function systr_checkout
+{
+ # check arguments #
+ if [ $# -lt 2 ]; then
+ echo "Missing required parameters"
+ exit
+ fi
+
+ # init worktree #
+ if [ $# -gt 2 ]; then
+ init_wktree $@
+ fi
+
+ # perform checkout #
+ read remote <.systr/remote
+ read path <.systr/path
+ version=$2
+
+ if [[ "$version" == "NULL" ]]; then
+ echo "Checking out NULL :: Checkout not performed"
+ exit
+ fi
+
+ commit=$(get_commit "$version")
+ symref=$(get_symref "$version")
+
+ echo "$commit" >.systr/BASE
+ echo "$symref" >.systr/TRAC
+
+ if [[ "$commit" == "NULL" ]]; then
+ echo "Nothing to checkout"
+ exit
+ fi
+
+ echo "Checking out files..."
+
+ # local repository #
+ if [[ "$remote" == "" ]]; then
+ rsync -az --info=progress2 --info=stats2 \
+ --delete --exclude='*.systr' \
+ "$path/$commit/" .
+
+ # remote repository #
+ else
+ rsync -az -e ssh --info=progress2 --info=stats2 \
+ --delete --exclude='*.systr' \
+ "$remote:$path/$commit/" .
+
+ fi
+}