Files
nix-los/scripts/tmpclone

252 lines
5.1 KiB
Bash

#!/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