diff --git a/dist/tools/git/README.md b/dist/tools/git/README.md index 430b5d890b2a42a87c165d976d4e6cd406fdfa60..e55b492de7e8ac261a130db9fb7483f08a8b3756 100644 --- a/dist/tools/git/README.md +++ b/dist/tools/git/README.md @@ -16,6 +16,10 @@ In order to set up the cache, do: The used path can be overridden using the "GIT_CACHE_DIR" environment variable. The cache repository will be used to cache multiple remote repositories. -- add a repository to the cache: "git cache add \<name\> \<URL\> +- add a repository to the cache: "git cache add \<URL\> [\<name\>] - whenever needed (at least once after adding a repository), run "git cache update" + +If the GIT_CACHE_AUTOADD environment variable is set to "1", a "git cache +clone" will add the repository to the cache (and immediately update) if the url +is not yet in the cache. diff --git a/dist/tools/git/git-cache b/dist/tools/git/git-cache index b666409dbe2ebb7ffec979e85c685000a2789375..f19ccd9441836da2886b331c26ef3744ad94c37d 100755 --- a/dist/tools/git/git-cache +++ b/dist/tools/git/git-cache @@ -6,7 +6,8 @@ git_cache() { init() { set -ex - test -d "${GIT_CACHE_DIR}/.git" || { + local _git_dir="$(git_cache rev-parse --git-dir 2>/dev/null)" + test "$_git_dir" == "." -o "$_git_dir" == ".git" || { mkdir -p "${GIT_CACHE_DIR}" git_cache init --bare @@ -17,7 +18,19 @@ init() { add() { set -ex - git_cache remote add $1 $2 + if [ $# -eq 1 ]; then + local repo="$1" + local name="$(_remote_name $repo)" + else + local repo="$1" + local name="$2" + fi + + if ! is_cached "$repo"; then + git_cache remote add "$name" "$repo" + else + echo "git-cache: $url already in cache" + fi set +ex } @@ -28,6 +41,17 @@ update() { set +ex } +is_cached() { + set +ex + local url="$1" + local REMOTES="$(git_cache remote show)" + for remote in $REMOTES; do + test "$(git_cache remote get-url $remote)" == "$url" && return 0 + done + set -ex + return 1 +} + list() { local REMOTES="$(git_cache remote show)" for remote in $REMOTES; do @@ -50,13 +74,24 @@ _check_commit() { git_cache cat-file -e ${1}^{commit} } +_remote_name() { + basename "$*" .git +} + clone() { set -ex local REMOTE="${1}" local SHA1="${2}" - local REMOTE_NAME="$(basename $REMOTE)" + local REMOTE_NAME="$(_remote_name $REMOTE)" local TARGET_PATH="${3:-${REMOTE_NAME}}" + if [ "$GIT_CACHE_AUTOADD" == "1" ]; then + if ! is_cached "$REMOTE"; then + add "$REMOTE" + update "$(_remote_name $REMOTE)" + fi + fi + if _check_commit $2 2>&1; then git init "${TARGET_PATH}" git_cache tag commit$SHA1 $SHA1 || true # ignore possibly already existing tag @@ -76,7 +111,8 @@ usage() { echo "usage:" echo "" echo " git cache init initialize git cache" - echo " git cache add <name> <url> add repository <url> with name <name>" + echo " git cache add <url> [<name>] add repository <url> with name <name>" + echo " (if no name given, use \"basename $url .git\"" echo " git cache list list cached repositories" echo " git cache drop <name> drop repo from cache" echo " git cache update [<name>] fetch repo named <name> (or all)"