Skip to content

Instantly share code, notes, and snippets.

@quark-zju
Last active October 16, 2015 11:52
Show Gist options
  • Save quark-zju/d695ae1df0e8db2d010b to your computer and use it in GitHub Desktop.
Save quark-zju/d695ae1df0e8db2d010b to your computer and use it in GitHub Desktop.
git-vendor
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