blob: 6598da676b618111bbd1c1c26e4cf91cc3f7281f [file] [log] [blame]
#!/bin/sh
NWD=contrib/workdir/git-new-workdir
MASTER=master
inst_prefix=$(
IFS=:
for p in $PATH
do
probed=${p%/git-active/bin}
if test "$probed" != "$p"
then
echo "$probed"
exit
fi
done
echo $HOME
)
force= with_dash= test_long= M= install= doc= notest= bootstrap= branches= jobs=
scratch= noprove= memtrash=--memtrash with_cocci= san= clean=
while case "$1" in
--pedantic | --locale=* | --loose) M="$M $1" ;;
--force) force=$1 ;;
--dash) with_dash=y ;;
--clean) clean=y ;;
--cocci) with_cocci=y ;;
--no-cocci) with_cocci= ;;
--long) test_long=--long ;;
--noinstall) install=noinstall ;;
--nodoc) doc=no ;;
--asciidoc) doc=asciidoc ;;
--asciidoctor) doc=ascidoctor ;;
--notest) notest=y ;;
--nomemtrash) memtrash= ;;
--memtrash) memtrash=--memtrash ;;
--test=*) test="$1" ;;
--scratch) scratch=y ;;
--bootstrap) bootstrap=y ;;
--base=*) BUILDBASE=${1#*=} ;;
--branches=*) branches=${1#*=} ;;
--noprove) noprove=$1 ;;
--san) san=t ;;
-j*) jobs=$1 ;;
--) shift; break ;;
-*) echo >&2 "Unknown option: $1"; exit 1 ;;
*) break ;;
esac
do
shift
done
if test -n "$doc"
then
: ;# happy with whatever specified
elif sh -c 'asciidoc --version >/dev/null 2>&1'
then
doc=asciidoc
elif sh -c 'asciidoctor --version >/dev/null 2>&1'
then
doc=asciidoctor
else
doc=no
fi
if test "$doc" = asciidoctor
then
USE_ASCIIDOCTOR=YesPlease
else
USE_ASCIIDOCTOR=
fi
GIT_TEST_CHAIN_LINT=1
export GIT_TEST_CHAIN_LINT
GIT_PROVE_OPTS="${GIT_PROVE_OPTS:+$GIT_PROVE_OPTS }--state=slow,save"
export GIT_PROVE_OPTS
test -f /bin/dash || with_dash=
if test -z "$BUILDBASE"
then
if test -d "$inst_prefix/buildfarm"
then
BUILDBASE="$inst_prefix/buildfarm"
elif test -d "../buildfarm"
then
BUILDBASE=../buildfarm
else
echo >&2 "Buildbase unknown"
exit 1
fi
fi
test -n "$branches" || branches="next $MASTER maint jch seen"
test -n "$jobs" || jobs=-j2
find_installed () {
branch=$1
test -f "$inst_prefix/git-$branch/bin/git" &&
installed=$($inst_prefix/git-$branch/bin/git version) &&
if version=$(expr "$installed" : '.*\.g\([0-9a-f]*\)$')
then
:
elif version=v$(expr "$installed" : \
'git version \(.*\)\.rc[0-9]*$')
then
version="$version"-$(expr "$installed" : \
'git version .*\.\(rc[0-9]*\)$')
else
version=v$(expr "$installed" : 'git version \(.*\)')
fi &&
git rev-parse --verify "$version^0" 2>/dev/null
}
installed_source_trees=" "
for branch in $branches
do
if v=$(find_installed $branch) &&
test -n "$v" &&
v=$(git rev-parse --verify "$v^{tree}" 2>/dev/null)
then
installed_source_trees="$installed_source_trees$v "
fi
done
for branch in $branches
do
echo "** $branch **"
revision=$(git show-ref -s --verify "refs/heads/$branch") || {
echo "** No $branch"
continue
}
if test ! -d "$BUILDBASE/$branch"
then
if test -z "$bootstrap"
then
echo "** No $BUILDBASE/$branch"
continue
fi
"$NWD" . "$BUILDBASE/$branch" $branch &&
ln -s "$(pwd)/Meta" "$BUILDBASE/$branch/Meta" || {
echo "** Failed to bootstrap $BUILDBASE/$branch"
continue
}
fi
private=$(git rev-parse -q --verify private-$branch 2>/dev/null)
case $? in 0|1) ;; *) exit $? ;; esac
version=$(find_installed $branch)
if test "z$version" = "z$revision"
then
echo "* up-to-date version is already installed from $branch"
test -n "$force" || continue
fi
vtree=$(git rev-parse --verify "$version^{tree}")
rtree=$(git rev-parse --verify "$revision^{tree}")
(
skip_test=$notest
case "$doc" in no) skip_doc=1 ;; *) skip_doc= ;; esac
case "$force" in
?*)
;;
'')
for xtree in $installed_source_trees $vtree
do
if test "z$xtree" = "z$rtree" ||
git diff --quiet "$xtree" "$rtree" -- . \
':!GIT-VERSION-GEN' \
':!RelNotes' \
':!Documentation/'
then
skip_test=1
break
fi
done
dvtree=$(git rev-parse --verify "$version:Documentation/")
drtree=$(git rev-parse --verify "$revision:Documentation/")
if test "z$dvtree" = "z$drtree"
then
skip_doc=1
fi
;;
esac
case "$skip_test" in
?*) dotest= ;;
'') dotest=test ;;
esac
cd "$BUILDBASE/$branch"
git reset --hard &&
case "$scratch$clean" in
'')
;;
*y*)
saveMeta=$(readlink Meta)
Meta/Make distclean
git clean -f -x -d
ln -s "$saveMeta" Meta
;;
esac &&
case "$(git symbolic-ref HEAD)" in
"refs/heads/$branch")
: ;;
*)
git checkout "$branch" &&
git reset --hard || exit
esac &&
case "$clean" in
y) exit 0 ;;
esac &&
case "$private" in
'')
;;
?*)
git merge --squash --no-commit "$private" || {
echo >&2 "** Cannot apply private edition changes"
git reset --hard
}
;;
esac &&
save=$(git rev-parse HEAD) &&
if test -n "$with_cocci"
then
Meta/Make $M $jobs -- coccicheck
fi &&
Meta/Make $M $jobs -- NO_REGEX=NoThanks \
SPARSE_FLAGS=-Wsparse-error sparse &&
rm -f compat/regex/regex.o &&
Meta/Make $M $jobs -- hdr-check &&
case "$dotest,$san" in
'')
;;
test,)
Meta/Make $M $noprove ${test+"$test"} $jobs $test_long $memtrash \
-- ${with_dash:+SHELL_PATH=/bin/dash} "$@" $dotest
;;
*,t)
SANITIZE=address,undefined Meta/Make $M $jobs test &&
Meta/Make >/dev/null distclean
;;
esac &&
{
test -n "$skip_doc" ||
if test "$save" = "$(git rev-parse HEAD)"
then
Meta/Make $M $jobs -- check-docs &&
Meta/Make $M $jobs -- $USE_ASCIIDOCTOR doc &&
Meta/Make $M -- install-man install-html
else
echo >&2 "Head moved--not installing docs"
fi
} &&
{
test z$install = znoinstall ||
if test "$save" = "$(git rev-parse HEAD)"
then
Meta/Make $M -- ${with_dash:+SHELL_PATH=/bin/dash} "$@" install
else
echo >&2 "Head moved--not installing"
fi
} || exit $?
git reset --hard
) </dev/null || exit $?
installed_source_trees="$installed_source_trees$rtree "
done