Staging
v0.5.1
https://github.com/git/git
Raw File
Tip revision: 181785487ecd48c7a3760ca31a6a245aabb2cbc8 authored by Junio C Hamano on 22 January 2022, 03:05:07 UTC
What's cooking (2022/01 #06)
Tip revision: 1817854
Dothem
#!/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= nodoc= notest= bootstrap= branches= jobs=
scratch= noprove= memtrash=--memtrash with_cocci=
while	case "$1" in
	--pedantic | --locale=* | --loose) M="$M $1" ;;
	--force) force=$1 ;;
	--dash) with_dash=y ;;
	--cocci) with_cocci=y ;;
	--no-cocci) with_cocci= ;;
	--long) test_long=--long ;;
	--noinstall) install=noinstall ;;
	--nodoc) nodoc=y ;;
	--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 ;;
	-j*) jobs=$1 ;;
	--) shift; break ;;
	-*) echo >&2 "Unknown option: $1"; exit 1 ;;
	*) break ;;
	esac
do
	shift
done

sh -c 'asciidoc --version >/dev/null 2>&1' || nodoc=y

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 skip_doc=$nodoc
		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" in
		'')
			;;
		y)
			saveMeta=$(readlink Meta)
			Meta/Make distclean
			git clean -f -x
			ln -s "$saveMeta" Meta
			;;
		esac &&

		case "$(git symbolic-ref HEAD)" in
		"refs/heads/$branch")
			: ;;
		*)
			git checkout "$branch" &&
			git reset --hard || exit
		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 -- SPARSE_FLAGS=-Wsparse-error sparse &&

		Meta/Make $M $noprove ${test+"$test"} $jobs $test_long $memtrash \
		    -- ${with_dash:+SHELL_PATH=/bin/dash} "$@" $dotest &&

		{
			test -n "$skip_doc" ||
			if test "$save" = "$(git rev-parse HEAD)"
			then
				Meta/Make $M $jobs -- check-docs &&
				Meta/Make $M $jobs -- 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
back to top