From 755838425ff669264fdfc73dc6af8431ad08b545 Mon Sep 17 00:00:00 2001 From: Dylan Araps Date: Wed, 25 Aug 2021 09:21:57 +0300 Subject: [PATCH] kiss: git caching --- kiss | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/kiss b/kiss index f53fc30..f2d5dea 100755 --- a/kiss +++ b/kiss @@ -358,6 +358,8 @@ pkg_source_resolve() { # Git repository. if null "${2##git+*}"; then _res=$2 + _des=$src_dir/$1/${3:+"$3/"}${2##*/} + _des=${_des%[@#]*} # Remote source (cached). elif [ -f "$src_dir/$1/${3:+"$3/"}${2##*/}" ]; then @@ -410,12 +412,16 @@ pkg_source() { # arg4: resolved source run_hook pre-source "$1" "$src" "$_fnr" - case $_res in url+*) - # Create directory structure in source cache. This prevents cache - # conflicts between identical sources with differing dests. - mkcd "${_des%/*}" + case $_res in + url+*) + mkcd "${_des%/*}" + pkg_source_get "$_des" "${_res##url+}" + ;; - pkg_source_get "$_des" "${_res##url+}" + git+*) + mkcd "$_des" + pkg_source_git "${_res##git+}" + ;; esac # arg1: post-source @@ -443,19 +449,21 @@ pkg_source_get() { } pkg_source_git() { - # This magic will shallow clone branches, commits or the - # regular repository. It correctly handles cases where a - # shallow clone is not possible. - log "$repo_name" "Cloning $1" + com=${1##*[@#]} + com=${com#${1%[#@]*}} - # Split the source into URL + OBJECT (branch or commit). - url=$1 - com=${url##*[@#]} - com=${com#${url%[#@]*}} + log "$repo_name" "Checking out ${com:-FETCH_HEAD}" + + [ -d .git ] || { + git init + git remote add origin "${1%[#@]*}" + } + + # Only fetch latest changes if not [#]. + case $1 in *"#$com") ;; *) + git fetch -t --filter=tree:0 origin "$com" || git fetch -t + esac - git init - git remote add origin "${url%[#@]*}" - git fetch -t --filter=tree:0 origin "$com" || git fetch -t git -c advice.detachedHead=0 checkout "${com:-FETCH_HEAD}" } @@ -527,7 +535,7 @@ pkg_extract() { case $_res in git+*) - pkg_source_git "${_res##git+}" + cp -LRf "$_des/." . ;; *.tar|*.tar.??|*.tar.???|*.tar.????|*.t?z)