From e65541817c830ca151729fc406782484a925aa75 Mon Sep 17 00:00:00 2001 From: Kaspar Schleiser <kaspar@schleiser.de> Date: Thu, 15 Dec 2016 10:59:47 +0100 Subject: [PATCH] dist: tools: bump git-cache version (#6217) --- dist/tools/git/README.md | 6 +++++- dist/tools/git/git-cache | 44 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/dist/tools/git/README.md b/dist/tools/git/README.md index 430b5d890b..e55b492de7 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 b666409dbe..f19ccd9441 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)" -- GitLab