4535c5323a
source-repositories uses find to discover things it should import. If someone happens to use emacs, and happens to have had an autosave file in a directory with a wildly broken version of a source-repositories- file, then dib will attempt to execute the contents of the autosave file and the user will be sad. Adding a filter to the find command for files ending in ~ will prevent pain and suffering. Change-Id: I27c8a4b53d3c9b913ca926db16b4271941f6fb5d
105 lines
4.2 KiB
Bash
Executable File
105 lines
4.2 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 --work-tree=$CACHE_PATH 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-*" -not -name '*~'); do
|
|
get_repos_for_element $_SOURCEREPO
|
|
done
|