git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: greened@obbligato.org (David A. Greene)
To: git@vger.kernel.org
Cc: techlivezheng@gmail.com, alex.crezoff@gmail.com,
	davvid@gmail.com, cbailey32@bloomberg.net, danny0838@gmail.com,
	prohaska@zib.de, th.acker@arcor.de, sschuberth@gmail.com,
	peff@peff.net, gitter.spiros@gmail.com, nod.helm@gmail.com
Subject: Re: [PATCH 1/7] contrib/subtree: Clean and refactor test code
Date: Tue, 10 Nov 2015 20:52:39 -0600	[thread overview]
Message-ID: <87egfx1c3s.fsf@waller.obbligato.org> (raw)
In-Reply-To: <1446780903-22156-2-git-send-email-greened@obbligato.org> (David Greene's message of "Thu, 5 Nov 2015 21:34:57 -0600")

David Greene <greened@obbligato.org> writes:

Just a ping to ask if anyone has looked at this.  Apparently send-email
uses the commit author as the From address.  These messages are actually
from me, sent on behalf of the commit authors.

I've got more coming, but want to get these in first as they clean up
the testsuite and will make adding future changes easier.

                      -David

> From: Techlive Zheng <techlivezheng@gmail.com>
>
> Mostly prepare for the later tests refactoring.  This moves some
> common code to helper functions and generally cleans things up to be
> more presentable.
>
> Signed-off-by: Techlive Zheng <techlivezheng@gmail.com>
> Signed-off-by: David A. Greene <greened@obbligato.org>
> ---
>  contrib/subtree/t/Makefile         |  31 ++++++++---
>  contrib/subtree/t/t7900-subtree.sh | 103 ++++++++++++++++++++-----------------
>  2 files changed, 79 insertions(+), 55 deletions(-)
>
> diff --git a/contrib/subtree/t/Makefile b/contrib/subtree/t/Makefile
> index c864810..276898e 100644
> --- a/contrib/subtree/t/Makefile
> +++ b/contrib/subtree/t/Makefile
> @@ -13,11 +13,23 @@ TAR ?= $(TAR)
>  RM ?= rm -f
>  PROVE ?= prove
>  DEFAULT_TEST_TARGET ?= test
> +TEST_LINT ?= test-lint
> +
> +ifdef TEST_OUTPUT_DIRECTORY
> +TEST_RESULTS_DIRECTORY = $(TEST_OUTPUT_DIRECTORY)/test-results
> +else
> +TEST_RESULTS_DIRECTORY = ../../../t/test-results
> +endif
>  
>  # Shell quote;
>  SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
> +PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
> +TEST_RESULTS_DIRECTORY_SQ = $(subst ','\'',$(TEST_RESULTS_DIRECTORY))
>  
> -T = $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)
> +T = $(sort $(wildcard t[0-9][0-9][0-9][0-9]-*.sh))
> +TSVN = $(sort $(wildcard t91[0-9][0-9]-*.sh))
> +TGITWEB = $(sort $(wildcard t95[0-9][0-9]-*.sh))
> +THELPERS = $(sort $(filter-out $(T),$(wildcard *.sh)))
>  
>  all: $(DEFAULT_TEST_TARGET)
>  
> @@ -26,20 +38,22 @@ test: pre-clean $(TEST_LINT)
>  
>  prove: pre-clean $(TEST_LINT)
>  	@echo "*** prove ***"; GIT_CONFIG=.git/config $(PROVE) --exec '$(SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
> -	$(MAKE) clean
> +	$(MAKE) clean-except-prove-cache
>  
>  $(T):
>  	@echo "*** $@ ***"; GIT_CONFIG=.git/config '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
>  
>  pre-clean:
> -	$(RM) -r test-results
> +	$(RM) -r '$(TEST_RESULTS_DIRECTORY_SQ)'
>  
> -clean:
> -	$(RM) -r 'trash directory'.* test-results
> +clean-except-prove-cache:
> +	$(RM) -r 'trash directory'.* '$(TEST_RESULTS_DIRECTORY_SQ)'
>  	$(RM) -r valgrind/bin
> +
> +clean: clean-except-prove-cache
>  	$(RM) .prove
>  
> -test-lint: test-lint-duplicates test-lint-executable
> +test-lint: test-lint-duplicates test-lint-executable test-lint-shell-syntax
>  
>  test-lint-duplicates:
>  	@dups=`echo $(T) | tr ' ' '\n' | sed 's/-.*//' | sort | uniq -d` && \
> @@ -51,12 +65,15 @@ test-lint-executable:
>  		test -z "$$bad" || { \
>  		echo >&2 "non-executable tests:" $$bad; exit 1; }
>  
> +test-lint-shell-syntax:
> +	@'$(PERL_PATH_SQ)' ../../../t/check-non-portable-shell.pl $(T) $(THELPERS)
> +
>  aggregate-results-and-cleanup: $(T)
>  	$(MAKE) aggregate-results
>  	$(MAKE) clean
>  
>  aggregate-results:
> -	for f in ../../../t/test-results/t*-*.counts; do \
> +	for f in '$(TEST_RESULTS_DIRECTORY_SQ)'/t*-*.counts; do \
>  		echo "$$f"; \
>  	done | '$(SHELL_PATH_SQ)' ../../../t/aggregate-results.sh
>  
> diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
> index dfbe443..f9dda3d 100755
> --- a/contrib/subtree/t/t7900-subtree.sh
> +++ b/contrib/subtree/t/t7900-subtree.sh
> @@ -5,7 +5,7 @@
>  #
>  test_description='Basic porcelain support for subtrees
>  
> -This test verifies the basic operation of the merge, pull, add
> +This test verifies the basic operation of the add, pull, merge
>  and split subcommands of git subtree.
>  '
>  
> @@ -20,7 +20,6 @@ create()
>  	git add "$1"
>  }
>  
> -
>  check_equal()
>  {
>  	test_debug 'echo'
> @@ -38,6 +37,30 @@ undo()
>  	git reset --hard HEAD~
>  }
>  
> +# Make sure no patch changes more than one file.
> +# The original set of commits changed only one file each.
> +# A multi-file change would imply that we pruned commits
> +# too aggressively.
> +join_commits()
> +{
> +	commit=
> +	all=
> +	while read x y; do
> +		if [ -z "$x" ]; then
> +			continue
> +		elif [ "$x" = "commit:" ]; then
> +			if [ -n "$commit" ]; then
> +				echo "$commit $all"
> +				all=
> +			fi
> +			commit="$y"
> +		else
> +			all="$all $y"
> +		fi
> +	done
> +	echo "$commit $all"
> +}
> +
>  last_commit_message()
>  {
>  	git log --pretty=format:%s -1
> @@ -123,9 +146,11 @@ test_expect_success 'add subproj to mainline' '
>  	check_equal ''"$(last_commit_message)"'' "Add '"'sub dir/'"' from commit '"'"'''"$(git rev-parse sub1)"'''"'"'"
>  '
>  
> -# this shouldn't actually do anything, since FETCH_HEAD is already a parent
> -test_expect_success 'merge fetched subproj' '
> -	git merge -m "merge -s -ours" -s ours FETCH_HEAD
> +test_expect_success 'merge the added subproj again, should do nothing' '
> +	# this shouldn not actually do anything, since FETCH_HEAD
> +	# is already a parent
> +	result=$(git merge -s ours -m "merge -s -ours" FETCH_HEAD) &&
> +	check_equal "${result}" "Already up-to-date."
>  '
>  
>  test_expect_success 'add main-sub5' '
> @@ -167,7 +192,7 @@ test_expect_success 'merge new subproj history into subdir' '
>  	undo
>  '
>  
> -test_expect_success 'Check that prefix argument is required for split' '
> +test_expect_success 'split requires option --prefix' '
>  	echo "You must provide the --prefix option." > expected &&
>  	test_must_fail git subtree split > actual 2>&1 &&
>  	test_debug "printf '"'"'expected: '"'"'" &&
> @@ -178,15 +203,15 @@ test_expect_success 'Check that prefix argument is required for split' '
>  	rm -f expected actual
>  '
>  
> -test_expect_success 'Check that the <prefix> exists for a split' '
> -	echo "'"'"'non-existent-directory'"'"'" does not exist\; use "'"'"'git subtree add'"'"'" > expected &&
> +test_expect_success 'split requires path given by option --prefix must exist' '
> +	echo "'\''non-existent-directory'\'' does not exist; use '\''git subtree add'\''" > expected &&
>  	test_must_fail git subtree split --prefix=non-existent-directory > actual 2>&1 &&
>  	test_debug "printf '"'"'expected: '"'"'" &&
>  	test_debug "cat expected" &&
>  	test_debug "printf '"'"'actual: '"'"'" &&
>  	test_debug "cat actual" &&
> -	test_cmp expected actual
> -#	rm -f expected actual
> +	test_cmp expected actual &&
> +	rm -f expected actual
>  '
>  
>  test_expect_success 'check if --message works for split+rejoin' '
> @@ -279,18 +304,22 @@ test_expect_success 'merge split into subproj' '
>  
>  chkm="main4
>  main6"
> +
>  chkms="main-sub10
>  main-sub5
>  main-sub7
>  main-sub8"
> +
>  chkms_sub=$(cat <<TXT | sed 's,^,sub dir/,'
>  $chkms
>  TXT
>  )
> +
>  chks="sub1
>  sub2
>  sub3
>  sub9"
> +
>  chks_sub=$(cat <<TXT | sed 's,^,sub dir/,'
>  $chks
>  TXT
> @@ -301,6 +330,7 @@ test_expect_success 'make sure exactly the right set of files ends up in the sub
>  	check_equal "$subfiles" "$chkms
>  $chks"
>  '
> +
>  test_expect_success 'make sure the subproj history *only* contains commits that affect the subdir' '
>  	allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | sed "/^$/d")"'' &&
>  	check_equal "$allchanges" "$chkms
> @@ -324,26 +354,27 @@ $chks_sub"
>  '
>  
>  test_expect_success 'make sure each filename changed exactly once in the entire history' '
> -	# main-sub?? and /subdir/main-sub?? both change, because those are the
> -	# changes that were split into their own history.  And subdir/sub?? never
> +	# main-sub?? and sub dir/main-sub?? both change, because those are the
> +	# changes that were split into their own history.  And sub dir/sub?? never
>  	# change, since they were *only* changed in the subtree branch.
>  	allchanges=''"$(git log --name-only --pretty=format:'"''"' | sort | sed "/^$/d")"'' &&
> -	check_equal "$allchanges" ''"$(cat <<TXT | sort
> +	expected=''"$(cat <<TXT | sort
>  $chkms
>  $chkm
>  $chks
>  $chkms_sub
>  TXT
> -)"''
> +)"'' &&
> +	check_equal "$allchanges" "$expected"
>  '
>  
>  test_expect_success 'make sure the --rejoin commits never make it into subproj' '
> -	check_equal ''"$(git log --pretty=format:'"'%s'"' HEAD^2 | grep -i split)"'' ""
> +	check_equal "$(git log --pretty=format:"%s" HEAD^2 | grep -i split)" ""
>  '
>  
>  test_expect_success 'make sure no "git subtree" tagged commits make it into subproj' '
>  	# They are meaningless to subproj since one side of the merge refers to the mainline
> -	check_equal ''"$(git log --pretty=format:'"'%s%n%b'"' HEAD^2 | grep "git-subtree.*:")"'' ""
> +	check_equal "$(git log --pretty=format:"%s%n%b" HEAD^2 | grep "git-subtree.*:")" ""
>  '
>  
>  # prepare second pair of repositories
> @@ -408,13 +439,13 @@ test_expect_success 'split for main-sub4 without --onto' '
>  	git subtree split --prefix "sub dir" --branch mainsub4
>  '
>  
> -# at this point, the new commit parent should be sub3 if it is not,
> +# At this point, the new commit parent should be sub3.  If it is not,
>  # something went wrong (the "newparent" of "master~" commit should
>  # have been sub3, but it was not, because its cache was not set to
> -# itself)
> +# itself).
>  
>  test_expect_success 'check that the commit parent is sub3' '
> -	check_equal ''"$(git log --pretty=format:%P -1 mainsub4)"'' ''"$(git rev-parse sub3)"''
> +	check_equal "$(git log --pretty=format:%P -1 mainsub4)" "$(git rev-parse sub3)"
>  '
>  
>  test_expect_success 'add main-sub5' '
> @@ -431,36 +462,12 @@ test_expect_success 'split for main-sub5 without --onto' '
>  	check_equal ''"$(git log --pretty=format:%P -1 mainsub5)"'' ""
>  '
>  
> -# make sure no patch changes more than one file.  The original set of commits
> -# changed only one file each.  A multi-file change would imply that we pruned
> -# commits too aggressively.
> -joincommits()
> -{
> -	commit=
> -	all=
> -	while read x y; do
> -		#echo "{$x}" >&2
> -		if [ -z "$x" ]; then
> -			continue
> -		elif [ "$x" = "commit:" ]; then
> -			if [ -n "$commit" ]; then
> -				echo "$commit $all"
> -				all=
> -			fi
> -			commit="$y"
> -		else
> -			all="$all $y"
> -		fi
> -	done
> -	echo "$commit $all"
> -}
> -
>  test_expect_success 'verify one file change per commit' '
>  	x= &&
> -	list=''"$(git log --pretty=format:'"'commit: %H'"' | joincommits)"'' &&
> +	list=''"$(git log --pretty=format:'"'commit: %H'"' | join_commits)"'' &&
>  #	test_debug "echo HERE" &&
>  #	test_debug "echo ''"$list"''" &&
> -	(git log --pretty=format:'"'commit: %H'"' | joincommits |
> +	git log --pretty=format:'"'commit: %H'"' | join_commits |
>  	(	while read commit a b; do
>  			test_debug "echo Verifying commit "''"$commit"''
>  			test_debug "echo a: "''"$a"''
> @@ -468,15 +475,15 @@ test_expect_success 'verify one file change per commit' '
>  			check_equal "$b" ""
>  			x=1
>  		done
> -		check_equal "$x" 1
> -	))
> +		check_equal "$x" "1"
> +	)
>  '
>  
>  # test push
>  
>  cd ../..
>  
> -mkdir test-push
> +mkdir -p test-push
>  
>  cd test-push

  reply	other threads:[~2015-11-11  2:53 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-06  3:34 (unknown), David Greene
2015-11-06  3:34 ` [PATCH 1/7] contrib/subtree: Clean and refactor test code David Greene
2015-11-11  2:52   ` David A. Greene [this message]
2015-11-06  3:34 ` [PATCH 2/7] contrib/subtree: Add test for missing subtree David Greene
2015-11-06  3:34 ` [PATCH 3/7] contrib/subtree: Add tests for subtree add David Greene
2015-11-06  3:35 ` [PATCH 4/7] contrib/subtree: Add merge tests David Greene
2015-11-06  3:35 ` [PATCH 5/7] contrib/subtree: Add split tests David Greene
2015-11-06  3:35 ` [PATCH 6/7] contrib/subtree: Make each test self-contained David Greene
2015-11-06  3:35 ` [PATCH 7/7] contrib/subtree: Handle '--prefix' argument with a slash appended David Greene
  -- strict thread matches above, loose matches on Subject: below --
2015-11-13  2:32 [PATCH 0/7] contrib/subtree: Testsuite cleanup David Greene
2015-11-13  2:32 ` [PATCH 1/7] contrib/subtree: Clean and refactor test code David Greene

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87egfx1c3s.fsf@waller.obbligato.org \
    --to=greened@obbligato.org \
    --cc=alex.crezoff@gmail.com \
    --cc=cbailey32@bloomberg.net \
    --cc=danny0838@gmail.com \
    --cc=davvid@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitter.spiros@gmail.com \
    --cc=nod.helm@gmail.com \
    --cc=peff@peff.net \
    --cc=prohaska@zib.de \
    --cc=sschuberth@gmail.com \
    --cc=techlivezheng@gmail.com \
    --cc=th.acker@arcor.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).