dotfiles/dot_homesick/repos/homeshick/lib/commands/clone.sh

83 lines
2.2 KiB
Bash

#!/bin/bash
function clone {
[[ ! $1 ]] && help_err clone
local git_repo=$1
is_github_shorthand "$git_repo"
if is_github_shorthand "$git_repo"; then
if [[ -e "$git_repo/.git" ]]; then
local msg="$git_repo also exists as a filesystem path,"
msg="${msg} use \`homeshick clone ./$git_repo' to circumvent the github shorthand"
warn 'clone' "$msg"
fi
git_repo="https://github.com/$git_repo.git"
fi
local repo_path
# repos is a global variable
# shellcheck disable=SC2154
repo_path=$repos"/"$(repo_basename "$git_repo")
pending 'clone' "$git_repo"
test -e "$repo_path" && err "$EX_ERR" "$repo_path already exists"
local git_out
version_compare "$GIT_VERSION" 1.6.5
if [[ $? != 2 ]]; then
git_out=$(git clone --recursive "$git_repo" "$repo_path" 2>&1) || \
err "$EX_SOFTWARE" "Unable to clone $git_repo. Git says:" "$git_out"
success
else
git_out=$(git clone "$git_repo" "$repo_path" 2>&1) || \
err "$EX_SOFTWARE" "Unable to clone $git_repo. Git says:" "$git_out"
success
pending 'submodules' "$git_repo"
git_out=$(cd "$repo_path"; git submodule update --init 2>&1) || \
err "$EX_SOFTWARE" "Unable to clone submodules for $git_repo. Git says:" "$git_out"
success
fi
return "$EX_SUCCESS"
}
function symlink_cloned_files {
local cloned_castles=()
while [[ $# -gt 0 ]]; do
local git_repo=$1
if is_github_shorthand "$git_repo"; then
git_repo="https://github.com/$git_repo.git"
fi
local castle
castle=$(repo_basename "$git_repo")
shift
local repo="$repos/$castle"
if [[ ! -d $repo/home ]]; then
continue;
fi
local num_files
num_files=$(find "$repo/home" -mindepth 1 -maxdepth 1 | wc -l | tr -dc "0123456789")
if [[ $num_files -gt 0 ]]; then
cloned_castles+=("$castle")
fi
done
ask_symlink "${cloned_castles[@]}"
return "$EX_SUCCESS"
}
# Convert username/repo into https://github.com/username/repo.git
function is_github_shorthand {
if [[ ! $1 =~ \.git$ && $1 =~ ^([0-9A-Za-z-]+/[0-9A-Za-z_\.-]+)$ ]]; then
return 0
fi
return 1
}
# Get the repo name from an URL
function repo_basename {
if [[ $1 =~ ^[^/:]+: ]]; then
# For scp-style syntax like '[user@]host.xz:path/to/repo.git/',
# remove the '[user@]host.xz:' part.
basename "${1#*:}" .git
else
basename "$1" .git
fi
}