summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--repo-mutate.sh114
1 files changed, 114 insertions, 0 deletions
diff --git a/repo-mutate.sh b/repo-mutate.sh
new file mode 100644
index 0000000..d88452e
--- /dev/null
+++ b/repo-mutate.sh
@@ -0,0 +1,114 @@
+##
+# 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> <author> <email> [<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 4 ]; then
+ echo "Fatal: too few arguments to systr_repo_finish_commit"
+ exit 1
+ fi
+
+ commit="$1"
+ parent="$2"
+ author="$3"
+ email="$4"
+
+ if [ $# -gt 4 ]; then
+ merge="$5"
+ else
+ merge=""
+ fi
+
+ if [[ "$remote" == "" ]]; then
+ (
+ cd "$path"
+ cd "revs/"
+ cd "$commit"
+
+ echo "$parent" >.commit.systr
+ echo "$author" >.author.systr
+ echo "$email" >.email.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
+}