diskimage-builder/elements/source-repositories/extra-data.d/99-getsources
Robert Collins 79ca4d901c Cache repository-sources data.
Cloning large repositories over the internet can take considerable
time.  Caching them locally makes repeated image builds significantly
faster, so lets do that.

When users override the element source they will often be using a
local repository, so in those cases I don't cache - but we could
easily change our minds on that in the future.

Change-Id: I9822362cf722b904d9806dbbb4bb07cfe2b33437
2013-07-18 22:40:23 +12:00

105 lines
4.1 KiB
Bash
Executable File

#!/bin/bash
set -eu
# Gets Repositories listed in the a repository file and places them in
# the repository directory.
# The format of the repository file is one or more lines matching
# <name> <type> <destination> <location> [<ref>]
function get_repos_for_element(){
local REPO_SOURCES=$1
local REGEX="^([^ ]+) (git|tar) (/[^ ]+) ([^ ]+) ?([^ ]*)$"
while read line ; do
# ignore blank lines and lines begining in '#'
[[ "$line" == \#* ]] || [[ -z "$line" ]] && continue
if [[ "$line" =~ $REGEX ]] ; then
local REPONAME=${BASH_REMATCH[1]}
local REPOTYPE=${BASH_REMATCH[2]}
local REPOPATH=${BASH_REMATCH[3]}
local REPOLOCATION=${BASH_REMATCH[4]}
local REPO_ORIG_LOCATION=$REPOLOCATION
local REPOREF=${BASH_REMATCH[5]:-master}
local REPO_DIRECTORY=$TMP_MOUNT_PATH$REPOPATH
local REPO_SUB_DIRECTORY=$(dirname $REPO_DIRECTORY)
# REPOTYPE can be overridden with DIB_REPOTYPE_{name}
local REPOTYPE_OVERRIDE=DIB_REPOTYPE_${REPONAME/-/_}
REPOTYPE=${!REPOTYPE_OVERRIDE:-$REPOTYPE}
# REPOLOCATION can be overridden with DIB_REPOLOCATION_{name}
local REPOLOCATION_OVERRIDE=DIB_REPOLOCATION_${REPONAME/-/_}
REPOLOCATION=${!REPOLOCATION_OVERRIDE:-$REPOLOCATION}
if [ "$REPOLOCATION" = "$REPO_ORIG_LOCATION" ] ; then
# We're pulling from the element specified repo, do caching for
# the user.
CACHE_NAME=$(echo $REPOLOCATION | sha1sum | awk '{ print $1 }' )
CACHE_PATH=~/.cache/image-create/repository-sources/$CACHE_NAME
else
CACHE_PATH=''
fi
# REPOREF can be overridden with DIB_REPOREF_{name}
local REPOREF_OVERRIDE=DIB_REPOREF_${REPONAME/-/_}
REPOREF=${!REPOREF_OVERRIDE:-$REPOREF}
case $REPOTYPE in
git)
sudo mkdir -p $REPO_SUB_DIRECTORY
if [ -n "$CACHE_PATH" ] ; then
if [ ! -e "$CACHE_PATH" ] ; then
git clone $REPOLOCATION $CACHE_PATH.tmp
mv ${CACHE_PATH}{.tmp,}
elif [ -z "$DIB_OFFLINE" ] ; then
git --git-dir=$CACHE_PATH/.git fetch
git --git-dir=$CACHE_PATH/.git reset --hard origin/master
fi
sudo git clone $CACHE_PATH $REPO_DIRECTORY
else
sudo git clone $REPOLOCATION $REPO_DIRECTORY
fi
pushd $REPO_DIRECTORY
sudo git reset --hard $REPOREF
popd
;;
tar)
# The top level directory of the tarball mightn't have a fixed name i.e.
# it could contain version numbers etc... so we write it to a tmpdir
# the then move the contents into the directory we want it in, this does
# assume the tarball only contains a single top level directory
local tmpdir=$(mktemp --tmpdir=$TMP_MOUNT_PATH/tmp -d)
if [ -n "$CACHE_PATH" ] ; then
if [ ! -f "$CACHE_PATH" -o -z "$DIB_OFFLINE" ] ; then
$TMP_MOUNT_PATH/usr/local/bin/cache-url $REPOLOCATION $CACHE_PATH
fi
tar -C $tmpdir -xzf $CACHE_PATH
else
curl $REPOLOCATION | tar -C $tmpdir -xzf -
fi
sudo mkdir -p $REPO_DIRECTORY
sudo mv $tmpdir/*/* $REPO_DIRECTORY
rm -rf $tmpdir
;;
*)
echo "Unsupported repository type"
return 1
;;
esac
else
echo "Couldn't parse '$line' as a source repository"
return 1
fi
done < $REPO_SOURCES
}
mkdir -p ~/.cache/image-create/repository-sources/
# Get source repositories for the target
for _SOURCEREPO in $(find $TMP_HOOKS_PATH -maxdepth 1 -name "source-repository-*") ; do
get_repos_for_element $_SOURCEREPO
done