blob: 28d6ab30477852a3e3ddfd7d875449a75664c7a5 [file] [log] [blame]
#!/bin/bash
set -e
if test -f config.custom ; then
. config.custom
else
. config
fi
have_commit()
{
git rev-parse --verify --quiet "$1^{commit}" >/dev/null
}
checkout_commit()
{
local repo_name="$1"
local repo_url="$2"
local commit_variable="$3"
local commit="${!3}"
local old_url
# Make sure there are no uncommitted changes.
git status -s >& /dev/null
if ! git diff-index --quiet HEAD --; then
cat 1>&2 <<EOF
ERROR: $repo_name has uncommitted changes.
If you want to build from the (dirty) working tree of $repo_name,
remove $commit_variable from config.custom.
EOF
exit 1
fi
# If we don't have the needed commit, try fetching from the remote.
if ! have_commit "$commit"; then
old_url="$(git remote get-url origin)"
if [ "$old_url" != "$repo_url" ]; then
echo "$repo_name URL changed to $repo_url (previously was $old_url)"
git remote set-url origin "$repo_url"
fi
if ! git fetch origin; then
echo 1>&2 "ERROR: unable to fetch from $repo_url"
exit 1
fi
if ! have_commit "$commit"; then
echo 1>&2 "ERROR: commit $commit does not exist in $repo_url"
exit 1
fi
fi
# Check out the commit.
if [ "$(git rev-parse HEAD)" != "$(git rev-parse "$commit^{commit}")" ]
then
echo "Checking out $repo_name $commit (previously was $(git describe --always HEAD))"
fi
if [ -z "$NO_ACTION" ]; then
git checkout --quiet "$commit"
fi
}
setup_repo()
{
local repo_name="$1"
local repo_url_variable="$2"
local repo_url="${!2}"
local commit_variable="$3"
local commit="${!3}"
local required="$4"
# Clone the repository if needed.
if [ ! -d "$repo_name" ]; then
if [ -z "$repo_url" ]; then
if ! $required; then
return
fi
echo 1>&2 "$repo_url_variable not set; check your config file!"
exit 1
fi
echo
if [ -n "$NO_ACTION" ]; then
echo "Clone $repo_url into $repo_name"
if [ -n "$commit" ]; then
echo "Checkout commit $commit into $repo_name"
return
fi
else
mkdir -p $(dirname "$repo_name")
if ! git clone "$repo_url" "$repo_name"; then
echo 1>&2 "Failed to clone $repo_name from $repo_url"
exit 1
fi
fi
fi
if [ -z "$repo_url" ] && ! $required; then
cat 1>&2 <<EOF
ERROR: $repo_url_variable has been removed from the config file,
but the $repo_name directory still exists. Remove it if you don't
want it to be built.
EOF
exit 1
fi
# If a specific commit was specified, check it out.
if [ -n "$commit" ]; then
( cd "$repo_name";
checkout_commit "$repo_name" "$repo_url" "$commit_variable";
)
fi
}
while [ "$1" != "" ]; do
case $1 in
-n|--no-action)
NO_ACTION=echo
;;
*)
echo "usage: get-all [--no-action]"
exit 1
;;
esac
shift
done
# required repositories
setup_repo fio FIO_GIT FIO_COMMIT true
setup_repo quota QUOTA_GIT QUOTA_COMMIT true
setup_repo xfsprogs-dev XFSPROGS_GIT XFSPROGS_COMMIT true
setup_repo xfstests-dev XFSTESTS_GIT XFSTESTS_COMMIT true
setup_repo fsverity FSVERITY_GIT FSVERITY_COMMIT true
setup_repo blktests BLKTESTS_GIT BLKTESTS_COMMIT true
# optional repositories
setup_repo ima-evm-utils IMA_EVM_UTILS_GIT IMA_EVM_UTILS_COMMIT false
setup_repo keyutils KEYUTILS_GIT KEYUTILS_COMMIT false
setup_repo stress-ng STRESS_NG_GIT STRESS_NG_COMMIT false
setup_repo util-linux UTIL_LINUX_GIT UTIL_LINUX_COMMIT false
setup_repo go/src/github.com/google/syzkaller SYZKALLER_GIT SYZKALLER_COMMIT false
setup_repo nvme-cli NVME_CLI_GIT NVME_CLI_COMMIT false
# Make sure acl doesn't try regenerate these files because of the
# vagrancies of the timestamps when they were checked out
touch acl/aclocal.m4 acl/configure acl/Makefile.in