Last active
October 16, 2015 11:52
-
-
Save quark-zju/d695ae1df0e8db2d010b to your computer and use it in GitHub Desktop.
git-vendor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
fatal() { | |
echo "$@" | |
exit 1 | |
} | |
get_vendor_dir() { | |
[ -n "$VENDOR" ] && echo $VENDOR && return | |
[ -d src ] && echo src/vendor && return | |
echo vendor | |
} | |
main() { | |
# go to git top level | |
ROOT="`git rev-parse --show-toplevel`" | |
[ -z "$ROOT" ] && fatal 'cannot detect git top level' | |
# normalize URL, add http:// if it does not have a protocol header | |
URL="$1" | |
[[ "$URL" != *:* ]] && URL="http://$URL" | |
# add git remote on demand | |
PACKAGE="`echo $URL | sed 's/^.*://;s#^//*##'`" | |
REMOTE=${3:-subtree/$PACKAGE} | |
# HACK: auto replace common URLs | |
URL=${URL//golang.org\/x/github.com\/golang} | |
if ! git remote | grep -q $REMOTE; then | |
# verify git url | |
git ls-remote "$URL" &> /dev/null || fatal "$URL is not a git repository" | |
git remote add $REMOTE "$URL" || return 1 | |
fi | |
# add --squash flag if needed | |
[ ${SQUASH:-0} = 1 ] && GIT_FLAG="$GIT_FLAG --squash" | |
pushd $ROOT &>/dev/null | |
# add or update subtree to vendor dir | |
DIR="$(get_vendor_dir)/$PACKAGE" | |
COMMIT=${2:-master} | |
if [ -e "$DIR" ]; then | |
git subtree pull --prefix $DIR $REMOTE $COMMIT $GIT_FLAG || return 4 | |
else | |
mkdir -p "$(dirname "$DIR")" || return 3 | |
git subtree add --prefix $DIR $REMOTE $COMMIT $GIT_FLAG || return 4 | |
fi | |
popd &>/dev/null | |
} | |
usage() { | |
NAME=`basename "$0"` | |
cat << ! | |
Easy git-subtree. Clone or update external git repo into a subdirectory. | |
Usage: | |
$NAME GIT-URL [COMMIT] | |
For example, | |
$NAME github.com/jamesgraves/example-go-app | |
$NAME http://github.com/jamesgraves/example-go-app master | |
Options: | |
export VENDOR=vendor # vendor directory, relative to git top level | |
# default: src/vendor if src exists, otherwise vendor | |
export SQUASH=1 # 1 or 0. if 1, use --squash to discard history | |
# default: 1 | |
! | |
} | |
if [ -z "$1" ]; then | |
usage | |
else | |
main "$@" | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment