## # systr_record_commit_mesg [] # # Setup and present user with an editor to enter a commit message for # the given commit ID. If is given, that content will be the # default in the opened file. If does not match TRAC, an # additional message will be given to the user, letting them know they # are committing to another branch. 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 [ $# -lt 2 ]; then echo "Fatal: too few args to record_commit_mesg" >&2 exit 1 fi commit="$1" branch="$2" if [ $# -gt 2 ]; then mesg="$3" else mesg="" fi echo "$mesg" >.systr/commit-edit-mesg.txt echo "# --" >>.systr/commit-edit-mesg.txt if [[ "$branch" != "$TRAC" ]]; then echo "# Committing to $branch" >>.systr/commit-edit-mesg.txt echo "#" >>.systr/commit-edit-mesg.txt fi systrunk status | sed 's/^/# /' >>.systr/commit-edit-mesg.txt vi .systr/commit-edit-mesg.txt sed '/^#/ d' <.systr/commit-edit-mesg.txt >"$path/revs/$commit.mesg" } ## # systrunk commit [=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 # before you can commit. The branch committed to is updated to # reference the new commit. If does not exist in the # repository, it is created. If 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 [ $# -gt 0 ]; then branch="$1" else branch="$TRAC" fi if [[ "$branch" == "BASE" ]]; then echo "Fatal: bad branch name BASE" >&2 exit 1 elif [[ "$branch" == "TRAC" ]]; then echo "Fatal: bad branch name TRAC" >&2 exit 1 elif [[ "$branch" == "NULL" ]]; then echo "Fatal: bad branch name NULL" >&2 exit 1 elif [[ "$branch" == "MERG" ]]; then echo "Fatal: bad branch name MERG" >&2 exit 1 fi branchcommit=$(systr_repo_resolve_reference "$branch" 2>/dev/null) || branchcommit="$BASE" systr_repo_resolve_reference "$branch" >/dev/null 2>&1 || echo "Creating new branch $branch" if [[ "$BASE" != "$branchcommit" ]]; then echo "Worktree is out-of-date, won't commit" >&2 exit 1 fi commit=$(systr_repo_create_commit) if [[ "$MERG" == "NULL" ]]; then systr_record_commit_mesg "$commit" "$branch" else systr_record_commit_mesg "$commit" "$branch" "Merge $MERG into $TRAC" fi echo "Sending files..." if [[ "$branchcommit" != "NULL" ]]; then systr_rsync_normal . "$path/revs/$commit/" "../$branchcommit/" else systr_rsync_normal . "$path/revs/$commit/" fi if [[ "$MERG" == "NULL" ]]; then systr_repo_finish_commit "$commit" "$branchcommit" else mergecommit=$(systr_repo_resolve_reference "$MERG") systr_repo_finish_commit "$commit" "$branchcommit" "$mergecommit" fi echo "$commit" >.systr/BASE echo "NULL" >.systr/MERG date >.systr/updated 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 } ## # systrunk reset # # Similar to systrunk commit, but doesn't require the worktree to # be up-to-date with . This command can be used to rollback # a branch to a previous state by running systrunk checkout followed # by this command. If does not exist, this command will # fail. If is a commit ID instead of a symbolic reference, # no action is taken. ## function systr_reset { if [ $# -lt 1 ]; then echo "Fatal: too few args to reset" >&2 exit 1 fi branch="$1" if [[ "$branch" == "BASE" ]]; then echo "Fatal: bad branch name BASE" >&2 exit 1 elif [[ "$branch" == "TRAC" ]]; then echo "Fatal: bad branch name TRAC" >&2 exit 1 elif [[ "$branch" == "NULL" ]]; then echo "Fatal: bad branch name NULL" >&2 exit 1 elif [[ "$branch" == "MERG" ]]; then echo "Fatal: bad branch name MERG" >&2 exit 1 fi if [[ "$MERG" != "NULL" ]]; then echo "Fatal: merge in progress, won't reset" >&2 exit 1 fi branchcommit=$(systr_repo_resolve_reference "$branch") if [[ "$branchcommit" == "$branch" ]]; then echo "Fatal: $branch is a commit ID, not a symbolic reference" >&2 exit 1 fi commit=$(systr_repo_create_commit) systr_record_commit_mesg "$commit" "$branch" "Reset $branch to state at $BASE" echo "Performing RESET" echo "Sending files..." if [[ "$BASE" != "NULL" ]]; then systr_rsync_normal . "$path/revs/$commit/" "../$BASE/" else systr_rsync_normal . "$path/revs/$commit/" fi systr_repo_finish_commit "$commit" "$branchcommit" echo "$commit" >.systr/BASE echo "NULL" >.systr/MERG date >.systr/updated systr_repo_set_reference "$branch" "$commit" echo "$branch" >.systr/TRAC }