Integrate scripts into home-manager
This commit is contained in:
251
scripts/tmpclone
Normal file
251
scripts/tmpclone
Normal file
@@ -0,0 +1,251 @@
|
||||
#!/bin/sh
|
||||
##
|
||||
## tmpclone
|
||||
##
|
||||
## Clones and manages short-lived git repositories.
|
||||
##
|
||||
## Usage examples:
|
||||
##
|
||||
## tmpclone > list the tracked repos
|
||||
## tmplcone -d > deletes all tracked repos
|
||||
## tmpclone -d target > deletes the target
|
||||
## tmpclone target > opens the target, try to clone if not exits
|
||||
## tmpclone -v target > like tmpclone target, but deletes the repo after close
|
||||
## tmpclone -r target > like tmpcloen target, but if forces a redownload of the target
|
||||
## tmpclone -n name target > creates a target with the name given, the target may be an url
|
||||
|
||||
|
||||
function print_help()
|
||||
{
|
||||
echo '
|
||||
tmpclone [-dhrv] [-n NAME] [TARGET]
|
||||
Clones and manages short lived git repositories.
|
||||
|
||||
-d
|
||||
If a target is provided this repo will be deleted. Otherwise all repos created by tmpclone will be deleted.
|
||||
|
||||
-h
|
||||
Print this help page.
|
||||
|
||||
-n NAME
|
||||
Explicitly define a name for the repo. This only work in combination with a target.
|
||||
|
||||
-r
|
||||
Recreates the repos before entering it.
|
||||
|
||||
-v
|
||||
Delete the repo after exit (volatile).
|
||||
'
|
||||
}
|
||||
|
||||
|
||||
# -----------------------
|
||||
# | Argument parsing |
|
||||
# -----------------------
|
||||
|
||||
# Define default flag values
|
||||
FLAG_D=false
|
||||
FLAG_N=false
|
||||
FLAG_N_VALUE=""
|
||||
FLAG_R=false
|
||||
FLAG_V=false
|
||||
|
||||
if [ $# -eq 0 ]
|
||||
then
|
||||
NO_ARGS=true
|
||||
else
|
||||
NO_ARGS=false
|
||||
fi
|
||||
|
||||
# Parse command-line options
|
||||
while getopts ":dn:rvh" opt
|
||||
do
|
||||
case ${opt} in
|
||||
h )
|
||||
print_help
|
||||
exit 0
|
||||
;;
|
||||
d )
|
||||
FLAG_D=true
|
||||
;;
|
||||
n )
|
||||
FLAG_N=true
|
||||
FLAG_N_VALUE=$OPTARG
|
||||
;;
|
||||
r )
|
||||
FLAG_R=true
|
||||
;;
|
||||
v )
|
||||
FLAG_V=true
|
||||
;;
|
||||
\? )
|
||||
echo "Invalid option: -$OPTARG" 1>&2
|
||||
print_help
|
||||
exit 1
|
||||
;;
|
||||
: )
|
||||
echo "Option -$OPTARG requires an argument." 1>&2
|
||||
print_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Remove the options from the positional parameters
|
||||
shift $((OPTIND -1))
|
||||
|
||||
# Check if there are any remaining arguments
|
||||
if [ $# -eq 0 ] && ! $FLAG_D && ! $NO_ARGS
|
||||
then
|
||||
echo "No TARGET was provided."
|
||||
print_help
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get the TARGET
|
||||
TARGET=false
|
||||
if [ $# -ne 0 ]
|
||||
then
|
||||
TARGET=true
|
||||
TARGET_VALUE=$1
|
||||
fi
|
||||
|
||||
|
||||
# -----------------------
|
||||
# | Main program |
|
||||
# -----------------------
|
||||
|
||||
DATA_ROOT="/var/tmp/tmpclone"
|
||||
mkdir -p "$DATA_ROOT"
|
||||
|
||||
|
||||
function repo_with_name_exists()
|
||||
{
|
||||
ls "$DATA_ROOT/$1" 1> /dev/null 2> /dev/null
|
||||
return $!
|
||||
}
|
||||
|
||||
function repo_with_url_exists()
|
||||
{
|
||||
repo_with_name_exists "$(get_name_from_url $1)"
|
||||
return $!
|
||||
}
|
||||
|
||||
function get_name_from_url()
|
||||
{
|
||||
echo "$1" | awk 'BEGIN{FS="/"} {print $NF}'
|
||||
}
|
||||
|
||||
function get_url_from_name()
|
||||
{
|
||||
cd "$DATA_ROOT/$1" && git remote get-url $(git remote | head -n 1)
|
||||
}
|
||||
|
||||
function recreate_repo_from_name()
|
||||
{
|
||||
local REPO_PATH="$DATA_ROOT/$1"
|
||||
local URL="$(get_url_from_name $1)"
|
||||
rm -rf "$REPO_PATH"
|
||||
git clone "$URL" "$REPO_PATH"
|
||||
}
|
||||
|
||||
function recreate_repo_from_url()
|
||||
{
|
||||
local REPO_PATH="$DATA_ROOT/$(get_name_from_url $1)"
|
||||
rm -rf "$REPO_PATH"
|
||||
git clone "$1" "$REPO_PATH"
|
||||
}
|
||||
|
||||
|
||||
# Display all repos tracked by this script
|
||||
if [ $NO_ARGS = true ]
|
||||
then
|
||||
ls $DATA_ROOT | sed "s/ /\n/g"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Convert target to path
|
||||
TARGET_PATH=""
|
||||
if [ $TARGET = true ]
|
||||
then
|
||||
if repo_with_name_exists $TARGET_VALUE
|
||||
then
|
||||
TARGET_PATH="$DATA_ROOT/$TARGET_VALUE"
|
||||
elif repo_with_url_exists $TARGET_VALUE
|
||||
then
|
||||
TARGET_PATH="$DATA_ROOT/$(get_name_from_url $TARGET_VALUE)"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Delete repos on -d option call
|
||||
if [ "$FLAG_D" = true ]
|
||||
then
|
||||
if [ $TARGET = false ]
|
||||
then
|
||||
rm -rf "$DATA_ROOT"
|
||||
echo "All repositories deleted."
|
||||
else
|
||||
rm -rf "$TARGET_PATH"
|
||||
echo "Deleted the repo $TARGET_PATH."
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Use name option to recreate a target with a new name
|
||||
if [ "$FLAG_N" = true ]
|
||||
then
|
||||
TARGET_PATH="$DATA_ROOT/$FLAG_N_VALUE"
|
||||
|
||||
if repo_with_name_exists $TARGET_VALUE
|
||||
then
|
||||
git clone "$(get_url_from_name $TARGET_VALUE)" "$TARGET_PATH"
|
||||
elif repo_with_url_exists $TARGET_VALUE
|
||||
then
|
||||
git clone "$TARGET_VALUE" "$TARGET_PATH"
|
||||
else
|
||||
echo "Target '$TARGET_VALUE' not found."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check if there exists a repo with the url already.
|
||||
if [ $FLAG_R = true ]
|
||||
then
|
||||
if repo_with_name_exists $TARGET_VALUE
|
||||
then
|
||||
recreate_repo_from_name $TARGET_VALUE
|
||||
elif repo_with_url_exists $TARGET_VALUE
|
||||
then
|
||||
recreate_repo_from_url $TARGET_VALUE
|
||||
else
|
||||
echo "Target '$TARGET_VALUE' not found."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Create if not exists
|
||||
if [ ! -d "$TARGET_PATH" ]
|
||||
then
|
||||
TARGET_PATH="$DATA_ROOT/$(get_name_from_url $TARGET_VALUE)"
|
||||
git clone "$TARGET_VALUE" "$TARGET_PATH"
|
||||
fi
|
||||
|
||||
# Define promt prefix
|
||||
if [ "$FLAG_V" = true ]
|
||||
then
|
||||
export PROMPT_PREFIX="%F{244}%F{red}[tmpclone] %F{reset}"
|
||||
else
|
||||
export PROMPT_PREFIX="[tmpclone] "
|
||||
fi
|
||||
|
||||
# Enter the subshell
|
||||
sh -c "cd \"$TARGET_PATH\"; /bin/zsh"
|
||||
SHELL_EXIT=$?
|
||||
|
||||
# Volatile
|
||||
if [ "$FLAG_V" = true ]
|
||||
then
|
||||
rm -rf "$TARGET_PATH"
|
||||
fi
|
||||
|
||||
exit $SHELL_EXIT
|
||||
Reference in New Issue
Block a user