Samuel W. Flint 1 год назад
Родитель
Сommit
ca78d2cdb0
1 измененных файлов с 189 добавлено и 0 удалено
  1. 189 0
      wt

+ 189 - 0
wt

@@ -0,0 +1,189 @@
+#!/usr/bin/env bash
+set -e
+
+# Switch between git worktrees with speed.
+
+args=("$@")
+VERSION="0.2.4-fork"
+TMP_PATH=$(mktemp)
+BINARY_PATH=$(realpath "$0")
+VERSION_CACHE_FILE=${XDG_CACHE_HOME:-$HOME/.cache}/wt_latest_update_check.json
+JQ_URL="https://stedolan.github.io/jq/download"
+RELEASE_URL="https://github.com/mateusauler/git-worktree-switcher/releases/latest"
+RELEASE_API_URL="https://api.github.com/repos/mateusauler/git-worktree-switcher/releases/latest"
+CHANGE_DIRECTORY_PREFIX="changedir:"
+
+
+# Escape forward slash
+arg=${args[0]/\//\\\/}
+
+worktree_list_names() {
+	git worktree list --porcelain 2> /dev/null | sed -n 's/^worktree\s*//p' | xargs -r -I{} basename {}
+}
+
+help_message() {
+	echo -e "wt lets you switch between your git worktrees with speed.\n"
+	echo "Usage:"
+	echo -e "\twt: go to the main worktree"
+	echo -e "\twt <worktree-name>: search for worktree names and change to that directory."
+	echo -e "\twt names: list out only the git worktree names."
+	echo -e "\twt update: update to the latest release of worktree switcher."
+	echo -e "\twt version: show the CLI version."
+	echo -e "\twt init <shell>: print the init script for <shell>."
+	echo -e "\twt help: shows this help message."
+}
+
+download_latest_update() {
+	download_url=$(curl -sL $RELEASE_API_URL | jq -r '.assets[0].browser_download_url')
+
+	echo "Downloading latest version $fetched_tag_name"
+	curl -sL -o "$TMP_PATH" "$download_url"
+
+	echo "Updating to latest version..."
+	chmod +x "$TMP_PATH"
+	sudo mv "$TMP_PATH" "$BINARY_PATH"
+	rm -f "$TMP_PATH"
+
+	echo "You are using the latest version of worktree switcher: $fetched_tag_name"
+}
+
+check_release_version() {
+	fetched_tag_name=$(check_and_cache_update)
+
+	if [ "$fetched_tag_name" == $VERSION ]; then
+		echo "You have the latest version of worktree switcher!"
+		echo "Version: $VERSION"
+	else
+		download_latest_update
+	fi
+}
+
+update() {
+	if [ -z "$(command -v jq)" ]; then
+		echo "jq is required for updating worktree switcher via this command."
+		echo -e "Install jq:\n$JQ_URL.\n"
+		echo -e "Or visit:\n$RELEASE_URL"
+	else
+		check_release_version
+	fi
+}
+
+auto_check_update() {
+	show_updates() {
+		if [[ "$1" != "$VERSION" ]]; then
+			echo "Version $1 available! Run 'wt update' to update." 1>&2
+			echo "Currently running version $VERSION." 1>&2
+		fi
+	}
+
+	if [[ -f "$VERSION_CACHE_FILE" ]]; then
+		check_timestamp=$(jq -r '.timestamp' < "$VERSION_CACHE_FILE")
+		latest_known_version=$(jq -r '.version' < "$VERSION_CACHE_FILE")
+		one_day_ago_epoch=$(date -d '1 days ago' +%s)
+
+		if (( check_timestamp > one_day_ago_epoch )); then
+			show_updates "$latest_known_version"
+			return 0
+		fi
+	fi
+
+	fetched_tag_name=$(check_and_cache_update)
+	show_updates "$fetched_tag_name"
+}
+
+check_and_cache_update() {
+	echo "Checking for updates..." 1>&2
+	fetched_tag_name=$(curl -sL $RELEASE_API_URL | jq -r '.tag_name')
+
+	echo "$fetched_tag_name"
+
+	mkdir -p "$(dirname "$VERSION_CACHE_FILE")"
+cat > "$VERSION_CACHE_FILE" <<EOF
+{
+	"timestamp": "$(date +%s)",
+	"version": "$fetched_tag_name"
+}
+EOF
+}
+
+get_dest_path="\$(echo \"\$result\" | awk '/^$CHANGE_DIRECTORY_PREFIX.*/ {sub(\"$CHANGE_DIRECTORY_PREFIX\", \"\"); print; exit}')"
+
+init_bash() {
+	cat <<EOF
+wt() {
+	result="\$($BINARY_PATH "\$@")"
+	dest_path="$get_dest_path"
+
+	if [[ -n "\$dest_path" ]]; then
+		cd "\$dest_path" || return
+	elif [[ -n \$result ]]; then
+		echo "\$result"
+	fi
+}
+EOF
+}
+
+init_fish() {
+	cat <<EOF
+function wt
+	set -l result "\$($BINARY_PATH \$argv)"
+	set -l dest_path "$get_dest_path"
+
+	if test -n "\$dest_path"
+		cd "\$dest_path"
+	else if test -n "\$result"
+		echo "\$result"
+	end
+end
+EOF
+}
+
+init() {
+	shell="${args[1]}"
+	if [[ -z $shell ]]; then
+		echo "Please supply a shell."
+		echo "    eg. wt init bash"
+		exit 1
+	fi
+	case "$shell" in
+	bash|zsh)
+		init_bash
+		;;
+	fish)
+		init_fish
+		;;
+	*)
+		echo "Unsupported shell: $shell"
+		exit 1
+		;;
+	esac
+}
+
+case "${args[0]}" in
+names)
+	worktree_list_names
+	;;
+update)
+	update
+	;;
+help)
+	help_message
+	;;
+version)
+	echo Version: $VERSION
+	;;
+init)
+	init
+	;;
+*)
+	auto_check_update
+	directory=$(git worktree list --porcelain 2> /dev/null | sed -n '/'"${arg:-.}"'/{s/^worktree\s*//p;q}')
+	;;
+esac
+
+# If directory variable is not empty then change worktree
+if [ -z "$directory" ]; then
+	:
+else
+	echo "$CHANGE_DIRECTORY_PREFIX$directory"
+fi