download/git: ensure we have a sane repository

There are cases where a repository might be broken, e.g. when a previous
operation was killed or otherwise failed unexpectedly.

We fix that by always initialising the repository, as suggested by
Ricardo. git-init is safe on an otherwise-healthy repository:

    Running git init in an existing repository is safe. It will not
    overwrite things that are already there. [...]

Using git-init will just ensure that we have the strictly required files
to form a sane tree. Any blob that is still missing would get fetched
later on.

Reported-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Reported-by: Ricardo Martincoski <ricardo.martincoski@gmail.com>
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Ricardo Martincoski <ricardo.martincoski@gmail.com>
Cc: Maxime Hadjinlian <maxime.hadjinlian@gmail.com>
Cc: Arnout Vandecappelle <arnout@mind.be>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Acked-by: Ricardo Martincoski <ricardo.martincoski@gmail.com>
Tested-by: Ricardo Martincoski <ricardo.martincoski@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
This commit is contained in:
Yann E. MORIN 2018-04-17 18:48:21 +02:00 committed by Thomas Petazzoni
parent a07da16e78
commit d48a1b0d5e

View File

@ -43,14 +43,16 @@ _git() {
eval GIT_DIR="${git_cache}/.git" ${GIT} "${@}" eval GIT_DIR="${git_cache}/.git" ${GIT} "${@}"
} }
# If the cache directory doesn't exists, init a new repo, which will be # Initialise a repository in the git cache. If the repository already
# fetch'ed later. # existed, this is a noop, unless the repository was broken, in which
if [ ! -d "${git_cache}" ]; then # case this magically restores it to working conditions. In the latter
# We can still go through the wrapper, because 'init' does not use # case, we might be missing blobs, but that's not a problem: we'll
# the path pointed to by GIT_DIR, but really uses the directory # fetch what we need later anyway.
# passed as argument. #
# We can still go through the wrapper, because 'init' does not use the
# path pointed to by GIT_DIR, but really uses the directory passed as
# argument.
_git init "'${git_cache}'" _git init "'${git_cache}'"
fi
pushd "${git_cache}" >/dev/null pushd "${git_cache}" >/dev/null