| #!/bin/sh |
| |
| NWD=contrib/workdir/git-new-workdir |
| MASTER=master |
| |
| section () { |
| printf "\033]0;%s %s\007" "$branch" "$*" |
| |
| printf "\n\n\n" |
| printf "############ %s %s\n" "$branch" "$*" |
| 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= with_meson= |
| 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 ;; |
| --meson) with_meson=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 |
| |
| 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 |
| |
| private=$(git rev-parse -q --verify private-$branch 2>/dev/null) |
| case $? in 0|1) ;; *) exit $? ;; esac |
| |
| 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_meson" && test -f "meson.build" |
| then |
| section meson |
| rm -fr "../.$branch.boson" && |
| meson setup "../.$branch.boson" && |
| ( |
| cd "../.$branch.boson" && |
| meson compile && |
| meson test |
| ) || exit $? |
| fi && |
| |
| # 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 $jobs $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 |