326 lines
6.5 KiB
Bash
Executable File
326 lines
6.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
NWD=contrib/workdir/git-new-workdir
|
|
MASTER=master
|
|
|
|
section () {
|
|
printf "\n\n\n"
|
|
printf "############ %s\n" "$@"
|
|
printf "\n\n\n"
|
|
}
|
|
|
|
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= with_leaks= with_sha256= 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 ;;
|
|
--leaks) with_leaks=t ;;
|
|
--sha256) with_sha256=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) &&
|
|
|
|
# cocci
|
|
if test -n "$with_cocci"
|
|
then
|
|
section coccicheck
|
|
Meta/Make $M $jobs -- coccicheck
|
|
fi &&
|
|
|
|
# sparse
|
|
section sparse
|
|
Meta/Make $M $jobs -- NO_REGEX=NoThanks \
|
|
SPARSE_FLAGS=-Wsparse-error sparse &&
|
|
rm -f compat/regex/regex.o &&
|
|
|
|
# hdr
|
|
section hdr-check
|
|
Meta/Make $M $jobs -- hdr-check &&
|
|
|
|
# SANITIZE=address,undefined
|
|
case "$dotest,$san" in
|
|
'')
|
|
;;
|
|
test,)
|
|
section test
|
|
Meta/Make $M $noprove ${test+"$test"} $jobs $test_long $memtrash \
|
|
-- ${with_dash:+SHELL_PATH=/bin/dash} "$@" $dotest
|
|
;;
|
|
*,t)
|
|
section SANITIZE=address,undefined
|
|
SANITIZE=address,undefined Meta/Make $M $jobs test &&
|
|
Meta/Make >/dev/null distclean
|
|
;;
|
|
esac &&
|
|
|
|
# sha256
|
|
if test -n "$with_sha256"
|
|
then
|
|
section sha256
|
|
(
|
|
export GIT_TEST_DEFAULT_HASH=sha256
|
|
Meta/Make -j16 $T test &&
|
|
Meta/Make >/dev/null distclean
|
|
)
|
|
fi &&
|
|
|
|
# docs
|
|
{
|
|
test -n "$skip_doc" ||
|
|
if test "$save" = "$(git rev-parse HEAD)"
|
|
then
|
|
section docs
|
|
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
|
|
} &&
|
|
|
|
# leaks
|
|
if test -n "$with_leaks"
|
|
then
|
|
section leaks
|
|
(
|
|
export SANITIZE=leak
|
|
export GIT_TEST_PASSING_SANITIZE_LEAK=true
|
|
Meta/Make -j16 $T CC=clang test &&
|
|
Meta/Make -j16 >/dev/null distclean
|
|
)
|
|
fi &&
|
|
|
|
{
|
|
test z$install = znoinstall ||
|
|
if test "$save" = "$(git rev-parse HEAD)"
|
|
then
|
|
section install
|
|
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
|