Merge branch 'ab/test-2'
* ab/test-2: (51 commits) tests: factor HOME=$(pwd) in test-lib.sh test-lib: use subshell instead of cd $new && .. && cd $old tests: simplify "missing PREREQ" message t/t0000-basic.sh: Run the passing TODO test inside its own test-lib test-lib: Allow overriding of TEST_DIRECTORY test-lib: Use "$GIT_BUILD_DIR" instead of "$TEST_DIRECTORY"/../ test-lib: Use $TEST_DIRECTORY or $GIT_BUILD_DIR instead of $(pwd) and ../ test: Introduce $GIT_BUILD_DIR cvs tests: do not touch test CVS repositories shipped with source t/t9602-cvsimport-branches-tags.sh: Add a PERL prerequisite t/t9601-cvsimport-vendor-branch.sh: Add a PERL prerequisite t/t7105-reset-patch.sh: Add a PERL prerequisite t/t9001-send-email.sh: convert setup code to tests t/t9001-send-email.sh: change from skip_all=* to prereq skip t/t9001-send-email.sh: Remove needless PROG=* assignment t/t9600-cvsimport.sh: change from skip_all=* to prereq skip lib-patch-mode tests: change from skip_all=* to prereq skip t/t3701-add-interactive.sh: change from skip_all=* to prereq skip tests: Move FILEMODE prerequisite to lib-prereq-FILEMODE.sh t/Makefile: Create test-results dir for smoke target ... Conflicts: t/t6035-merge-dir-to-symlink.sh
This commit is contained in:
		
							
								
								
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -186,6 +186,12 @@ | ||||
| *.[aos] | ||||
| *.py[co] | ||||
| .depend/ | ||||
| *.gcda | ||||
| *.gcno | ||||
| *.gcov | ||||
| /coverage-untested-functions | ||||
| /cover_db/ | ||||
| /cover_db_html/ | ||||
| *+ | ||||
| /config.mak | ||||
| /autom4te.cache | ||||
|  | ||||
							
								
								
									
										25
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								Makefile
									
									
									
									
									
								
							| @ -310,6 +310,7 @@ TCL_PATH = tclsh | ||||
| TCLTK_PATH = wish | ||||
| PTHREAD_LIBS = -lpthread | ||||
| PTHREAD_CFLAGS = | ||||
| GCOV = gcov | ||||
|  | ||||
| export TCL_PATH TCLTK_PATH | ||||
|  | ||||
| @ -1499,6 +1500,7 @@ ifndef V | ||||
| 	QUIET_BUILT_IN = @echo '   ' BUILTIN $@; | ||||
| 	QUIET_GEN      = @echo '   ' GEN $@; | ||||
| 	QUIET_LNCP     = @echo '   ' LN/CP $@; | ||||
| 	QUIET_GCOV     = @echo '   ' GCOV $@; | ||||
| 	QUIET_SUBDIR0  = +@subdir= | ||||
| 	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \ | ||||
| 			 $(MAKE) $(PRINT_DIR) -C $$subdir | ||||
| @ -2324,11 +2326,18 @@ coverage: | ||||
| 	$(MAKE) coverage-build | ||||
| 	$(MAKE) coverage-report | ||||
|  | ||||
| object_dirs := $(sort $(dir $(OBJECTS))) | ||||
| coverage-clean: | ||||
| 	rm -f *.gcda *.gcno | ||||
| 	$(RM) $(addsuffix *.gcov,$(object_dirs)) | ||||
| 	$(RM) $(addsuffix *.gcda,$(object_dirs)) | ||||
| 	$(RM) $(addsuffix *.gcno,$(object_dirs)) | ||||
| 	$(RM) coverage-untested-functions | ||||
| 	$(RM) -r cover_db/ | ||||
| 	$(RM) -r cover_db_html/ | ||||
|  | ||||
| COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs | ||||
| COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov | ||||
| GCOVFLAGS = --preserve-paths --branch-probabilities --all-blocks | ||||
|  | ||||
| coverage-build: coverage-clean | ||||
| 	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all | ||||
| @ -2336,7 +2345,17 @@ coverage-build: coverage-clean | ||||
| 		-j1 test | ||||
|  | ||||
| coverage-report: | ||||
| 	gcov -b *.c | ||||
| 	$(QUIET_GCOV)for dir in $(object_dirs); do \ | ||||
| 		$(GCOV) $(GCOVFLAGS) --object-directory=$$dir $$dir*.c || exit; \ | ||||
| 	done | ||||
|  | ||||
| coverage-untested-functions: coverage-report | ||||
| 	grep '^function.*called 0 ' *.c.gcov \ | ||||
| 		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \ | ||||
| 		| tee coverage-untested-functions | ||||
| 		> coverage-untested-functions | ||||
|  | ||||
| cover_db: coverage-report | ||||
| 	gcov2perl -db cover_db *.gcov | ||||
|  | ||||
| cover_db_html: cover_db | ||||
| 	cover -report html -outputdir cover_db_html cover_db | ||||
|  | ||||
							
								
								
									
										42
									
								
								t/Makefile
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								t/Makefile
									
									
									
									
									
								
							| @ -8,6 +8,7 @@ | ||||
|  | ||||
| #GIT_TEST_OPTS=--verbose --debug | ||||
| SHELL_PATH ?= $(SHELL) | ||||
| PERL_PATH ?= /usr/bin/perl | ||||
| TAR ?= $(TAR) | ||||
| RM ?= rm -f | ||||
|  | ||||
| @ -28,7 +29,6 @@ pre-clean: | ||||
|  | ||||
| clean: | ||||
| 	$(RM) -r 'trash directory'.* test-results | ||||
| 	$(RM) t????/cvsroot/CVSROOT/?* | ||||
| 	$(RM) -r valgrind/bin | ||||
| 	$(RM) .prove | ||||
|  | ||||
| @ -49,4 +49,42 @@ full-svn-test: | ||||
| valgrind: | ||||
| 	GIT_TEST_OPTS=--valgrind $(MAKE) | ||||
|  | ||||
| .PHONY: pre-clean $(T) aggregate-results clean valgrind | ||||
| # Smoke testing targets | ||||
| -include ../GIT-VERSION-FILE | ||||
| uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo unknown') | ||||
| uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo unknown') | ||||
|  | ||||
| test-results: | ||||
| 	mkdir -p test-results | ||||
|  | ||||
| test-results/git-smoke.tar.gz: test-results | ||||
| 	$(PERL_PATH) ./harness \ | ||||
| 		--archive="test-results/git-smoke.tar.gz" \ | ||||
| 		$(T) | ||||
|  | ||||
| smoke: test-results/git-smoke.tar.gz | ||||
|  | ||||
| SMOKE_UPLOAD_FLAGS = | ||||
| ifdef SMOKE_USERNAME | ||||
| 	SMOKE_UPLOAD_FLAGS += -F username="$(SMOKE_USERNAME)" -F password="$(SMOKE_PASSWORD)" | ||||
| endif | ||||
| ifdef SMOKE_COMMENT | ||||
| 	SMOKE_UPLOAD_FLAGS += -F comments="$(SMOKE_COMMENT)" | ||||
| endif | ||||
| ifdef SMOKE_TAGS | ||||
| 	SMOKE_UPLOAD_FLAGS += -F tags="$(SMOKE_TAGS)" | ||||
| endif | ||||
|  | ||||
| smoke_report: smoke | ||||
| 	curl \ | ||||
| 		-H "Expect: " \ | ||||
| 		-F project=Git \ | ||||
| 		-F architecture="$(uname_M)" \ | ||||
| 		-F platform="$(uname_S)" \ | ||||
| 		-F revision="$(GIT_VERSION)" \ | ||||
| 		-F report_file=@test-results/git-smoke.tar.gz \ | ||||
| 		$(SMOKE_UPLOAD_FLAGS) \ | ||||
| 		http://smoke.git.nix.is/app/projects/process_add_report/1 \ | ||||
| 	| grep -v ^Redirecting | ||||
|  | ||||
| .PHONY: pre-clean $(T) aggregate-results clean valgrind smoke smoke_report | ||||
|  | ||||
							
								
								
									
										201
									
								
								t/README
									
									
									
									
									
								
							
							
						
						
									
										201
									
								
								t/README
									
									
									
									
									
								
							| @ -268,6 +268,18 @@ Do: | ||||
| 	git push gh && | ||||
| 	test ... | ||||
|  | ||||
|  - Check the test coverage for your tests. See the "Test coverage" | ||||
|    below. | ||||
|  | ||||
|    Don't blindly follow test coverage metrics, they're a good way to | ||||
|    spot if you've missed something. If a new function you added | ||||
|    doesn't have any coverage you're probably doing something wrong, | ||||
|    but having 100% coverage doesn't necessarily mean that you tested | ||||
|    everything. | ||||
|  | ||||
|    Tests that are likely to smoke out future regressions are better | ||||
|    than tests that just inflate the coverage metrics. | ||||
|  | ||||
| Don't: | ||||
|  | ||||
|  - exit() within a <script> part. | ||||
| @ -307,9 +319,21 @@ Keep in mind: | ||||
| Skipping tests | ||||
| -------------- | ||||
|  | ||||
| If you need to skip all the remaining tests you should set skip_all | ||||
| and immediately call test_done. The string you give to skip_all will | ||||
| be used as an explanation for why the test was skipped. for instance: | ||||
| If you need to skip tests you should do so be using the three-arg form | ||||
| of the test_* functions (see the "Test harness library" section | ||||
| below), e.g.: | ||||
|  | ||||
|     test_expect_success PERL 'I need Perl' " | ||||
|         '$PERL_PATH' -e 'hlagh() if unf_unf()' | ||||
|     " | ||||
|  | ||||
| The advantage of skipping tests like this is that platforms that don't | ||||
| have the PERL and other optional dependencies get an indication of how | ||||
| many tests they're missing. | ||||
|  | ||||
| If the test code is too hairy for that (i.e. does a lot of setup work | ||||
| outside test assertions) you can also skip all remaining tests by | ||||
| setting skip_all and immediately call test_done: | ||||
|  | ||||
| 	if ! test_have_prereq PERL | ||||
| 	then | ||||
| @ -317,6 +341,9 @@ be used as an explanation for why the test was skipped. for instance: | ||||
| 	    test_done | ||||
| 	fi | ||||
|  | ||||
| The string you give to skip_all will be used as an explanation for why | ||||
| the test was skipped. | ||||
|  | ||||
| End with test_done | ||||
| ------------------ | ||||
|  | ||||
| @ -350,6 +377,12 @@ library for your script to use. | ||||
| 	test_expect_success TTY 'git --paginate rev-list uses a pager' \ | ||||
| 	    ' ... ' | ||||
|  | ||||
|    You can also supply a comma-separated list of prerequisites, in the | ||||
|    rare case where your test depends on more than one: | ||||
|  | ||||
| 	test_expect_success PERL,PYTHON 'yo dawg' \ | ||||
| 	    ' test $(perl -E 'print eval "1 +" . qx[python -c "print 2"]') == "4" ' | ||||
|  | ||||
|  - test_expect_failure [<prereq>] <message> <script> | ||||
|  | ||||
|    This is NOT the opposite of test_expect_success, but is used | ||||
| @ -404,11 +437,12 @@ library for your script to use. | ||||
|  - test_set_prereq SOME_PREREQ | ||||
|  | ||||
|    Set a test prerequisite to be used later with test_have_prereq. The | ||||
|    test-lib will set some prerequisites for you, e.g. PERL and PYTHON | ||||
|    which are derived from ./GIT-BUILD-OPTIONS (grep test_set_prereq | ||||
|    test-lib.sh for more). Others you can set yourself and use later | ||||
|    with either test_have_prereq directly, or the three argument | ||||
|    invocation of test_expect_success and test_expect_failure. | ||||
|    test-lib will set some prerequisites for you, see the | ||||
|    "Prerequisites" section below for a full list of these. | ||||
|  | ||||
|    Others you can set yourself and use later with either | ||||
|    test_have_prereq directly, or the three argument invocation of | ||||
|    test_expect_success and test_expect_failure. | ||||
|  | ||||
|  - test_have_prereq SOME PREREQ | ||||
|  | ||||
| @ -488,6 +522,45 @@ library for your script to use. | ||||
| 		... | ||||
| 	' | ||||
|  | ||||
| Prerequisites | ||||
| ------------- | ||||
|  | ||||
| These are the prerequisites that the test library predefines with | ||||
| test_have_prereq. | ||||
|  | ||||
| See the prereq argument to the test_* functions in the "Test harness | ||||
| library" section above and the "test_have_prereq" function for how to | ||||
| use these, and "test_set_prereq" for how to define your own. | ||||
|  | ||||
|  - PERL & PYTHON | ||||
|  | ||||
|    Git wasn't compiled with NO_PERL=YesPlease or | ||||
|    NO_PYTHON=YesPlease. Wrap any tests that need Perl or Python in | ||||
|    these. | ||||
|  | ||||
|  - POSIXPERM | ||||
|  | ||||
|    The filesystem supports POSIX style permission bits. | ||||
|  | ||||
|  - BSLASHPSPEC | ||||
|  | ||||
|    Backslashes in pathspec are not directory separators. This is not | ||||
|    set on Windows. See 6fd1106a for details. | ||||
|  | ||||
|  - EXECKEEPSPID | ||||
|  | ||||
|    The process retains the same pid across exec(2). See fb9a2bea for | ||||
|    details. | ||||
|  | ||||
|  - SYMLINKS | ||||
|  | ||||
|    The filesystem we're on supports symbolic links. E.g. a FAT | ||||
|    filesystem doesn't support these. See 704a3143 for details. | ||||
|  | ||||
|  - SANITY | ||||
|  | ||||
|    Test is not run by root user, and an attempt to write to an | ||||
|    unwritable file is expected to fail correctly. | ||||
|  | ||||
| Tips for Writing Tests | ||||
| ---------------------- | ||||
| @ -515,3 +588,115 @@ the purpose of t0000-basic.sh, which is to isolate that level of | ||||
| validation in one place.  Your test also ends up needing | ||||
| updating when such a change to the internal happens, so do _not_ | ||||
| do it and leave the low level of validation to t0000-basic.sh. | ||||
|  | ||||
| Test coverage | ||||
| ------------- | ||||
|  | ||||
| You can use the coverage tests to find code paths that are not being | ||||
| used or properly exercised yet. | ||||
|  | ||||
| To do that, run the coverage target at the top-level (not in the t/ | ||||
| directory): | ||||
|  | ||||
|     make coverage | ||||
|  | ||||
| That'll compile Git with GCC's coverage arguments, and generate a test | ||||
| report with gcov after the tests finish. Running the coverage tests | ||||
| can take a while, since running the tests in parallel is incompatible | ||||
| with GCC's coverage mode. | ||||
|  | ||||
| After the tests have run you can generate a list of untested | ||||
| functions: | ||||
|  | ||||
|     make coverage-untested-functions | ||||
|  | ||||
| You can also generate a detailed per-file HTML report using the | ||||
| Devel::Cover module. To install it do: | ||||
|  | ||||
|    # On Debian or Ubuntu: | ||||
|    sudo aptitude install libdevel-cover-perl | ||||
|  | ||||
|    # From the CPAN with cpanminus | ||||
|    curl -L http://cpanmin.us | perl - --sudo --self-upgrade | ||||
|    cpanm --sudo Devel::Cover | ||||
|  | ||||
| Then, at the top-level: | ||||
|  | ||||
|     make cover_db_html | ||||
|  | ||||
| That'll generate a detailed cover report in the "cover_db_html" | ||||
| directory, which you can then copy to a webserver, or inspect locally | ||||
| in a browser. | ||||
|  | ||||
| Smoke testing | ||||
| ------------- | ||||
|  | ||||
| The Git test suite has support for smoke testing. Smoke testing is | ||||
| when you submit the results of a test run to a central server for | ||||
| analysis and aggregation. | ||||
|  | ||||
| Running a smoke tester is an easy and valuable way of contributing to | ||||
| Git development, particularly if you have access to an uncommon OS on | ||||
| obscure hardware. | ||||
|  | ||||
| After building Git you can generate a smoke report like this in the | ||||
| "t" directory: | ||||
|  | ||||
|     make clean smoke | ||||
|  | ||||
| You can also pass arguments via the environment. This should make it | ||||
| faster: | ||||
|  | ||||
|     GIT_TEST_OPTS='--root=/dev/shm' TEST_JOBS=10 make clean smoke | ||||
|  | ||||
| The "smoke" target will run the Git test suite with Perl's | ||||
| "TAP::Harness" module, and package up the results in a .tar.gz archive | ||||
| with "TAP::Harness::Archive". The former is included with Perl v5.10.1 | ||||
| or later, but you'll need to install the latter from the CPAN. See the | ||||
| "Test coverage" section above for how you might do that. | ||||
|  | ||||
| Once the "smoke" target finishes you'll see a message like this: | ||||
|  | ||||
|     TAP Archive created at <path to git>/t/test-results/git-smoke.tar.gz | ||||
|  | ||||
| To upload the smoke report you need to have curl(1) installed, then | ||||
| do: | ||||
|  | ||||
|     make smoke_report | ||||
|  | ||||
| To upload the report anonymously. Hopefully that'll return something | ||||
| like "Reported #7 added.". | ||||
|  | ||||
| If you're going to be uploading reports frequently please request a | ||||
| user account by E-Mailing gitsmoke@v.nix.is. Once you have a username | ||||
| and password you'll be able to do: | ||||
|  | ||||
|     SMOKE_USERNAME=<username> SMOKE_PASSWORD=<password> make smoke_report | ||||
|  | ||||
| You can also add an additional comment to attach to the report, and/or | ||||
| a comma separated list of tags: | ||||
|  | ||||
|     SMOKE_USERNAME=<username> SMOKE_PASSWORD=<password> \ | ||||
|         SMOKE_COMMENT=<comment> SMOKE_TAGS=<tags> \ | ||||
|         make smoke_report | ||||
|  | ||||
| Once the report is uploaded it'll be made available at | ||||
| http://smoke.git.nix.is, here's an overview of Recent Smoke Reports | ||||
| for Git: | ||||
|  | ||||
|     http://smoke.git.nix.is/app/projects/smoke_reports/1 | ||||
|  | ||||
| The reports will also be mirrored to GitHub every few hours: | ||||
|  | ||||
|     http://github.com/gitsmoke/smoke-reports | ||||
|  | ||||
| The Smolder SQLite database is also mirrored and made available for | ||||
| download: | ||||
|  | ||||
|     http://github.com/gitsmoke/smoke-database | ||||
|  | ||||
| Note that the database includes hashed (with crypt()) user passwords | ||||
| and E-Mail addresses. Don't use a valuable password for the smoke | ||||
| service if you have an account, or an E-Mail address you don't want to | ||||
| be publicly known. The user accounts are just meant to be convenient | ||||
| labels, they're not meant to be secure. | ||||
|  | ||||
							
								
								
									
										21
									
								
								t/harness
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										21
									
								
								t/harness
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,21 @@ | ||||
| #!/usr/bin/perl | ||||
| use strict; | ||||
| use warnings; | ||||
| use Getopt::Long (); | ||||
| use TAP::Harness::Archive; | ||||
|  | ||||
| Getopt::Long::Parser->new( | ||||
| 	config => [ qw/ pass_through / ], | ||||
| )->getoptions( | ||||
| 	'jobs:1'    => \(my $jobs = $ENV{TEST_JOBS}), | ||||
| 	'archive=s' => \my $archive, | ||||
| ) or die "$0: Couldn't getoptions()"; | ||||
|  | ||||
| TAP::Harness::Archive->new({ | ||||
| 	jobs             => $jobs, | ||||
| 	archive          => $archive, | ||||
| 	($ENV{GIT_TEST_OPTS} | ||||
| 	 ? (test_args    => [ split /\s+/, $ENV{GIT_TEST_OPTS} ]) | ||||
| 	 : ()), | ||||
| 	extra_properties => {}, | ||||
| })->runtests(@ARGV); | ||||
| @ -3,9 +3,6 @@ | ||||
| . ./test-lib.sh | ||||
|  | ||||
| unset CVS_SERVER | ||||
| # for clean cvsps cache | ||||
| HOME=$(pwd) | ||||
| export HOME | ||||
|  | ||||
| if ! type cvs >/dev/null 2>&1 | ||||
| then | ||||
| @ -30,6 +27,12 @@ case "$cvsps_version" in | ||||
| 	;; | ||||
| esac | ||||
|  | ||||
| setup_cvs_test_repository () { | ||||
| 	CVSROOT="$(pwd)/.cvsroot" && | ||||
| 	cp -r "$TEST_DIRECTORY/$1/cvsroot" "$CVSROOT" && | ||||
| 	export CVSROOT | ||||
| } | ||||
|  | ||||
| test_cvs_co () { | ||||
| 	# Usage: test_cvs_co BRANCH_NAME | ||||
| 	rm -rf module-cvs-"$1" | ||||
|  | ||||
| @ -2,11 +2,6 @@ | ||||
|  | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if ! test_have_prereq PERL; then | ||||
| 	skip_all='skipping --patch tests, perl not available' | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| set_state () { | ||||
| 	echo "$3" > "$1" && | ||||
| 	git add "$1" && | ||||
|  | ||||
							
								
								
									
										11
									
								
								t/lib-prereq-FILEMODE.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								t/lib-prereq-FILEMODE.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| #!/bin/sh | ||||
| # | ||||
| # Copyright (c) 2010 Ævar Arnfjörð Bjarmason | ||||
| # | ||||
|  | ||||
| if test "$(git config --bool core.filemode)" = false | ||||
| then | ||||
| 	say 'filemode disabled on the filesystem' | ||||
| else | ||||
| 	test_set_prereq FILEMODE | ||||
| fi | ||||
| @ -54,9 +54,40 @@ test_expect_success 'success is reported like this' ' | ||||
| test_expect_failure 'pretend we have a known breakage' ' | ||||
|     false | ||||
| ' | ||||
|  | ||||
| test_expect_success 'pretend we have fixed a known breakage (run in sub test-lib)' " | ||||
|     mkdir passing-todo && | ||||
|     (cd passing-todo && | ||||
|     cat >passing-todo.sh <<EOF && | ||||
| #!$SHELL_PATH | ||||
|  | ||||
| test_description='A passing TODO test | ||||
|  | ||||
| This is run in a sub test-lib so that we do not get incorrect passing | ||||
| metrics | ||||
| ' | ||||
|  | ||||
| # Point to the t/test-lib.sh, which isn't in ../ as usual | ||||
| TEST_DIRECTORY=\"$TEST_DIRECTORY\" | ||||
| . \"\$TEST_DIRECTORY\"/test-lib.sh | ||||
|  | ||||
| test_expect_failure 'pretend we have fixed a known breakage' ' | ||||
|     : | ||||
| ' | ||||
|  | ||||
| test_done | ||||
| EOF | ||||
|     chmod +x passing-todo.sh && | ||||
|     ./passing-todo.sh >out 2>err && | ||||
|     ! test -s err && | ||||
| cat >expect <<EOF && | ||||
| ok 1 - pretend we have fixed a known breakage # TODO known breakage | ||||
| # fixed 1 known breakage(s) | ||||
| # passed all 1 test(s) | ||||
| 1..1 | ||||
| EOF | ||||
|     test_cmp expect out) | ||||
| " | ||||
| test_set_prereq HAVEIT | ||||
| haveit=no | ||||
| test_expect_success HAVEIT 'test runs if prerequisite is satisfied' ' | ||||
| @ -73,6 +104,27 @@ then | ||||
| 	exit 1 | ||||
| fi | ||||
|  | ||||
| test_set_prereq HAVETHIS | ||||
| haveit=no | ||||
| test_expect_success HAVETHIS,HAVEIT 'test runs if prerequisites are satisfied' ' | ||||
|     test_have_prereq HAVEIT && | ||||
|     test_have_prereq HAVETHIS && | ||||
|     haveit=yes | ||||
| ' | ||||
| donthaveit=yes | ||||
| test_expect_success HAVEIT,DONTHAVEIT 'unmet prerequisites causes test to be skipped' ' | ||||
|     donthaveit=no | ||||
| ' | ||||
| donthaveiteither=yes | ||||
| test_expect_success DONTHAVEIT,HAVEIT 'unmet prerequisites causes test to be skipped' ' | ||||
|     donthaveiteither=no | ||||
| ' | ||||
| if test $haveit$donthaveit$donthaveiteither != yesyesyes | ||||
| then | ||||
| 	say "bug in test framework: multiple prerequisite tags do not work reliably" | ||||
| 	exit 1 | ||||
| fi | ||||
|  | ||||
| clean=no | ||||
| test_expect_success 'tests clean up after themselves' ' | ||||
|     test_when_finished clean=yes | ||||
|  | ||||
| @ -171,8 +171,6 @@ test_expect_success 'init with init.templatedir set' ' | ||||
| 	mkdir templatedir-source && | ||||
| 	echo Content >templatedir-source/file && | ||||
| 	( | ||||
| 		HOME="`pwd`" && | ||||
| 		export HOME && | ||||
| 		test_config="${HOME}/.gitconfig" && | ||||
| 		git config -f "$test_config"  init.templatedir "${HOME}/templatedir-source" && | ||||
| 		mkdir templatedir-set && | ||||
| @ -188,8 +186,6 @@ test_expect_success 'init with init.templatedir set' ' | ||||
|  | ||||
| test_expect_success 'init --bare/--shared overrides system/global config' ' | ||||
| 	( | ||||
| 		HOME="`pwd`" && | ||||
| 		export HOME && | ||||
| 		test_config="$HOME"/.gitconfig && | ||||
| 		unset GIT_CONFIG_NOGLOBAL && | ||||
| 		git config -f "$test_config" core.bare false && | ||||
| @ -205,8 +201,6 @@ test_expect_success 'init --bare/--shared overrides system/global config' ' | ||||
|  | ||||
| test_expect_success 'init honors global core.sharedRepository' ' | ||||
| 	( | ||||
| 		HOME="`pwd`" && | ||||
| 		export HOME && | ||||
| 		test_config="$HOME"/.gitconfig && | ||||
| 		unset GIT_CONFIG_NOGLOBAL && | ||||
| 		git config -f "$test_config" core.sharedRepository 0666 && | ||||
| @ -301,7 +295,7 @@ test_expect_success 'init notices EEXIST (2)' ' | ||||
| 	) | ||||
| ' | ||||
|  | ||||
| test_expect_success POSIXPERM 'init notices EPERM' ' | ||||
| test_expect_success POSIXPERM,SANITY 'init notices EPERM' ' | ||||
| 	rm -fr newdir && | ||||
| 	( | ||||
| 		mkdir newdir && | ||||
|  | ||||
| @ -15,7 +15,7 @@ test_expect_success setup ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success POSIXPERM 'write-tree should notice unwritable repository' ' | ||||
| test_expect_success POSIXPERM,SANITY 'write-tree should notice unwritable repository' ' | ||||
|  | ||||
| 	( | ||||
| 		chmod a-w .git/objects .git/objects/?? && | ||||
| @ -27,7 +27,7 @@ test_expect_success POSIXPERM 'write-tree should notice unwritable repository' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success POSIXPERM 'commit should notice unwritable repository' ' | ||||
| test_expect_success POSIXPERM,SANITY 'commit should notice unwritable repository' ' | ||||
|  | ||||
| 	( | ||||
| 		chmod a-w .git/objects .git/objects/?? && | ||||
| @ -39,7 +39,7 @@ test_expect_success POSIXPERM 'commit should notice unwritable repository' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success POSIXPERM 'update-index should notice unwritable repository' ' | ||||
| test_expect_success POSIXPERM,SANITY 'update-index should notice unwritable repository' ' | ||||
|  | ||||
| 	( | ||||
| 		echo 6O >file && | ||||
| @ -52,7 +52,7 @@ test_expect_success POSIXPERM 'update-index should notice unwritable repository' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success POSIXPERM 'add should notice unwritable repository' ' | ||||
| test_expect_success POSIXPERM,SANITY 'add should notice unwritable repository' ' | ||||
|  | ||||
| 	( | ||||
| 		echo b >file && | ||||
|  | ||||
| @ -177,7 +177,7 @@ test_expect_success SYMLINKS 'funny symlink in work tree' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success SYMLINKS 'funny symlink in work tree, un-unlink-able' ' | ||||
| test_expect_success SYMLINKS,SANITY 'funny symlink in work tree, un-unlink-able' ' | ||||
|  | ||||
| 	rm -fr a b && | ||||
| 	git reset --hard && | ||||
|  | ||||
| @ -18,9 +18,11 @@ umask 077 | ||||
| setfacl_out="$(setfacl -m u:root:rwx . 2>&1)" | ||||
| setfacl_ret=$? | ||||
|  | ||||
| if [ $setfacl_ret != 0 ]; then | ||||
| 	skip_all="Skipping ACL tests: unable to use setfacl (output: '$setfacl_out'; return code: '$setfacl_ret')" | ||||
| 	test_done | ||||
| if test $setfacl_ret != 0 | ||||
| then | ||||
| 	say "Unable to use setfacl (output: '$setfacl_out'; return code: '$setfacl_ret')" | ||||
| else | ||||
| 	test_set_prereq SETFACL | ||||
| fi | ||||
|  | ||||
| check_perms_and_acl () { | ||||
| @ -34,7 +36,7 @@ check_perms_and_acl () { | ||||
|  | ||||
| dirs_to_set="./ .git/ .git/objects/ .git/objects/pack/" | ||||
|  | ||||
| test_expect_success 'Setup test repo' ' | ||||
| test_expect_success SETFACL 'Setup test repo' ' | ||||
| 	setfacl -m d:u::rwx,d:g::---,d:o:---,d:m:rwx $dirs_to_set && | ||||
| 	setfacl -m m:rwx               $dirs_to_set && | ||||
| 	setfacl -m u:root:rwx          $dirs_to_set && | ||||
| @ -46,12 +48,12 @@ test_expect_success 'Setup test repo' ' | ||||
| 	git commit -m "init" | ||||
| ' | ||||
|  | ||||
| test_expect_success 'Objects creation does not break ACLs with restrictive umask' ' | ||||
| test_expect_success SETFACL 'Objects creation does not break ACLs with restrictive umask' ' | ||||
| 	# SHA1 for empty blob | ||||
| 	check_perms_and_acl .git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git gc does not break ACLs with restrictive umask' ' | ||||
| test_expect_success SETFACL 'git gc does not break ACLs with restrictive umask' ' | ||||
| 	git gc && | ||||
| 	check_perms_and_acl .git/objects/pack/*.pack | ||||
| ' | ||||
|  | ||||
| @ -6,13 +6,7 @@ test_description='git checkout to switch between branches with symlink<->dir' | ||||
|  | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if ! test_have_prereq SYMLINKS | ||||
| then | ||||
| 	skip_all="symbolic links not supported - skipping tests" | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| test_expect_success setup ' | ||||
| test_expect_success SYMLINKS setup ' | ||||
|  | ||||
| 	mkdir frotz && | ||||
| 	echo hello >frotz/filfre && | ||||
| @ -38,18 +32,18 @@ test_expect_success setup ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'switch from symlink to dir' ' | ||||
| test_expect_success SYMLINKS 'switch from symlink to dir' ' | ||||
|  | ||||
| 	git checkout master | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'Remove temporary directories & switch to master' ' | ||||
| test_expect_success SYMLINKS 'Remove temporary directories & switch to master' ' | ||||
| 	rm -fr frotz xyzzy nitfol && | ||||
| 	git checkout -f master | ||||
| ' | ||||
|  | ||||
| test_expect_success 'switch from dir to symlink' ' | ||||
| test_expect_success SYMLINKS 'switch from dir to symlink' ' | ||||
|  | ||||
| 	git checkout side | ||||
|  | ||||
|  | ||||
| @ -4,7 +4,7 @@ test_description='git checkout --patch' | ||||
|  | ||||
| . ./lib-patch-mode.sh | ||||
|  | ||||
| test_expect_success 'setup' ' | ||||
| test_expect_success PERL 'setup' ' | ||||
| 	mkdir dir && | ||||
| 	echo parent > dir/foo && | ||||
| 	echo dummy > bar && | ||||
| @ -18,40 +18,40 @@ test_expect_success 'setup' ' | ||||
|  | ||||
| # note: bar sorts before dir/foo, so the first 'n' is always to skip 'bar' | ||||
|  | ||||
| test_expect_success 'saying "n" does nothing' ' | ||||
| test_expect_success PERL 'saying "n" does nothing' ' | ||||
| 	set_and_save_state dir/foo work head && | ||||
| 	(echo n; echo n) | git checkout -p && | ||||
| 	verify_saved_state bar && | ||||
| 	verify_saved_state dir/foo | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git checkout -p' ' | ||||
| test_expect_success PERL 'git checkout -p' ' | ||||
| 	(echo n; echo y) | git checkout -p && | ||||
| 	verify_saved_state bar && | ||||
| 	verify_state dir/foo head head | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git checkout -p with staged changes' ' | ||||
| test_expect_success PERL 'git checkout -p with staged changes' ' | ||||
| 	set_state dir/foo work index | ||||
| 	(echo n; echo y) | git checkout -p && | ||||
| 	verify_saved_state bar && | ||||
| 	verify_state dir/foo index index | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git checkout -p HEAD with NO staged changes: abort' ' | ||||
| test_expect_success PERL 'git checkout -p HEAD with NO staged changes: abort' ' | ||||
| 	set_and_save_state dir/foo work head && | ||||
| 	(echo n; echo y; echo n) | git checkout -p HEAD && | ||||
| 	verify_saved_state bar && | ||||
| 	verify_saved_state dir/foo | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git checkout -p HEAD with NO staged changes: apply' ' | ||||
| test_expect_success PERL 'git checkout -p HEAD with NO staged changes: apply' ' | ||||
| 	(echo n; echo y; echo y) | git checkout -p HEAD && | ||||
| 	verify_saved_state bar && | ||||
| 	verify_state dir/foo head head | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git checkout -p HEAD with change already staged' ' | ||||
| test_expect_success PERL 'git checkout -p HEAD with change already staged' ' | ||||
| 	set_state dir/foo index index | ||||
| 	# the third n is to get out in case it mistakenly does not apply | ||||
| 	(echo n; echo y; echo n) | git checkout -p HEAD && | ||||
| @ -59,14 +59,14 @@ test_expect_success 'git checkout -p HEAD with change already staged' ' | ||||
| 	verify_state dir/foo head head | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git checkout -p HEAD^' ' | ||||
| test_expect_success PERL 'git checkout -p HEAD^' ' | ||||
| 	# the third n is to get out in case it mistakenly does not apply | ||||
| 	(echo n; echo y; echo n) | git checkout -p HEAD^ && | ||||
| 	verify_saved_state bar && | ||||
| 	verify_state dir/foo parent parent | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git checkout -p handles deletion' ' | ||||
| test_expect_success PERL 'git checkout -p handles deletion' ' | ||||
| 	set_state dir/foo work index && | ||||
| 	rm dir/foo && | ||||
| 	(echo n; echo y) | git checkout -p && | ||||
| @ -79,28 +79,28 @@ test_expect_success 'git checkout -p handles deletion' ' | ||||
| # dir/foo.  There's always an extra 'n' to reject edits to dir/foo in | ||||
| # the failure case (and thus get out of the loop). | ||||
|  | ||||
| test_expect_success 'path limiting works: dir' ' | ||||
| test_expect_success PERL 'path limiting works: dir' ' | ||||
| 	set_state dir/foo work head && | ||||
| 	(echo y; echo n) | git checkout -p dir && | ||||
| 	verify_saved_state bar && | ||||
| 	verify_state dir/foo head head | ||||
| ' | ||||
|  | ||||
| test_expect_success 'path limiting works: -- dir' ' | ||||
| test_expect_success PERL 'path limiting works: -- dir' ' | ||||
| 	set_state dir/foo work head && | ||||
| 	(echo y; echo n) | git checkout -p -- dir && | ||||
| 	verify_saved_state bar && | ||||
| 	verify_state dir/foo head head | ||||
| ' | ||||
|  | ||||
| test_expect_success 'path limiting works: HEAD^ -- dir' ' | ||||
| test_expect_success PERL 'path limiting works: HEAD^ -- dir' ' | ||||
| 	# the third n is to get out in case it mistakenly does not apply | ||||
| 	(echo y; echo n; echo n) | git checkout -p HEAD^ -- dir && | ||||
| 	verify_saved_state bar && | ||||
| 	verify_state dir/foo parent parent | ||||
| ' | ||||
|  | ||||
| test_expect_success 'path limiting works: foo inside dir' ' | ||||
| test_expect_success PERL 'path limiting works: foo inside dir' ' | ||||
| 	set_state dir/foo work head && | ||||
| 	# the third n is to get out in case it mistakenly does not apply | ||||
| 	(echo y; echo n; echo n) | (cd dir && git checkout -p foo) && | ||||
| @ -108,7 +108,7 @@ test_expect_success 'path limiting works: foo inside dir' ' | ||||
| 	verify_state dir/foo head head | ||||
| ' | ||||
|  | ||||
| test_expect_success 'none of this moved HEAD' ' | ||||
| test_expect_success PERL 'none of this moved HEAD' ' | ||||
| 	verify_saved_head | ||||
| ' | ||||
|  | ||||
|  | ||||
| @ -24,19 +24,25 @@ EOF | ||||
| cat 2>/dev/null >"$p1" "$p0" | ||||
| echo 'Foo Bar Baz' >"$p2" | ||||
|  | ||||
| test -f "$p1" && cmp "$p0" "$p1" || { | ||||
| if test -f "$p1" && cmp "$p0" "$p1" | ||||
| then | ||||
|     test_set_prereq TABS_IN_FILENAMES | ||||
| else | ||||
| 	# since FAT/NTFS does not allow tabs in filenames, skip this test | ||||
| 	skip_all='Your filesystem does not allow tabs in filenames, test skipped.' | ||||
| 	test_done | ||||
| } | ||||
| 	say 'Your filesystem does not allow tabs in filenames' | ||||
| fi | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' " | ||||
| echo 'just space | ||||
| no-funny' >expected | ||||
| test_expect_success 'git ls-files no-funny' \ | ||||
| " | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git ls-files no-funny' \ | ||||
| 	'git update-index --add "$p0" "$p2" && | ||||
| 	git ls-files >current && | ||||
| 	test_cmp expected current' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' ' | ||||
| t0=`git write-tree` | ||||
| echo "$t0" >t0 | ||||
|  | ||||
| @ -45,18 +51,24 @@ just space | ||||
| no-funny | ||||
| "tabs\t,\" (dq) and spaces" | ||||
| EOF | ||||
| test_expect_success 'git ls-files with-funny' \ | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git ls-files with-funny' \ | ||||
| 	'git update-index --add "$p1" && | ||||
| 	git ls-files >current && | ||||
| 	test_cmp expected current' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' " | ||||
| echo 'just space | ||||
| no-funny | ||||
| tabs	," (dq) and spaces' >expected | ||||
| test_expect_success 'git ls-files -z with-funny' \ | ||||
| tabs	,\" (dq) and spaces' >expected | ||||
| " | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git ls-files -z with-funny' \ | ||||
| 	'git ls-files -z | perl -pe y/\\000/\\012/ >current && | ||||
| 	test_cmp expected current' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' ' | ||||
| t1=`git write-tree` | ||||
| echo "$t1" >t1 | ||||
|  | ||||
| @ -65,60 +77,78 @@ just space | ||||
| no-funny | ||||
| "tabs\t,\" (dq) and spaces" | ||||
| EOF | ||||
| test_expect_success 'git ls-tree with funny' \ | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git ls-tree with funny' \ | ||||
| 	'git ls-tree -r $t1 | sed -e "s/^[^	]*	//" >current && | ||||
| 	 test_cmp expected current' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' ' | ||||
| cat > expected <<\EOF | ||||
| A	"tabs\t,\" (dq) and spaces" | ||||
| EOF | ||||
| test_expect_success 'git diff-index with-funny' \ | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff-index with-funny' \ | ||||
| 	'git diff-index --name-status $t0 >current && | ||||
| 	test_cmp expected current' | ||||
|  | ||||
| test_expect_success 'git diff-tree with-funny' \ | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff-tree with-funny' \ | ||||
| 	'git diff-tree --name-status $t0 $t1 >current && | ||||
| 	test_cmp expected current' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' " | ||||
| echo 'A | ||||
| tabs	," (dq) and spaces' >expected | ||||
| test_expect_success 'git diff-index -z with-funny' \ | ||||
| tabs	,\" (dq) and spaces' >expected | ||||
| " | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff-index -z with-funny' \ | ||||
| 	'git diff-index -z --name-status $t0 | perl -pe y/\\000/\\012/ >current && | ||||
| 	test_cmp expected current' | ||||
|  | ||||
| test_expect_success 'git diff-tree -z with-funny' \ | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff-tree -z with-funny' \ | ||||
| 	'git diff-tree -z --name-status $t0 $t1 | perl -pe y/\\000/\\012/ >current && | ||||
| 	test_cmp expected current' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' ' | ||||
| cat > expected <<\EOF | ||||
| CNUM	no-funny	"tabs\t,\" (dq) and spaces" | ||||
| EOF | ||||
| test_expect_success 'git diff-tree -C with-funny' \ | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff-tree -C with-funny' \ | ||||
| 	'git diff-tree -C --find-copies-harder --name-status \ | ||||
| 		$t0 $t1 | sed -e 's/^C[0-9]*/CNUM/' >current && | ||||
| 	test_cmp expected current' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' ' | ||||
| cat > expected <<\EOF | ||||
| RNUM	no-funny	"tabs\t,\" (dq) and spaces" | ||||
| EOF | ||||
| test_expect_success 'git diff-tree delete with-funny' \ | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff-tree delete with-funny' \ | ||||
| 	'git update-index --force-remove "$p0" && | ||||
| 	git diff-index -M --name-status \ | ||||
| 		$t0 | sed -e 's/^R[0-9]*/RNUM/' >current && | ||||
| 	test_cmp expected current' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' ' | ||||
| cat > expected <<\EOF | ||||
| diff --git a/no-funny "b/tabs\t,\" (dq) and spaces" | ||||
| similarity index NUM% | ||||
| rename from no-funny | ||||
| rename to "tabs\t,\" (dq) and spaces" | ||||
| EOF | ||||
| test_expect_success 'git diff-tree delete with-funny' \ | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff-tree delete with-funny' \ | ||||
| 	'git diff-index -M -p $t0 | | ||||
| 	 sed -e "s/index [0-9]*%/index NUM%/" >current && | ||||
| 	 test_cmp expected current' | ||||
|  | ||||
| chmod +x "$p1" | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' ' | ||||
| chmod +x "$p1" && | ||||
| cat > expected <<\EOF | ||||
| diff --git a/no-funny "b/tabs\t,\" (dq) and spaces" | ||||
| old mode 100644 | ||||
| @ -127,31 +157,39 @@ similarity index NUM% | ||||
| rename from no-funny | ||||
| rename to "tabs\t,\" (dq) and spaces" | ||||
| EOF | ||||
| test_expect_success 'git diff-tree delete with-funny' \ | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff-tree delete with-funny' \ | ||||
| 	'git diff-index -M -p $t0 | | ||||
| 	 sed -e "s/index [0-9]*%/index NUM%/" >current && | ||||
| 	 test_cmp expected current' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' ' | ||||
| cat >expected <<\EOF | ||||
|  "tabs\t,\" (dq) and spaces" | ||||
|  1 files changed, 0 insertions(+), 0 deletions(-) | ||||
| EOF | ||||
| test_expect_success 'git diff-tree rename with-funny applied' \ | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff-tree rename with-funny applied' \ | ||||
| 	'git diff-index -M -p $t0 | | ||||
| 	 git apply --stat | sed -e "s/|.*//" -e "s/ *\$//" >current && | ||||
| 	 test_cmp expected current' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expect' ' | ||||
| cat > expected <<\EOF | ||||
|  no-funny | ||||
|  "tabs\t,\" (dq) and spaces" | ||||
|  2 files changed, 3 insertions(+), 3 deletions(-) | ||||
| EOF | ||||
| test_expect_success 'git diff-tree delete with-funny applied' \ | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff-tree delete with-funny applied' \ | ||||
| 	'git diff-index -p $t0 | | ||||
| 	 git apply --stat | sed -e "s/|.*//" -e "s/ *\$//" >current && | ||||
| 	 test_cmp expected current' | ||||
|  | ||||
| test_expect_success 'git apply non-git diff' \ | ||||
| test_expect_success TABS_IN_FILENAMES 'git apply non-git diff' \ | ||||
| 	'git diff-index -p $t0 | | ||||
| 	 sed -ne "/^[-+@]/p" | | ||||
| 	 git apply --stat | sed -e "s/|.*//" -e "s/ *\$//" >current && | ||||
|  | ||||
| @ -7,11 +7,9 @@ test_description='Test commit notes index (expensive!)' | ||||
|  | ||||
| . ./test-lib.sh | ||||
|  | ||||
| test -z "$GIT_NOTES_TIMING_TESTS" && { | ||||
| 	skip_all="Skipping timing tests" | ||||
| 	test_done | ||||
| 	exit | ||||
| } | ||||
| test_set_prereq NOT_EXPENSIVE | ||||
| test -n "$GIT_NOTES_TIMING_TESTS" && test_set_prereq EXPENSIVE | ||||
| test -x /usr/bin/time && test_set_prereq USR_BIN_TIME | ||||
|  | ||||
| create_repo () { | ||||
| 	number_of_commits=$1 | ||||
| @ -102,17 +100,27 @@ time_notes () { | ||||
| 	done | ||||
| } | ||||
|  | ||||
| for count in 10 100 1000 10000; do | ||||
| do_tests () { | ||||
| 	pr=$1 | ||||
| 	count=$2 | ||||
|  | ||||
| 	mkdir $count | ||||
| 	(cd $count; | ||||
| 	test_expect_success $pr 'setup / mkdir' ' | ||||
| 		mkdir $count && | ||||
| 		cd $count | ||||
| 	' | ||||
|  | ||||
| 	test_expect_success "setup $count" "create_repo $count" | ||||
| 	test_expect_success $pr "setup $count" "create_repo $count" | ||||
|  | ||||
| 	test_expect_success 'notes work' "test_notes $count" | ||||
| 	test_expect_success $pr 'notes work' "test_notes $count" | ||||
|  | ||||
| 	test_expect_success 'notes timing' "time_notes 100" | ||||
| 	) | ||||
| 	test_expect_success USR_BIN_TIME,$pr 'notes timing with /usr/bin/time' "time_notes 100" | ||||
|  | ||||
| 	test_expect_success $pr 'teardown / cd ..' 'cd ..' | ||||
| } | ||||
|  | ||||
| do_tests NOT_EXPENSIVE 10 | ||||
| for count in 100 1000 10000; do | ||||
| 	do_tests EXPENSIVE $count | ||||
| done | ||||
|  | ||||
| test_done | ||||
|  | ||||
| @ -28,22 +28,6 @@ embedded' && | ||||
|      git commit -m 'add files with tabs and newlines' | ||||
| " | ||||
|  | ||||
| # Determine rm behavior | ||||
| # Later we will try removing an unremovable path to make sure | ||||
| # git rm barfs, but if the test is run as root that cannot be | ||||
| # arranged. | ||||
| : >test-file | ||||
| chmod a-w . | ||||
| rm -f test-file 2>/dev/null | ||||
| if test -f test-file | ||||
| then | ||||
| 	test_set_prereq RO_DIR | ||||
| else | ||||
| 	skip_all='skipping removal failure test (perhaps running as root?)' | ||||
| fi | ||||
| chmod 775 . | ||||
| rm -f test-file | ||||
|  | ||||
| test_expect_success \ | ||||
|     'Pre-check that foo exists and is in index before git rm foo' \ | ||||
|     '[ -f foo ] && git ls-files --error-unmatch foo' | ||||
|  | ||||
| @ -179,7 +179,7 @@ test_expect_success 'git add --refresh' ' | ||||
| 	test -z "`git diff-index HEAD -- foo`" | ||||
| ' | ||||
|  | ||||
| test_expect_success POSIXPERM 'git add should fail atomically upon an unreadable file' ' | ||||
| test_expect_success POSIXPERM,SANITY 'git add should fail atomically upon an unreadable file' ' | ||||
| 	git reset --hard && | ||||
| 	date >foo1 && | ||||
| 	date >foo2 && | ||||
| @ -190,7 +190,7 @@ test_expect_success POSIXPERM 'git add should fail atomically upon an unreadable | ||||
|  | ||||
| rm -f foo2 | ||||
|  | ||||
| test_expect_success POSIXPERM 'git add --ignore-errors' ' | ||||
| test_expect_success POSIXPERM,SANITY 'git add --ignore-errors' ' | ||||
| 	git reset --hard && | ||||
| 	date >foo1 && | ||||
| 	date >foo2 && | ||||
| @ -201,7 +201,7 @@ test_expect_success POSIXPERM 'git add --ignore-errors' ' | ||||
|  | ||||
| rm -f foo2 | ||||
|  | ||||
| test_expect_success POSIXPERM 'git add (add.ignore-errors)' ' | ||||
| test_expect_success POSIXPERM,SANITY 'git add (add.ignore-errors)' ' | ||||
| 	git config add.ignore-errors 1 && | ||||
| 	git reset --hard && | ||||
| 	date >foo1 && | ||||
| @ -212,7 +212,7 @@ test_expect_success POSIXPERM 'git add (add.ignore-errors)' ' | ||||
| ' | ||||
| rm -f foo2 | ||||
|  | ||||
| test_expect_success POSIXPERM 'git add (add.ignore-errors = false)' ' | ||||
| test_expect_success POSIXPERM,SANITY 'git add (add.ignore-errors = false)' ' | ||||
| 	git config add.ignore-errors 0 && | ||||
| 	git reset --hard && | ||||
| 	date >foo1 && | ||||
| @ -223,7 +223,7 @@ test_expect_success POSIXPERM 'git add (add.ignore-errors = false)' ' | ||||
| ' | ||||
| rm -f foo2 | ||||
|  | ||||
| test_expect_success POSIXPERM '--no-ignore-errors overrides config' ' | ||||
| test_expect_success POSIXPERM,SANITY '--no-ignore-errors overrides config' ' | ||||
|        git config add.ignore-errors 1 && | ||||
|        git reset --hard && | ||||
|        date >foo1 && | ||||
|  | ||||
| @ -2,22 +2,20 @@ | ||||
|  | ||||
| test_description='add -i basic tests' | ||||
| . ./test-lib.sh | ||||
| . "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh | ||||
|  | ||||
| if ! test_have_prereq PERL; then | ||||
| 	skip_all='skipping git add -i tests, perl not available' | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| test_expect_success 'setup (initial)' ' | ||||
| test_expect_success PERL 'setup (initial)' ' | ||||
| 	echo content >file && | ||||
| 	git add file && | ||||
| 	echo more >>file && | ||||
| 	echo lines >>file | ||||
| ' | ||||
| test_expect_success 'status works (initial)' ' | ||||
| test_expect_success PERL 'status works (initial)' ' | ||||
| 	git add -i </dev/null >output && | ||||
| 	grep "+1/-0 *+2/-0 file" output | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'setup expected' ' | ||||
| cat >expected <<EOF | ||||
| new file mode 100644 | ||||
| index 0000000..d95f3ad | ||||
| @ -26,19 +24,21 @@ index 0000000..d95f3ad | ||||
| @@ -0,0 +1 @@ | ||||
| +content | ||||
| EOF | ||||
| test_expect_success 'diff works (initial)' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'diff works (initial)' ' | ||||
| 	(echo d; echo 1) | git add -i >output && | ||||
| 	sed -ne "/new file/,/content/p" <output >diff && | ||||
| 	test_cmp expected diff | ||||
| ' | ||||
| test_expect_success 'revert works (initial)' ' | ||||
| test_expect_success PERL 'revert works (initial)' ' | ||||
| 	git add file && | ||||
| 	(echo r; echo 1) | git add -i && | ||||
| 	git ls-files >output && | ||||
| 	! grep . output | ||||
| ' | ||||
|  | ||||
| test_expect_success 'setup (commit)' ' | ||||
| test_expect_success PERL 'setup (commit)' ' | ||||
| 	echo baseline >file && | ||||
| 	git add file && | ||||
| 	git commit -m commit && | ||||
| @ -47,10 +47,12 @@ test_expect_success 'setup (commit)' ' | ||||
| 	echo more >>file && | ||||
| 	echo lines >>file | ||||
| ' | ||||
| test_expect_success 'status works (commit)' ' | ||||
| test_expect_success PERL 'status works (commit)' ' | ||||
| 	git add -i </dev/null >output && | ||||
| 	grep "+1/-0 *+2/-0 file" output | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'setup expected' ' | ||||
| cat >expected <<EOF | ||||
| index 180b47c..b6f2c08 100644 | ||||
| --- a/file | ||||
| @ -59,60 +61,79 @@ index 180b47c..b6f2c08 100644 | ||||
|  baseline | ||||
| +content | ||||
| EOF | ||||
| test_expect_success 'diff works (commit)' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'diff works (commit)' ' | ||||
| 	(echo d; echo 1) | git add -i >output && | ||||
| 	sed -ne "/^index/,/content/p" <output >diff && | ||||
| 	test_cmp expected diff | ||||
| ' | ||||
| test_expect_success 'revert works (commit)' ' | ||||
| test_expect_success PERL 'revert works (commit)' ' | ||||
| 	git add file && | ||||
| 	(echo r; echo 1) | git add -i && | ||||
| 	git add -i </dev/null >output && | ||||
| 	grep "unchanged *+3/-0 file" output | ||||
| ' | ||||
|  | ||||
|  | ||||
| test_expect_success PERL 'setup expected' ' | ||||
| cat >expected <<EOF | ||||
| EOF | ||||
| cat >fake_editor.sh <<EOF | ||||
| EOF | ||||
| chmod a+x fake_editor.sh | ||||
| test_set_editor "$(pwd)/fake_editor.sh" | ||||
| test_expect_success 'dummy edit works' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'setup fake editor' ' | ||||
| 	cat >fake_editor.sh <<EOF | ||||
| 	EOF | ||||
| 	chmod a+x fake_editor.sh && | ||||
| 	test_set_editor "$(pwd)/fake_editor.sh" && | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'dummy edit works' ' | ||||
| 	(echo e; echo a) | git add -p && | ||||
| 	git diff > diff && | ||||
| 	test_cmp expected diff | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'setup patch' ' | ||||
| cat >patch <<EOF | ||||
| @@ -1,1 +1,4 @@ | ||||
|  this | ||||
| +patch | ||||
| -doesn't | ||||
| -does not | ||||
|  apply | ||||
| EOF | ||||
| echo "#!$SHELL_PATH" >fake_editor.sh | ||||
| cat >>fake_editor.sh <<\EOF | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'setup fake editor' ' | ||||
| 	echo "#!$SHELL_PATH" >fake_editor.sh && | ||||
| 	cat >>fake_editor.sh <<\EOF && | ||||
| mv -f "$1" oldpatch && | ||||
| mv -f patch "$1" | ||||
| EOF | ||||
| chmod a+x fake_editor.sh | ||||
| test_set_editor "$(pwd)/fake_editor.sh" | ||||
| test_expect_success 'bad edit rejected' ' | ||||
| 	chmod a+x fake_editor.sh && | ||||
| 	test_set_editor "$(pwd)/fake_editor.sh" | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'bad edit rejected' ' | ||||
| 	git reset && | ||||
| 	(echo e; echo n; echo d) | git add -p >output && | ||||
| 	grep "hunk does not apply" output | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'setup patch' ' | ||||
| cat >patch <<EOF | ||||
| this patch | ||||
| is garbage | ||||
| EOF | ||||
| test_expect_success 'garbage edit rejected' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'garbage edit rejected' ' | ||||
| 	git reset && | ||||
| 	(echo e; echo n; echo d) | git add -p >output && | ||||
| 	grep "hunk does not apply" output | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'setup patch' ' | ||||
| cat >patch <<EOF | ||||
| @@ -1,0 +1,0 @@ | ||||
|  baseline | ||||
| @ -120,6 +141,9 @@ cat >patch <<EOF | ||||
| +newcontent | ||||
| +lines | ||||
| EOF | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'setup expected' ' | ||||
| cat >expected <<EOF | ||||
| diff --git a/file b/file | ||||
| index b5dd6c9..f910ae9 100644 | ||||
| @ -132,13 +156,15 @@ index b5dd6c9..f910ae9 100644 | ||||
| +more | ||||
|  lines | ||||
| EOF | ||||
| test_expect_success 'real edit works' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'real edit works' ' | ||||
| 	(echo e; echo n; echo d) | git add -p && | ||||
| 	git diff >output && | ||||
| 	test_cmp expected output | ||||
| ' | ||||
|  | ||||
| test_expect_success 'skip files similarly as commit -a' ' | ||||
| test_expect_success PERL 'skip files similarly as commit -a' ' | ||||
| 	git reset && | ||||
| 	echo file >.gitignore && | ||||
| 	echo changed >file && | ||||
| @ -152,14 +178,7 @@ test_expect_success 'skip files similarly as commit -a' ' | ||||
| ' | ||||
| rm -f .gitignore | ||||
|  | ||||
| if test "$(git config --bool core.filemode)" = false | ||||
| then | ||||
| 	say '# skipping filemode tests (filesystem does not properly support modes)' | ||||
| else | ||||
| 	test_set_prereq FILEMODE | ||||
| fi | ||||
|  | ||||
| test_expect_success FILEMODE 'patch does not affect mode' ' | ||||
| test_expect_success PERL,FILEMODE 'patch does not affect mode' ' | ||||
| 	git reset --hard && | ||||
| 	echo content >>file && | ||||
| 	chmod +x file && | ||||
| @ -168,7 +187,7 @@ test_expect_success FILEMODE 'patch does not affect mode' ' | ||||
| 	git diff file | grep "new mode" | ||||
| ' | ||||
|  | ||||
| test_expect_success FILEMODE 'stage mode but not hunk' ' | ||||
| test_expect_success PERL,FILEMODE 'stage mode but not hunk' ' | ||||
| 	git reset --hard && | ||||
| 	echo content >>file && | ||||
| 	chmod +x file && | ||||
| @ -178,7 +197,7 @@ test_expect_success FILEMODE 'stage mode but not hunk' ' | ||||
| ' | ||||
|  | ||||
|  | ||||
| test_expect_success FILEMODE 'stage mode and hunk' ' | ||||
| test_expect_success PERL,FILEMODE 'stage mode and hunk' ' | ||||
| 	git reset --hard && | ||||
| 	echo content >>file && | ||||
| 	chmod +x file && | ||||
| @ -190,13 +209,14 @@ test_expect_success FILEMODE 'stage mode and hunk' ' | ||||
|  | ||||
| # end of tests disabled when filemode is not usable | ||||
|  | ||||
| test_expect_success 'setup again' ' | ||||
| test_expect_success PERL 'setup again' ' | ||||
| 	git reset --hard && | ||||
| 	test_chmod +x file && | ||||
| 	echo content >>file | ||||
| ' | ||||
|  | ||||
| # Write the patch file with a new line at the top and bottom | ||||
| test_expect_success PERL 'setup patch' ' | ||||
| cat >patch <<EOF | ||||
| index 180b47c..b6f2c08 100644 | ||||
| --- a/file | ||||
| @ -207,7 +227,10 @@ index 180b47c..b6f2c08 100644 | ||||
|  content | ||||
| +lastline | ||||
| EOF | ||||
| ' | ||||
|  | ||||
| # Expected output, similar to the patch but w/ diff at the top | ||||
| test_expect_success PERL 'setup expected' ' | ||||
| cat >expected <<EOF | ||||
| diff --git a/file b/file | ||||
| index b6f2c08..61b9053 100755 | ||||
| @ -219,8 +242,10 @@ index b6f2c08..61b9053 100755 | ||||
|  content | ||||
| +lastline | ||||
| EOF | ||||
| ' | ||||
|  | ||||
| # Test splitting the first patch, then adding both | ||||
| test_expect_success 'add first line works' ' | ||||
| test_expect_success PERL 'add first line works' ' | ||||
| 	git commit -am "clear local changes" && | ||||
| 	git apply patch && | ||||
| 	(echo s; echo y; echo y) | git add -p file && | ||||
| @ -228,6 +253,7 @@ test_expect_success 'add first line works' ' | ||||
| 	test_cmp expected diff | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'setup expected' ' | ||||
| cat >expected <<EOF | ||||
| diff --git a/non-empty b/non-empty | ||||
| deleted file mode 100644 | ||||
| @ -237,7 +263,9 @@ index d95f3ad..0000000 | ||||
| @@ -1 +0,0 @@ | ||||
| -content | ||||
| EOF | ||||
| test_expect_success 'deleting a non-empty file' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'deleting a non-empty file' ' | ||||
| 	git reset --hard && | ||||
| 	echo content >non-empty && | ||||
| 	git add non-empty && | ||||
| @ -248,13 +276,15 @@ test_expect_success 'deleting a non-empty file' ' | ||||
| 	test_cmp expected diff | ||||
| ' | ||||
|  | ||||
| test_expect_success PERL 'setup expected' ' | ||||
| cat >expected <<EOF | ||||
| diff --git a/empty b/empty | ||||
| deleted file mode 100644 | ||||
| index e69de29..0000000 | ||||
| EOF | ||||
| ' | ||||
|  | ||||
| test_expect_success 'deleting an empty file' ' | ||||
| test_expect_success PERL 'deleting an empty file' ' | ||||
| 	git reset --hard && | ||||
| 	> empty && | ||||
| 	git add empty && | ||||
|  | ||||
| @ -15,11 +15,13 @@ LF=' | ||||
| DQ='"' | ||||
|  | ||||
| echo foo 2>/dev/null > "Name and an${HT}HT" | ||||
| test -f "Name and an${HT}HT" || { | ||||
| 	# since FAT/NTFS does not allow tabs in filenames, skip this test | ||||
| 	skip_all='Your filesystem does not allow tabs in filenames, test skipped.' | ||||
| 	test_done | ||||
| } | ||||
| if ! test -f "Name and an${HT}HT" | ||||
| then | ||||
| 	# FAT/NTFS does not allow tabs in filenames | ||||
| 	say 'Your filesystem does not allow tabs in filenames' | ||||
| else | ||||
| 	test_set_prereq TABS_IN_FILENAMES | ||||
| fi | ||||
|  | ||||
| for_each_name () { | ||||
| 	for name in \ | ||||
| @ -31,7 +33,7 @@ for_each_name () { | ||||
| 	done | ||||
| } | ||||
|  | ||||
| test_expect_success setup ' | ||||
| test_expect_success TABS_IN_FILENAMES 'setup' ' | ||||
|  | ||||
| 	mkdir "$FN" && | ||||
| 	for_each_name "echo initial >\"\$name\"" | ||||
| @ -45,6 +47,7 @@ test_expect_success setup ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expected files' ' | ||||
| cat >expect.quoted <<\EOF | ||||
| Name | ||||
| "Name and a\nLF" | ||||
| @ -72,75 +75,76 @@ With SP in it | ||||
| 濱野/file | ||||
| 濱野純 | ||||
| EOF | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check fully quoted output from ls-files' ' | ||||
| test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-files' ' | ||||
|  | ||||
| 	git ls-files >current && test_cmp expect.quoted current | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check fully quoted output from diff-files' ' | ||||
| test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-files' ' | ||||
|  | ||||
| 	git diff --name-only >current && | ||||
| 	test_cmp expect.quoted current | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check fully quoted output from diff-index' ' | ||||
| test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-index' ' | ||||
|  | ||||
| 	git diff --name-only HEAD >current && | ||||
| 	test_cmp expect.quoted current | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check fully quoted output from diff-tree' ' | ||||
| test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-tree' ' | ||||
|  | ||||
| 	git diff --name-only HEAD^ HEAD >current && | ||||
| 	test_cmp expect.quoted current | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check fully quoted output from ls-tree' ' | ||||
| test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-tree' ' | ||||
|  | ||||
| 	git ls-tree --name-only -r HEAD >current && | ||||
| 	test_cmp expect.quoted current | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'setting core.quotepath' ' | ||||
| test_expect_success TABS_IN_FILENAMES 'setting core.quotepath' ' | ||||
|  | ||||
| 	git config --bool core.quotepath false | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check fully quoted output from ls-files' ' | ||||
| test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-files' ' | ||||
|  | ||||
| 	git ls-files >current && test_cmp expect.raw current | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check fully quoted output from diff-files' ' | ||||
| test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-files' ' | ||||
|  | ||||
| 	git diff --name-only >current && | ||||
| 	test_cmp expect.raw current | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check fully quoted output from diff-index' ' | ||||
| test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-index' ' | ||||
|  | ||||
| 	git diff --name-only HEAD >current && | ||||
| 	test_cmp expect.raw current | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check fully quoted output from diff-tree' ' | ||||
| test_expect_success TABS_IN_FILENAMES 'check fully quoted output from diff-tree' ' | ||||
|  | ||||
| 	git diff --name-only HEAD^ HEAD >current && | ||||
| 	test_cmp expect.raw current | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check fully quoted output from ls-tree' ' | ||||
| test_expect_success TABS_IN_FILENAMES 'check fully quoted output from ls-tree' ' | ||||
|  | ||||
| 	git ls-tree --name-only -r HEAD >current && | ||||
| 	test_cmp expect.raw current | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| test_description='git checkout --patch' | ||||
| . ./lib-patch-mode.sh | ||||
|  | ||||
| test_expect_success 'setup' ' | ||||
| test_expect_success PERL 'setup' ' | ||||
| 	mkdir dir && | ||||
| 	echo parent > dir/foo && | ||||
| 	echo dummy > bar && | ||||
| @ -19,14 +19,14 @@ test_expect_success 'setup' ' | ||||
|  | ||||
| # note: bar sorts before dir, so the first 'n' is always to skip 'bar' | ||||
|  | ||||
| test_expect_success 'saying "n" does nothing' ' | ||||
| test_expect_success PERL 'saying "n" does nothing' ' | ||||
| 	set_state dir/foo work index | ||||
| 	(echo n; echo n) | test_must_fail git stash save -p && | ||||
| 	verify_state dir/foo work index && | ||||
| 	verify_saved_state bar | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git stash -p' ' | ||||
| test_expect_success PERL 'git stash -p' ' | ||||
| 	(echo n; echo y) | git stash save -p && | ||||
| 	verify_state dir/foo head index && | ||||
| 	verify_saved_state bar && | ||||
| @ -36,7 +36,7 @@ test_expect_success 'git stash -p' ' | ||||
| 	verify_state bar dummy dummy | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git stash -p --no-keep-index' ' | ||||
| test_expect_success PERL 'git stash -p --no-keep-index' ' | ||||
| 	set_state dir/foo work index && | ||||
| 	set_state bar bar_work bar_index && | ||||
| 	(echo n; echo y) | git stash save -p --no-keep-index && | ||||
| @ -48,7 +48,7 @@ test_expect_success 'git stash -p --no-keep-index' ' | ||||
| 	verify_state bar dummy bar_index | ||||
| ' | ||||
|  | ||||
| test_expect_success 'none of this moved HEAD' ' | ||||
| test_expect_success PERL 'none of this moved HEAD' ' | ||||
| 	verify_saved_head | ||||
| ' | ||||
|  | ||||
|  | ||||
| @ -12,13 +12,7 @@ by an edit for them. | ||||
| . ./test-lib.sh | ||||
| . "$TEST_DIRECTORY"/diff-lib.sh | ||||
|  | ||||
| if ! test_have_prereq SYMLINKS | ||||
| then | ||||
| 	skip_all='Symbolic links not supported, skipping tests.' | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| test_expect_success \ | ||||
| test_expect_success SYMLINKS \ | ||||
|     'prepare reference tree' \ | ||||
|     'echo xyzzy | tr -d '\\\\'012 >yomin && | ||||
|      ln -s xyzzy frotz && | ||||
| @ -26,7 +20,7 @@ test_expect_success \ | ||||
|     tree=$(git write-tree) && | ||||
|     echo $tree' | ||||
|  | ||||
| test_expect_success \ | ||||
| test_expect_success SYMLINKS \ | ||||
|     'prepare work tree' \ | ||||
|     'mv frotz rezrov && | ||||
|      rm -f yomin && | ||||
| @ -40,8 +34,9 @@ test_expect_success \ | ||||
| # rezrov and nitfol are rename/copy of frotz and bozbar should be | ||||
| # a new creation. | ||||
|  | ||||
| GIT_DIFF_OPTS=--unified=0 git diff-index -M -p $tree >current | ||||
| cat >expected <<\EOF | ||||
| test_expect_success SYMLINKS 'setup diff output' " | ||||
|     GIT_DIFF_OPTS=--unified=0 git diff-index -M -p $tree >current && | ||||
|     cat >expected <<\EOF | ||||
| diff --git a/bozbar b/bozbar | ||||
| new file mode 120000 | ||||
| --- /dev/null | ||||
| @ -65,8 +60,9 @@ deleted file mode 100644 | ||||
| -xyzzy | ||||
| \ No newline at end of file | ||||
| EOF | ||||
| " | ||||
|  | ||||
| test_expect_success \ | ||||
| test_expect_success SYMLINKS \ | ||||
|     'validate diff output' \ | ||||
|     'compare_diff_patch current expected' | ||||
|  | ||||
|  | ||||
| @ -9,12 +9,6 @@ test_description='Test diff of symlinks. | ||||
| . ./test-lib.sh | ||||
| . "$TEST_DIRECTORY"/diff-lib.sh | ||||
|  | ||||
| if ! test_have_prereq SYMLINKS | ||||
| then | ||||
| 	skip_all='Symbolic links not supported, skipping tests.' | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| cat > expected << EOF | ||||
| diff --git a/frotz b/frotz | ||||
| new file mode 120000 | ||||
| @ -26,7 +20,7 @@ index 0000000..7c465af | ||||
| \ No newline at end of file | ||||
| EOF | ||||
|  | ||||
| test_expect_success \ | ||||
| test_expect_success SYMLINKS \ | ||||
|     'diff new symlink' \ | ||||
|     'ln -s xyzzy frotz && | ||||
|     git update-index && | ||||
| @ -35,7 +29,7 @@ test_expect_success \ | ||||
|     GIT_DIFF_OPTS=--unified=0 git diff-index -M -p $tree > current && | ||||
|     compare_diff_patch current expected' | ||||
|  | ||||
| test_expect_success \ | ||||
| test_expect_success SYMLINKS \ | ||||
|     'diff unchanged symlink' \ | ||||
|     'tree=$(git write-tree) && | ||||
|     git update-index frotz && | ||||
| @ -52,7 +46,7 @@ index 7c465af..0000000 | ||||
| \ No newline at end of file | ||||
| EOF | ||||
|  | ||||
| test_expect_success \ | ||||
| test_expect_success SYMLINKS \ | ||||
|     'diff removed symlink' \ | ||||
|     'mv frotz frotz2 && | ||||
|     git diff-index -M -p $tree > current && | ||||
| @ -62,7 +56,7 @@ cat > expected << EOF | ||||
| diff --git a/frotz b/frotz | ||||
| EOF | ||||
|  | ||||
| test_expect_success \ | ||||
| test_expect_success SYMLINKS \ | ||||
|     'diff identical, but newly created symlink' \ | ||||
|     'ln -s xyzzy frotz && | ||||
|     git diff-index -M -p $tree > current && | ||||
| @ -80,14 +74,14 @@ index 7c465af..df1db54 120000 | ||||
| \ No newline at end of file | ||||
| EOF | ||||
|  | ||||
| test_expect_success \ | ||||
| test_expect_success SYMLINKS \ | ||||
|     'diff different symlink' \ | ||||
|     'rm frotz && | ||||
|     ln -s yxyyz frotz && | ||||
|     git diff-index -M -p $tree > current && | ||||
|     compare_diff_patch current expected' | ||||
|  | ||||
| test_expect_success \ | ||||
| test_expect_success SYMLINKS \ | ||||
|     'diff symlinks with non-existing targets' \ | ||||
|     'ln -s narf pinky && | ||||
|     ln -s take\ over brain && | ||||
|  | ||||
| @ -13,12 +13,14 @@ P1='pathname	with HT' | ||||
| P2='pathname with SP' | ||||
| P3='pathname | ||||
| with LF' | ||||
| : 2>/dev/null >"$P1" && test -f "$P1" && rm -f "$P1" || { | ||||
| 	skip_all='Your filesystem does not allow tabs in filenames, test skipped.' | ||||
| 	test_done | ||||
| } | ||||
| if : 2>/dev/null >"$P1" && test -f "$P1" && rm -f "$P1" | ||||
| then | ||||
| 	test_set_prereq TABS_IN_FILENAMES | ||||
| else | ||||
| 	say 'Your filesystem does not allow tabs in filenames' | ||||
| fi | ||||
|  | ||||
| test_expect_success setup ' | ||||
| test_expect_success TABS_IN_FILENAMES setup ' | ||||
| 	echo P0.0 >"$P0.0" && | ||||
| 	echo P0.1 >"$P0.1" && | ||||
| 	echo P0.2 >"$P0.2" && | ||||
| @ -38,6 +40,7 @@ test_expect_success setup ' | ||||
| 	: | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expected files' ' | ||||
| cat >expect <<\EOF | ||||
|  rename pathname.1 => "Rpathname\twith HT.0" (100%) | ||||
|  rename pathname.3 => "Rpathname\nwith LF.0" (100%) | ||||
| @ -47,11 +50,14 @@ cat >expect <<\EOF | ||||
|  rename pathname.0 => Rpathname.0 (100%) | ||||
|  rename "pathname\twith HT.0" => Rpathname.1 (100%) | ||||
| EOF | ||||
| test_expect_success 'git diff --summary -M HEAD' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff --summary -M HEAD' ' | ||||
| 	git diff --summary -M HEAD >actual && | ||||
| 	test_cmp expect actual | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'setup expected files' ' | ||||
| cat >expect <<\EOF | ||||
|  pathname.1 => "Rpathname\twith HT.0"            |    0 | ||||
|  pathname.3 => "Rpathname\nwith LF.0"            |    0 | ||||
| @ -62,7 +68,9 @@ cat >expect <<\EOF | ||||
|  "pathname\twith HT.0" => Rpathname.1            |    0 | ||||
|  7 files changed, 0 insertions(+), 0 deletions(-) | ||||
| EOF | ||||
| test_expect_success 'git diff --stat -M HEAD' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success TABS_IN_FILENAMES 'git diff --stat -M HEAD' ' | ||||
| 	git diff --stat -M HEAD >actual && | ||||
| 	test_cmp expect actual | ||||
| ' | ||||
|  | ||||
| @ -4,13 +4,7 @@ test_description='typechange rename detection' | ||||
|  | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if ! test_have_prereq SYMLINKS | ||||
| then | ||||
| 	skip_all='Symbolic links not supported, skipping tests.' | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| test_expect_success setup ' | ||||
| test_expect_success SYMLINKS setup ' | ||||
|  | ||||
| 	rm -f foo bar && | ||||
| 	cat "$TEST_DIRECTORY"/../COPYING >foo && | ||||
| @ -56,7 +50,7 @@ test_expect_success setup ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'cross renames to be detected for regular files' ' | ||||
| test_expect_success SYMLINKS 'cross renames to be detected for regular files' ' | ||||
|  | ||||
| 	git diff-tree five six -r --name-status -B -M | sort >actual && | ||||
| 	{ | ||||
| @ -67,7 +61,7 @@ test_expect_success 'cross renames to be detected for regular files' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'cross renames to be detected for typechange' ' | ||||
| test_expect_success SYMLINKS 'cross renames to be detected for typechange' ' | ||||
|  | ||||
| 	git diff-tree one two -r --name-status -B -M | sort >actual && | ||||
| 	{ | ||||
| @ -78,7 +72,7 @@ test_expect_success 'cross renames to be detected for typechange' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'moves and renames' ' | ||||
| test_expect_success SYMLINKS 'moves and renames' ' | ||||
|  | ||||
| 	git diff-tree three four -r --name-status -B -M | sort >actual && | ||||
| 	{ | ||||
|  | ||||
| @ -7,6 +7,7 @@ test_description='git apply handling copy/rename patch. | ||||
|  | ||||
| ' | ||||
| . ./test-lib.sh | ||||
| . "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh | ||||
|  | ||||
| # setup | ||||
|  | ||||
| @ -31,13 +32,6 @@ test_expect_success setup \ | ||||
| test_expect_success apply \ | ||||
|     'git apply --index --stat --summary --apply test-patch' | ||||
|  | ||||
| if test "$(git config --bool core.filemode)" = false | ||||
| then | ||||
| 	say 'filemode disabled on the filesystem' | ||||
| else | ||||
| 	test_set_prereq FILEMODE | ||||
| fi | ||||
|  | ||||
| test_expect_success FILEMODE validate \ | ||||
| 	    'test -f bar && ls -l bar | grep "^-..x......"' | ||||
|  | ||||
|  | ||||
| @ -9,13 +9,7 @@ test_description='git apply should not get confused with type changes. | ||||
|  | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if ! test_have_prereq SYMLINKS | ||||
| then | ||||
| 	skip_all='Symbolic links not supported, skipping tests.' | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| test_expect_success 'setup repository and commits' ' | ||||
| test_expect_success SYMLINKS 'setup repository and commits' ' | ||||
| 	echo "hello world" > foo && | ||||
| 	echo "hi planet" > bar && | ||||
| 	git update-index --add foo bar && | ||||
| @ -48,7 +42,7 @@ test_expect_success 'setup repository and commits' ' | ||||
| 	git branch foo-baz-renamed-from-foo | ||||
| 	' | ||||
|  | ||||
| test_expect_success 'file renamed from foo to foo/baz' ' | ||||
| test_expect_success SYMLINKS 'file renamed from foo to foo/baz' ' | ||||
| 	git checkout -f initial && | ||||
| 	git diff-tree -M -p HEAD foo-baz-renamed-from-foo > patch && | ||||
| 	git apply --index < patch | ||||
| @ -56,7 +50,7 @@ test_expect_success 'file renamed from foo to foo/baz' ' | ||||
| test_debug 'cat patch' | ||||
|  | ||||
|  | ||||
| test_expect_success 'file renamed from foo/baz to foo' ' | ||||
| test_expect_success SYMLINKS 'file renamed from foo/baz to foo' ' | ||||
| 	git checkout -f foo-baz-renamed-from-foo && | ||||
| 	git diff-tree -M -p HEAD initial > patch && | ||||
| 	git apply --index < patch | ||||
| @ -64,7 +58,7 @@ test_expect_success 'file renamed from foo/baz to foo' ' | ||||
| test_debug 'cat patch' | ||||
|  | ||||
|  | ||||
| test_expect_success 'directory becomes file' ' | ||||
| test_expect_success SYMLINKS 'directory becomes file' ' | ||||
| 	git checkout -f foo-becomes-a-directory && | ||||
| 	git diff-tree -p HEAD initial > patch && | ||||
| 	git apply --index < patch | ||||
| @ -72,7 +66,7 @@ test_expect_success 'directory becomes file' ' | ||||
| test_debug 'cat patch' | ||||
|  | ||||
|  | ||||
| test_expect_success 'file becomes directory' ' | ||||
| test_expect_success SYMLINKS 'file becomes directory' ' | ||||
| 	git checkout -f initial && | ||||
| 	git diff-tree -p HEAD foo-becomes-a-directory > patch && | ||||
| 	git apply --index < patch | ||||
| @ -80,7 +74,7 @@ test_expect_success 'file becomes directory' ' | ||||
| test_debug 'cat patch' | ||||
|  | ||||
|  | ||||
| test_expect_success 'file becomes symlink' ' | ||||
| test_expect_success SYMLINKS 'file becomes symlink' ' | ||||
| 	git checkout -f initial && | ||||
| 	git diff-tree -p HEAD foo-symlinked-to-bar > patch && | ||||
| 	git apply --index < patch | ||||
| @ -88,21 +82,21 @@ test_expect_success 'file becomes symlink' ' | ||||
| test_debug 'cat patch' | ||||
|  | ||||
|  | ||||
| test_expect_success 'symlink becomes file' ' | ||||
| test_expect_success SYMLINKS 'symlink becomes file' ' | ||||
| 	git checkout -f foo-symlinked-to-bar && | ||||
| 	git diff-tree -p HEAD foo-back-to-file > patch && | ||||
| 	git apply --index < patch | ||||
| 	' | ||||
| test_debug 'cat patch' | ||||
|  | ||||
| test_expect_success 'binary file becomes symlink' ' | ||||
| test_expect_success SYMLINKS 'binary file becomes symlink' ' | ||||
| 	git checkout -f foo-becomes-binary && | ||||
| 	git diff-tree -p --binary HEAD foo-symlinked-to-bar > patch && | ||||
| 	git apply --index < patch | ||||
| 	' | ||||
| test_debug 'cat patch' | ||||
|  | ||||
| test_expect_success 'symlink becomes binary file' ' | ||||
| test_expect_success SYMLINKS 'symlink becomes binary file' ' | ||||
| 	git checkout -f foo-symlinked-to-bar && | ||||
| 	git diff-tree -p --binary HEAD foo-becomes-binary > patch && | ||||
| 	git apply --index < patch | ||||
| @ -110,7 +104,7 @@ test_expect_success 'symlink becomes binary file' ' | ||||
| test_debug 'cat patch' | ||||
|  | ||||
|  | ||||
| test_expect_success 'symlink becomes directory' ' | ||||
| test_expect_success SYMLINKS 'symlink becomes directory' ' | ||||
| 	git checkout -f foo-symlinked-to-bar && | ||||
| 	git diff-tree -p HEAD foo-becomes-a-directory > patch && | ||||
| 	git apply --index < patch | ||||
| @ -118,7 +112,7 @@ test_expect_success 'symlink becomes directory' ' | ||||
| test_debug 'cat patch' | ||||
|  | ||||
|  | ||||
| test_expect_success 'directory becomes symlink' ' | ||||
| test_expect_success SYMLINKS 'directory becomes symlink' ' | ||||
| 	git checkout -f foo-becomes-a-directory && | ||||
| 	git diff-tree -p HEAD foo-symlinked-to-bar > patch && | ||||
| 	git apply --index < patch | ||||
|  | ||||
| @ -9,13 +9,7 @@ test_description='git apply symlinks and partial files | ||||
|  | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if ! test_have_prereq SYMLINKS | ||||
| then | ||||
| 	skip_all='Symbolic links not supported, skipping tests.' | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| test_expect_success setup ' | ||||
| test_expect_success SYMLINKS setup ' | ||||
|  | ||||
| 	ln -s path1/path2/path3/path4/path5 link1 && | ||||
| 	git add link? && | ||||
| @ -34,7 +28,7 @@ test_expect_success setup ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'apply symlink patch' ' | ||||
| test_expect_success SYMLINKS 'apply symlink patch' ' | ||||
|  | ||||
| 	git checkout side && | ||||
| 	git apply patch && | ||||
| @ -43,7 +37,7 @@ test_expect_success 'apply symlink patch' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'apply --index symlink patch' ' | ||||
| test_expect_success SYMLINKS 'apply --index symlink patch' ' | ||||
|  | ||||
| 	git checkout -f side && | ||||
| 	git apply --index patch && | ||||
|  | ||||
| @ -3,12 +3,6 @@ | ||||
| test_description='apply to deeper directory without getting fooled with symlink' | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if ! test_have_prereq SYMLINKS | ||||
| then | ||||
| 	skip_all='Symbolic links not supported, skipping tests.' | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| lecho () { | ||||
| 	for l_ | ||||
| 	do | ||||
| @ -16,7 +10,7 @@ lecho () { | ||||
| 	done | ||||
| } | ||||
|  | ||||
| test_expect_success setup ' | ||||
| test_expect_success SYMLINKS setup ' | ||||
|  | ||||
| 	mkdir -p arch/i386/boot arch/x86_64 && | ||||
| 	lecho 1 2 3 4 5 >arch/i386/boot/Makefile && | ||||
| @ -37,7 +31,7 @@ test_expect_success setup ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success apply ' | ||||
| test_expect_success SYMLINKS apply ' | ||||
|  | ||||
| 	git checkout test && | ||||
| 	git diff --exit-code test && | ||||
| @ -46,7 +40,7 @@ test_expect_success apply ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check result' ' | ||||
| test_expect_success SYMLINKS 'check result' ' | ||||
|  | ||||
| 	git diff --exit-code master && | ||||
| 	git diff --exit-code --cached master && | ||||
|  | ||||
| @ -3,13 +3,7 @@ | ||||
| test_description='applying patch with mode bits' | ||||
|  | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if test "$(git config --bool core.filemode)" = false | ||||
| then | ||||
| 	say 'filemode disabled on the filesystem' | ||||
| else | ||||
| 	test_set_prereq FILEMODE | ||||
| fi | ||||
| . "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh | ||||
|  | ||||
| test_expect_success setup ' | ||||
| 	echo original >file && | ||||
|  | ||||
| @ -6,8 +6,11 @@ test_description='test automatic tag following' | ||||
|  | ||||
| case $(uname -s) in | ||||
| *MINGW*) | ||||
| 	skip_all="GIT_DEBUG_SEND_PACK not supported - skipping tests" | ||||
| 	test_done | ||||
| 	say "GIT_DEBUG_SEND_PACK not supported - skipping tests" | ||||
| 	;; | ||||
| *) | ||||
| 	test_set_prereq NOT_MINGW | ||||
| 	;; | ||||
| esac | ||||
|  | ||||
| # End state of the repository: | ||||
| @ -19,7 +22,7 @@ esac | ||||
| #     \   C - origin/cat    \ | ||||
| #      origin/master         master | ||||
|  | ||||
| test_expect_success setup ' | ||||
| test_expect_success NOT_MINGW setup ' | ||||
| 	test_tick && | ||||
| 	echo ichi >file && | ||||
| 	git add file && | ||||
| @ -42,12 +45,15 @@ test_expect_success setup ' | ||||
|  | ||||
| U=UPLOAD_LOG | ||||
|  | ||||
| test_expect_success NOT_MINGW 'setup expect' ' | ||||
| cat - <<EOF >expect | ||||
| #S | ||||
| want $A | ||||
| #E | ||||
| EOF | ||||
| test_expect_success 'fetch A (new commit : 1 connection)' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success NOT_MINGW 'fetch A (new commit : 1 connection)' ' | ||||
| 	rm -f $U | ||||
| 	( | ||||
| 		cd cloned && | ||||
| @ -59,7 +65,7 @@ test_expect_success 'fetch A (new commit : 1 connection)' ' | ||||
| 	test_cmp expect actual | ||||
| ' | ||||
|  | ||||
| test_expect_success "create tag T on A, create C on branch cat" ' | ||||
| test_expect_success NOT_MINGW "create tag T on A, create C on branch cat" ' | ||||
| 	git tag -a -m tag1 tag1 $A && | ||||
| 	T=$(git rev-parse --verify tag1) && | ||||
|  | ||||
| @ -71,13 +77,16 @@ test_expect_success "create tag T on A, create C on branch cat" ' | ||||
| 	git checkout master | ||||
| ' | ||||
|  | ||||
| test_expect_success NOT_MINGW 'setup expect' ' | ||||
| cat - <<EOF >expect | ||||
| #S | ||||
| want $C | ||||
| want $T | ||||
| #E | ||||
| EOF | ||||
| test_expect_success 'fetch C, T (new branch, tag : 1 connection)' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success NOT_MINGW 'fetch C, T (new branch, tag : 1 connection)' ' | ||||
| 	rm -f $U | ||||
| 	( | ||||
| 		cd cloned && | ||||
| @ -91,7 +100,7 @@ test_expect_success 'fetch C, T (new branch, tag : 1 connection)' ' | ||||
| 	test_cmp expect actual | ||||
| ' | ||||
|  | ||||
| test_expect_success "create commits O, B, tag S on B" ' | ||||
| test_expect_success NOT_MINGW "create commits O, B, tag S on B" ' | ||||
| 	test_tick && | ||||
| 	echo O >file && | ||||
| 	git add file && | ||||
| @ -107,13 +116,16 @@ test_expect_success "create commits O, B, tag S on B" ' | ||||
| 	S=$(git rev-parse --verify tag2) | ||||
| ' | ||||
|  | ||||
| test_expect_success NOT_MINGW 'setup expect' ' | ||||
| cat - <<EOF >expect | ||||
| #S | ||||
| want $B | ||||
| want $S | ||||
| #E | ||||
| EOF | ||||
| test_expect_success 'fetch B, S (commit and tag : 1 connection)' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success NOT_MINGW 'fetch B, S (commit and tag : 1 connection)' ' | ||||
| 	rm -f $U | ||||
| 	( | ||||
| 		cd cloned && | ||||
| @ -127,13 +139,16 @@ test_expect_success 'fetch B, S (commit and tag : 1 connection)' ' | ||||
| 	test_cmp expect actual | ||||
| ' | ||||
|  | ||||
| test_expect_success NOT_MINGW 'setup expect' ' | ||||
| cat - <<EOF >expect | ||||
| #S | ||||
| want $B | ||||
| want $S | ||||
| #E | ||||
| EOF | ||||
| test_expect_success 'new clone fetch master and tags' ' | ||||
| ' | ||||
|  | ||||
| test_expect_success NOT_MINGW 'new clone fetch master and tags' ' | ||||
| 	git branch -D cat | ||||
| 	rm -f $U | ||||
| 	( | ||||
|  | ||||
| @ -4,12 +4,6 @@ test_description='pulling from symlinked subdir' | ||||
|  | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if ! test_have_prereq SYMLINKS | ||||
| then | ||||
| 	skip_all='Symbolic links not supported, skipping tests.' | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| # The scenario we are building: | ||||
| # | ||||
| #   trash\ directory/ | ||||
| @ -20,7 +14,7 @@ fi | ||||
| # | ||||
| # The working directory is subdir-link. | ||||
|  | ||||
| test_expect_success setup ' | ||||
| test_expect_success SYMLINKS setup ' | ||||
| 	mkdir subdir && | ||||
| 	echo file >subdir/file && | ||||
| 	git add subdir/file && | ||||
| @ -36,7 +30,7 @@ test_expect_success setup ' | ||||
|  | ||||
| # Demonstrate that things work if we just avoid the symlink | ||||
| # | ||||
| test_expect_success 'pulling from real subdir' ' | ||||
| test_expect_success SYMLINKS 'pulling from real subdir' ' | ||||
| 	( | ||||
| 		echo real >subdir/file && | ||||
| 		git commit -m real subdir/file && | ||||
| @ -64,7 +58,7 @@ test_expect_success 'pulling from real subdir' ' | ||||
| # directory.  A POSIX shell's "cd" works a little differently | ||||
| # than chdir() in C; "cd -P" is much closer to chdir(). | ||||
| # | ||||
| test_expect_success 'pulling from symlinked subdir' ' | ||||
| test_expect_success SYMLINKS 'pulling from symlinked subdir' ' | ||||
| 	( | ||||
| 		echo link >subdir/file && | ||||
| 		git commit -m link subdir/file && | ||||
| @ -77,7 +71,7 @@ test_expect_success 'pulling from symlinked subdir' ' | ||||
| # Prove that the remote end really is a repo, and other commands | ||||
| # work fine in this context.  It's just that "git pull" breaks. | ||||
| # | ||||
| test_expect_success 'pushing from symlinked subdir' ' | ||||
| test_expect_success SYMLINKS 'pushing from symlinked subdir' ' | ||||
| 	( | ||||
| 		cd subdir-link/ && | ||||
| 		echo push >file && | ||||
|  | ||||
| @ -163,8 +163,6 @@ test_expect_success 'clone a void' ' | ||||
|  | ||||
| test_expect_success 'clone respects global branch.autosetuprebase' ' | ||||
| 	( | ||||
| 		HOME=$(pwd) && | ||||
| 		export HOME && | ||||
| 		test_config="$HOME/.gitconfig" && | ||||
| 		unset GIT_CONFIG_NOGLOBAL && | ||||
| 		git config -f "$test_config" branch.autosetuprebase remote && | ||||
|  | ||||
| @ -3,12 +3,14 @@ | ||||
| test_description='Test cloning a repository larger than 2 gigabyte' | ||||
| . ./test-lib.sh | ||||
|  | ||||
| test -z "$GIT_TEST_CLONE_2GB" && | ||||
| skip_all="Skipping expensive 2GB clone test; enable it with GIT_TEST_CLONE_2GB=t" && | ||||
| test_done && | ||||
| exit | ||||
| if test -z "$GIT_TEST_CLONE_2GB" | ||||
| then | ||||
| 	say 'Skipping expensive 2GB clone test; enable it with GIT_TEST_CLONE_2GB=t' | ||||
| else | ||||
| 	test_set_prereq CLONE_2GB | ||||
| fi | ||||
|  | ||||
| test_expect_success 'setup' ' | ||||
| test_expect_success CLONE_2GB 'setup' ' | ||||
|  | ||||
| 	git config pack.compression 0 && | ||||
| 	git config pack.depth 0 && | ||||
| @ -36,13 +38,13 @@ test_expect_success 'setup' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'clone - bare' ' | ||||
| test_expect_success CLONE_2GB 'clone - bare' ' | ||||
|  | ||||
| 	git clone --bare --no-hardlinks . clone-bare | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'clone - with worktree, file:// protocol' ' | ||||
| test_expect_success CLONE_2GB 'clone - with worktree, file:// protocol' ' | ||||
|  | ||||
| 	git clone file://. clone-wt | ||||
|  | ||||
|  | ||||
| @ -13,13 +13,11 @@ if sys.hexversion < 0x02040000: | ||||
|     sys.exit(1) | ||||
| ' | ||||
| then | ||||
| 	: | ||||
| else | ||||
| 	skip_all='skipping git remote-testgit tests: requires Python 2.4 or newer' | ||||
| 	test_done | ||||
|     # Requires Python 2.4 or newer | ||||
| 	test_set_prereq PYTHON_24 | ||||
| fi | ||||
|  | ||||
| test_expect_success 'setup repository' ' | ||||
| test_expect_success PYTHON_24 'setup repository' ' | ||||
| 	git init --bare server/.git && | ||||
| 	git clone server public && | ||||
| 	(cd public && | ||||
| @ -29,34 +27,34 @@ test_expect_success 'setup repository' ' | ||||
| 	 git push origin master) | ||||
| ' | ||||
|  | ||||
| test_expect_success 'cloning from local repo' ' | ||||
| test_expect_success PYTHON_24 'cloning from local repo' ' | ||||
| 	git clone "testgit::${PWD}/server" localclone && | ||||
| 	test_cmp public/file localclone/file | ||||
| ' | ||||
|  | ||||
| test_expect_success 'cloning from remote repo' ' | ||||
| test_expect_success PYTHON_24 'cloning from remote repo' ' | ||||
| 	git clone "testgit::file://${PWD}/server" clone && | ||||
| 	test_cmp public/file clone/file | ||||
| ' | ||||
|  | ||||
| test_expect_success 'create new commit on remote' ' | ||||
| test_expect_success PYTHON_24 'create new commit on remote' ' | ||||
| 	(cd public && | ||||
| 	 echo content >>file && | ||||
| 	 git commit -a -m two && | ||||
| 	 git push) | ||||
| ' | ||||
|  | ||||
| test_expect_success 'pulling from local repo' ' | ||||
| test_expect_success PYTHON_24 'pulling from local repo' ' | ||||
| 	(cd localclone && git pull) && | ||||
| 	test_cmp public/file localclone/file | ||||
| ' | ||||
|  | ||||
| test_expect_success 'pulling from remote remote' ' | ||||
| test_expect_success PYTHON_24 'pulling from remote remote' ' | ||||
| 	(cd clone && git pull) && | ||||
| 	test_cmp public/file clone/file | ||||
| ' | ||||
|  | ||||
| test_expect_success 'pushing to local repo' ' | ||||
| test_expect_success PYTHON_24 'pushing to local repo' ' | ||||
| 	(cd localclone && | ||||
| 	echo content >>file && | ||||
| 	git commit -a -m three && | ||||
| @ -65,12 +63,12 @@ test_expect_success 'pushing to local repo' ' | ||||
| 	test $HEAD = $(git --git-dir=server/.git rev-parse --verify HEAD) | ||||
| ' | ||||
|  | ||||
| test_expect_success 'synch with changes from localclone' ' | ||||
| test_expect_success PYTHON_24 'synch with changes from localclone' ' | ||||
| 	(cd clone && | ||||
| 	 git pull) | ||||
| ' | ||||
|  | ||||
| test_expect_success 'pushing remote local repo' ' | ||||
| test_expect_success PYTHON_24 'pushing remote local repo' ' | ||||
| 	(cd clone && | ||||
| 	echo content >>file && | ||||
| 	git commit -a -m four && | ||||
|  | ||||
| @ -2,11 +2,7 @@ | ||||
|  | ||||
| test_description='merge-recursive: handle file mode' | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if ! test "$(git config --bool core.filemode)" = false | ||||
| then | ||||
| 	test_set_prereq FILEMODE | ||||
| fi | ||||
| . "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh | ||||
|  | ||||
| test_expect_success 'mode change in one branch: keep changed version' ' | ||||
| 	: >file1 && | ||||
|  | ||||
| @ -3,13 +3,7 @@ | ||||
| test_description='merging when a directory was replaced with a symlink' | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if ! test_have_prereq SYMLINKS | ||||
| then | ||||
| 	skip_all='Symbolic links not supported, skipping tests.' | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| test_expect_success 'create a commit where dir a/b changed to symlink' ' | ||||
| test_expect_success SYMLINKS 'create a commit where dir a/b changed to symlink' ' | ||||
| 	mkdir -p a/b/c a/b-2/c && | ||||
| 	> a/b/c/d && | ||||
| 	> a/b-2/c/d && | ||||
| @ -23,7 +17,7 @@ test_expect_success 'create a commit where dir a/b changed to symlink' ' | ||||
| 	git commit -m "dir to symlink" | ||||
| ' | ||||
|  | ||||
| test_expect_success 'keep a/b-2/c/d across checkout' ' | ||||
| test_expect_success SYMLINKS 'keep a/b-2/c/d across checkout' ' | ||||
| 	git checkout HEAD^0 && | ||||
| 	git reset --hard master && | ||||
| 	git rm --cached a/b && | ||||
| @ -32,14 +26,14 @@ test_expect_success 'keep a/b-2/c/d across checkout' ' | ||||
| 	 test -f a/b-2/c/d | ||||
| ' | ||||
|  | ||||
| test_expect_success 'checkout should not have deleted a/b-2/c/d' ' | ||||
| test_expect_success SYMLINKS 'checkout should not have deleted a/b-2/c/d' ' | ||||
| 	git checkout HEAD^0 && | ||||
| 	git reset --hard master && | ||||
| 	 git checkout start^0 && | ||||
| 	 test -f a/b-2/c/d | ||||
| ' | ||||
|  | ||||
| test_expect_success 'setup for merge test' ' | ||||
| test_expect_success SYMLINKS 'setup for merge test' ' | ||||
| 	git reset --hard && | ||||
| 	test -f a/b-2/c/d && | ||||
| 	echo x > a/x && | ||||
| @ -48,7 +42,7 @@ test_expect_success 'setup for merge test' ' | ||||
| 	git tag baseline | ||||
| ' | ||||
|  | ||||
| test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (resolve)' ' | ||||
| test_expect_success SYMLINKS 'Handle D/F conflict, do not lose a/b-2/c/d in merge (resolve)' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout baseline^0 && | ||||
| 	git merge -s resolve master && | ||||
| @ -56,7 +50,7 @@ test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (resolv | ||||
| 	test -f a/b-2/c/d | ||||
| ' | ||||
|  | ||||
| test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (recursive)' ' | ||||
| test_expect_success SYMLINKS 'Handle D/F conflict, do not lose a/b-2/c/d in merge (recursive)' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout baseline^0 && | ||||
| 	git merge -s recursive master && | ||||
| @ -64,7 +58,7 @@ test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (recurs | ||||
| 	test -f a/b-2/c/d | ||||
| ' | ||||
|  | ||||
| test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (resolve)' ' | ||||
| test_expect_success SYMLINKS 'Handle F/D conflict, do not lose a/b-2/c/d in merge (resolve)' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout master^0 && | ||||
| 	git merge -s resolve baseline^0 && | ||||
| @ -72,7 +66,7 @@ test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (resolv | ||||
| 	test -f a/b-2/c/d | ||||
| ' | ||||
|  | ||||
| test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (recursive)' ' | ||||
| test_expect_success SYMLINKS 'Handle F/D conflict, do not lose a/b-2/c/d in merge (recursive)' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout master^0 && | ||||
| 	git merge -s recursive baseline^0 && | ||||
| @ -80,7 +74,7 @@ test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (recurs | ||||
| 	test -f a/b-2/c/d | ||||
| ' | ||||
|  | ||||
| test_expect_failure 'do not lose untracked in merge (resolve)' ' | ||||
| test_expect_failure SYMLINKS 'do not lose untracked in merge (resolve)' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout baseline^0 && | ||||
| 	>a/b/c/e && | ||||
| @ -89,7 +83,7 @@ test_expect_failure 'do not lose untracked in merge (resolve)' ' | ||||
| 	test -f a/b-2/c/d | ||||
| ' | ||||
|  | ||||
| test_expect_success 'do not lose untracked in merge (recursive)' ' | ||||
| test_expect_success SYMLINKS 'do not lose untracked in merge (recursive)' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout baseline^0 && | ||||
| 	>a/b/c/e && | ||||
| @ -98,21 +92,21 @@ test_expect_success 'do not lose untracked in merge (recursive)' ' | ||||
| 	test -f a/b-2/c/d | ||||
| ' | ||||
|  | ||||
| test_expect_success 'do not lose modifications in merge (resolve)' ' | ||||
| test_expect_success SYMLINKS 'do not lose modifications in merge (resolve)' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout baseline^0 && | ||||
| 	echo more content >>a/b/c/d && | ||||
| 	test_must_fail git merge -s resolve master | ||||
| ' | ||||
|  | ||||
| test_expect_success 'do not lose modifications in merge (recursive)' ' | ||||
| test_expect_success SYMLINKS 'do not lose modifications in merge (recursive)' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout baseline^0 && | ||||
| 	echo more content >>a/b/c/d && | ||||
| 	test_must_fail git merge -s recursive master | ||||
| ' | ||||
|  | ||||
| test_expect_success 'setup a merge where dir a/b-2 changed to symlink' ' | ||||
| test_expect_success SYMLINKS 'setup a merge where dir a/b-2 changed to symlink' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout start^0 && | ||||
| 	rm -rf a/b-2 && | ||||
| @ -122,7 +116,7 @@ test_expect_success 'setup a merge where dir a/b-2 changed to symlink' ' | ||||
| 	git tag test2 | ||||
| ' | ||||
|  | ||||
| test_expect_success 'merge should not have D/F conflicts (resolve)' ' | ||||
| test_expect_success SYMLINKS 'merge should not have D/F conflicts (resolve)' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout baseline^0 && | ||||
| 	git merge -s resolve test2 && | ||||
| @ -130,7 +124,7 @@ test_expect_success 'merge should not have D/F conflicts (resolve)' ' | ||||
| 	test -f a/b/c/d | ||||
| ' | ||||
|  | ||||
| test_expect_success 'merge should not have D/F conflicts (recursive)' ' | ||||
| test_expect_success SYMLINKS 'merge should not have D/F conflicts (recursive)' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout baseline^0 && | ||||
| 	git merge -s recursive test2 && | ||||
| @ -138,7 +132,7 @@ test_expect_success 'merge should not have D/F conflicts (recursive)' ' | ||||
| 	test -f a/b/c/d | ||||
| ' | ||||
|  | ||||
| test_expect_success 'merge should not have F/D conflicts (recursive)' ' | ||||
| test_expect_success SYMLINKS 'merge should not have F/D conflicts (recursive)' ' | ||||
| 	git reset --hard && | ||||
| 	git checkout -b foo test2 && | ||||
| 	git merge -s recursive baseline^0 && | ||||
|  | ||||
| @ -111,13 +111,13 @@ do | ||||
| 	' | ||||
| done | ||||
|  | ||||
| if ! echo 'echo space > "$1"' > "e space.sh" | ||||
| if echo 'echo space > "$1"' > "e space.sh" | ||||
| then | ||||
| 	skip_all="Skipping; FS does not support spaces in filenames" | ||||
| 	test_done | ||||
| 	# FS supports spaces in filenames | ||||
| 	test_set_prereq SPACES_IN_FILENAMES | ||||
| fi | ||||
|  | ||||
| test_expect_success 'editor with a space' ' | ||||
| test_expect_success SPACES_IN_FILENAMES 'editor with a space' ' | ||||
|  | ||||
| 	chmod a+x "e space.sh" && | ||||
| 	GIT_EDITOR="./e\ space.sh" git commit --amend && | ||||
| @ -126,7 +126,7 @@ test_expect_success 'editor with a space' ' | ||||
| ' | ||||
|  | ||||
| unset GIT_EDITOR | ||||
| test_expect_success 'core.editor with a space' ' | ||||
| test_expect_success SPACES_IN_FILENAMES 'core.editor with a space' ' | ||||
|  | ||||
| 	git config core.editor \"./e\ space.sh\" && | ||||
| 	git commit --amend && | ||||
|  | ||||
| @ -3,7 +3,7 @@ | ||||
| test_description='git reset --patch' | ||||
| . ./lib-patch-mode.sh | ||||
|  | ||||
| test_expect_success 'setup' ' | ||||
| test_expect_success PERL 'setup' ' | ||||
| 	mkdir dir && | ||||
| 	echo parent > dir/foo && | ||||
| 	echo dummy > bar && | ||||
| @ -17,20 +17,20 @@ test_expect_success 'setup' ' | ||||
|  | ||||
| # note: bar sorts before foo, so the first 'n' is always to skip 'bar' | ||||
|  | ||||
| test_expect_success 'saying "n" does nothing' ' | ||||
| test_expect_success PERL 'saying "n" does nothing' ' | ||||
| 	set_and_save_state dir/foo work work | ||||
| 	(echo n; echo n) | git reset -p && | ||||
| 	verify_saved_state dir/foo && | ||||
| 	verify_saved_state bar | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git reset -p' ' | ||||
| test_expect_success PERL 'git reset -p' ' | ||||
| 	(echo n; echo y) | git reset -p && | ||||
| 	verify_state dir/foo work head && | ||||
| 	verify_saved_state bar | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git reset -p HEAD^' ' | ||||
| test_expect_success PERL 'git reset -p HEAD^' ' | ||||
| 	(echo n; echo y) | git reset -p HEAD^ && | ||||
| 	verify_state dir/foo work parent && | ||||
| 	verify_saved_state bar | ||||
| @ -41,27 +41,27 @@ test_expect_success 'git reset -p HEAD^' ' | ||||
| # dir/foo.  There's always an extra 'n' to reject edits to dir/foo in | ||||
| # the failure case (and thus get out of the loop). | ||||
|  | ||||
| test_expect_success 'git reset -p dir' ' | ||||
| test_expect_success PERL 'git reset -p dir' ' | ||||
| 	set_state dir/foo work work | ||||
| 	(echo y; echo n) | git reset -p dir && | ||||
| 	verify_state dir/foo work head && | ||||
| 	verify_saved_state bar | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git reset -p -- foo (inside dir)' ' | ||||
| test_expect_success PERL 'git reset -p -- foo (inside dir)' ' | ||||
| 	set_state dir/foo work work | ||||
| 	(echo y; echo n) | (cd dir && git reset -p -- foo) && | ||||
| 	verify_state dir/foo work head && | ||||
| 	verify_saved_state bar | ||||
| ' | ||||
|  | ||||
| test_expect_success 'git reset -p HEAD^ -- dir' ' | ||||
| test_expect_success PERL 'git reset -p HEAD^ -- dir' ' | ||||
| 	(echo y; echo n) | git reset -p HEAD^ -- dir && | ||||
| 	verify_state dir/foo work parent && | ||||
| 	verify_saved_state bar | ||||
| ' | ||||
|  | ||||
| test_expect_success 'none of this moved HEAD' ' | ||||
| test_expect_success PERL 'none of this moved HEAD' ' | ||||
| 	verify_saved_head | ||||
| ' | ||||
|  | ||||
|  | ||||
| @ -388,16 +388,15 @@ test_expect_success 'core.excludesfile' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'removal failure' ' | ||||
| test_expect_success SANITY 'removal failure' ' | ||||
|  | ||||
| 	mkdir foo && | ||||
| 	touch foo/bar && | ||||
| 	(exec <foo/bar && | ||||
| 	 chmod 0 foo && | ||||
| 	 test_must_fail git clean -f -d) | ||||
|  | ||||
| 	 test_must_fail git clean -f -d && | ||||
| 	 chmod 755 foo) | ||||
| ' | ||||
| chmod 755 foo | ||||
|  | ||||
| test_expect_success 'nested git work tree' ' | ||||
| 	rm -fr foo bar && | ||||
|  | ||||
| @ -793,7 +793,7 @@ test_expect_success 'commit --dry-run submodule summary (--amend)' ' | ||||
| 	test_cmp expect output | ||||
| ' | ||||
|  | ||||
| test_expect_success POSIXPERM 'status succeeds in a read-only repository' ' | ||||
| test_expect_success POSIXPERM,SANITY 'status succeeds in a read-only repository' ' | ||||
| 	( | ||||
| 		chmod a-w .git && | ||||
| 		# make dir1/tracked stat-dirty | ||||
|  | ||||
| @ -10,11 +10,6 @@ Testing basic diff tool invocation | ||||
|  | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if ! test_have_prereq PERL; then | ||||
| 	skip_all='skipping difftool tests, perl not available' | ||||
| 	test_done | ||||
| fi | ||||
|  | ||||
| LF=' | ||||
| ' | ||||
|  | ||||
| @ -50,7 +45,7 @@ prompt_given() | ||||
| } | ||||
|  | ||||
| # Create a file on master and change it on branch | ||||
| test_expect_success 'setup' ' | ||||
| test_expect_success PERL 'setup' ' | ||||
| 	echo master >file && | ||||
| 	git add file && | ||||
| 	git commit -m "added file" && | ||||
| @ -62,7 +57,7 @@ test_expect_success 'setup' ' | ||||
| ' | ||||
|  | ||||
| # Configure a custom difftool.<tool>.cmd and use it | ||||
| test_expect_success 'custom commands' ' | ||||
| test_expect_success PERL 'custom commands' ' | ||||
| 	restore_test_defaults && | ||||
| 	git config difftool.test-tool.cmd "cat \$REMOTE" && | ||||
|  | ||||
| @ -75,13 +70,13 @@ test_expect_success 'custom commands' ' | ||||
| ' | ||||
|  | ||||
| # Ensures that git-difftool ignores bogus --tool values | ||||
| test_expect_success 'difftool ignores bad --tool values' ' | ||||
| test_expect_success PERL 'difftool ignores bad --tool values' ' | ||||
| 	diff=$(git difftool --no-prompt --tool=bad-tool branch) | ||||
| 	test "$?" = 1 && | ||||
| 	test "$diff" = "" | ||||
| ' | ||||
|  | ||||
| test_expect_success 'difftool honors --gui' ' | ||||
| test_expect_success PERL 'difftool honors --gui' ' | ||||
| 	git config merge.tool bogus-tool && | ||||
| 	git config diff.tool bogus-tool && | ||||
| 	git config diff.guitool test-tool && | ||||
| @ -92,7 +87,7 @@ test_expect_success 'difftool honors --gui' ' | ||||
| 	restore_test_defaults | ||||
| ' | ||||
|  | ||||
| test_expect_success 'difftool --gui works without configured diff.guitool' ' | ||||
| test_expect_success PERL 'difftool --gui works without configured diff.guitool' ' | ||||
| 	git config diff.tool test-tool && | ||||
|  | ||||
| 	diff=$(git difftool --no-prompt --gui branch) && | ||||
| @ -102,7 +97,7 @@ test_expect_success 'difftool --gui works without configured diff.guitool' ' | ||||
| ' | ||||
|  | ||||
| # Specify the diff tool using $GIT_DIFF_TOOL | ||||
| test_expect_success 'GIT_DIFF_TOOL variable' ' | ||||
| test_expect_success PERL 'GIT_DIFF_TOOL variable' ' | ||||
| 	git config --unset diff.tool | ||||
| 	GIT_DIFF_TOOL=test-tool && | ||||
| 	export GIT_DIFF_TOOL && | ||||
| @ -115,7 +110,7 @@ test_expect_success 'GIT_DIFF_TOOL variable' ' | ||||
|  | ||||
| # Test the $GIT_*_TOOL variables and ensure | ||||
| # that $GIT_DIFF_TOOL always wins unless --tool is specified | ||||
| test_expect_success 'GIT_DIFF_TOOL overrides' ' | ||||
| test_expect_success PERL 'GIT_DIFF_TOOL overrides' ' | ||||
| 	git config diff.tool bogus-tool && | ||||
| 	git config merge.tool bogus-tool && | ||||
|  | ||||
| @ -136,7 +131,7 @@ test_expect_success 'GIT_DIFF_TOOL overrides' ' | ||||
|  | ||||
| # Test that we don't have to pass --no-prompt to difftool | ||||
| # when $GIT_DIFFTOOL_NO_PROMPT is true | ||||
| test_expect_success 'GIT_DIFFTOOL_NO_PROMPT variable' ' | ||||
| test_expect_success PERL 'GIT_DIFFTOOL_NO_PROMPT variable' ' | ||||
| 	GIT_DIFFTOOL_NO_PROMPT=true && | ||||
| 	export GIT_DIFFTOOL_NO_PROMPT && | ||||
|  | ||||
| @ -148,7 +143,7 @@ test_expect_success 'GIT_DIFFTOOL_NO_PROMPT variable' ' | ||||
|  | ||||
| # git-difftool supports the difftool.prompt variable. | ||||
| # Test that GIT_DIFFTOOL_PROMPT can override difftool.prompt = false | ||||
| test_expect_success 'GIT_DIFFTOOL_PROMPT variable' ' | ||||
| test_expect_success PERL 'GIT_DIFFTOOL_PROMPT variable' ' | ||||
| 	git config difftool.prompt false && | ||||
| 	GIT_DIFFTOOL_PROMPT=true && | ||||
| 	export GIT_DIFFTOOL_PROMPT && | ||||
| @ -160,7 +155,7 @@ test_expect_success 'GIT_DIFFTOOL_PROMPT variable' ' | ||||
| ' | ||||
|  | ||||
| # Test that we don't have to pass --no-prompt when difftool.prompt is false | ||||
| test_expect_success 'difftool.prompt config variable is false' ' | ||||
| test_expect_success PERL 'difftool.prompt config variable is false' ' | ||||
| 	git config difftool.prompt false && | ||||
|  | ||||
| 	diff=$(git difftool branch) && | ||||
| @ -170,7 +165,7 @@ test_expect_success 'difftool.prompt config variable is false' ' | ||||
| ' | ||||
|  | ||||
| # Test that we don't have to pass --no-prompt when mergetool.prompt is false | ||||
| test_expect_success 'difftool merge.prompt = false' ' | ||||
| test_expect_success PERL 'difftool merge.prompt = false' ' | ||||
| 	git config --unset difftool.prompt | ||||
| 	git config mergetool.prompt false && | ||||
|  | ||||
| @ -181,7 +176,7 @@ test_expect_success 'difftool merge.prompt = false' ' | ||||
| ' | ||||
|  | ||||
| # Test that the -y flag can override difftool.prompt = true | ||||
| test_expect_success 'difftool.prompt can overridden with -y' ' | ||||
| test_expect_success PERL 'difftool.prompt can overridden with -y' ' | ||||
| 	git config difftool.prompt true && | ||||
|  | ||||
| 	diff=$(git difftool -y branch) && | ||||
| @ -191,7 +186,7 @@ test_expect_success 'difftool.prompt can overridden with -y' ' | ||||
| ' | ||||
|  | ||||
| # Test that the --prompt flag can override difftool.prompt = false | ||||
| test_expect_success 'difftool.prompt can overridden with --prompt' ' | ||||
| test_expect_success PERL 'difftool.prompt can overridden with --prompt' ' | ||||
| 	git config difftool.prompt false && | ||||
|  | ||||
| 	prompt=$(echo | git difftool --prompt branch | tail -1) && | ||||
| @ -201,7 +196,7 @@ test_expect_success 'difftool.prompt can overridden with --prompt' ' | ||||
| ' | ||||
|  | ||||
| # Test that the last flag passed on the command-line wins | ||||
| test_expect_success 'difftool last flag wins' ' | ||||
| test_expect_success PERL 'difftool last flag wins' ' | ||||
| 	diff=$(git difftool --prompt --no-prompt branch) && | ||||
| 	test "$diff" = "branch" && | ||||
|  | ||||
| @ -215,7 +210,7 @@ test_expect_success 'difftool last flag wins' ' | ||||
|  | ||||
| # git-difftool falls back to git-mergetool config variables | ||||
| # so test that behavior here | ||||
| test_expect_success 'difftool + mergetool config variables' ' | ||||
| test_expect_success PERL 'difftool + mergetool config variables' ' | ||||
| 	remove_config_vars | ||||
| 	git config merge.tool test-tool && | ||||
| 	git config mergetool.test-tool.cmd "cat \$LOCAL" && | ||||
| @ -233,7 +228,7 @@ test_expect_success 'difftool + mergetool config variables' ' | ||||
| 	restore_test_defaults | ||||
| ' | ||||
|  | ||||
| test_expect_success 'difftool.<tool>.path' ' | ||||
| test_expect_success PERL 'difftool.<tool>.path' ' | ||||
| 	git config difftool.tkdiff.path echo && | ||||
| 	diff=$(git difftool --tool=tkdiff --no-prompt branch) && | ||||
| 	git config --unset difftool.tkdiff.path && | ||||
| @ -243,32 +238,32 @@ test_expect_success 'difftool.<tool>.path' ' | ||||
| 	restore_test_defaults | ||||
| ' | ||||
|  | ||||
| test_expect_success 'difftool --extcmd=cat' ' | ||||
| test_expect_success PERL 'difftool --extcmd=cat' ' | ||||
| 	diff=$(git difftool --no-prompt --extcmd=cat branch) && | ||||
| 	test "$diff" = branch"$LF"master | ||||
| ' | ||||
|  | ||||
| test_expect_success 'difftool --extcmd cat' ' | ||||
| test_expect_success PERL 'difftool --extcmd cat' ' | ||||
| 	diff=$(git difftool --no-prompt --extcmd cat branch) && | ||||
| 	test "$diff" = branch"$LF"master | ||||
| ' | ||||
|  | ||||
| test_expect_success 'difftool -x cat' ' | ||||
| test_expect_success PERL 'difftool -x cat' ' | ||||
| 	diff=$(git difftool --no-prompt -x cat branch) && | ||||
| 	test "$diff" = branch"$LF"master | ||||
| ' | ||||
|  | ||||
| test_expect_success 'difftool --extcmd echo arg1' ' | ||||
| test_expect_success PERL 'difftool --extcmd echo arg1' ' | ||||
| 	diff=$(git difftool --no-prompt --extcmd sh\ -c\ \"echo\ \$1\" branch) | ||||
| 	test "$diff" = file | ||||
| ' | ||||
|  | ||||
| test_expect_success 'difftool --extcmd cat arg1' ' | ||||
| test_expect_success PERL 'difftool --extcmd cat arg1' ' | ||||
| 	diff=$(git difftool --no-prompt --extcmd sh\ -c\ \"cat\ \$1\" branch) | ||||
| 	test "$diff" = master | ||||
| ' | ||||
|  | ||||
| test_expect_success 'difftool --extcmd cat arg2' ' | ||||
| test_expect_success PERL 'difftool --extcmd cat arg2' ' | ||||
| 	diff=$(git difftool --no-prompt --extcmd sh\ -c\ \"cat\ \$2\" branch) | ||||
| 	test "$diff" = branch | ||||
| ' | ||||
|  | ||||
| @ -3,20 +3,17 @@ | ||||
| test_description='git send-email' | ||||
| . ./test-lib.sh | ||||
|  | ||||
| if ! test_have_prereq PERL; then | ||||
| 	skip_all='skipping git send-email tests, perl not available' | ||||
| 	test_done | ||||
| fi | ||||
| # May be altered later in the test | ||||
| PREREQ="PERL" | ||||
|  | ||||
| PROG='git send-email' | ||||
| test_expect_success \ | ||||
| test_expect_success $PREREQ \ | ||||
|     'prepare reference tree' \ | ||||
|     'echo "1A quick brown fox jumps over the" >file && | ||||
|      echo "lazy dog" >>file && | ||||
|      git add file && | ||||
|      GIT_AUTHOR_NAME="A" git commit -a -m "Initial."' | ||||
|  | ||||
| test_expect_success \ | ||||
| test_expect_success $PREREQ \ | ||||
|     'Setup helper tool' \ | ||||
|     '(echo "#!$SHELL_PATH" | ||||
|       echo shift | ||||
| @ -36,7 +33,7 @@ clean_fake_sendmail() { | ||||
| 	rm -f commandline* msgtxt* | ||||
| } | ||||
|  | ||||
| test_expect_success 'Extract patches' ' | ||||
| test_expect_success $PREREQ 'Extract patches' ' | ||||
|     patches=`git format-patch -s --cc="One <one@example.com>" --cc=two@example.com -n HEAD^1` | ||||
| ' | ||||
|  | ||||
| @ -57,49 +54,56 @@ test_no_confirm () { | ||||
|  | ||||
| # Exit immediately to prevent hang if a no-confirm test fails | ||||
| check_no_confirm () { | ||||
| 	test -f no_confirm_okay || { | ||||
| 		skip_all='confirm test failed; skipping remaining tests to prevent hanging' | ||||
| 		test_done | ||||
| 	} | ||||
| 	if ! test -f no_confirm_okay | ||||
| 	then | ||||
| 		say 'confirm test failed; skipping remaining tests to prevent hanging' | ||||
| 		PREREQ="$PREREQ,CHECK_NO_CONFIRM" | ||||
| 	fi | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| test_expect_success 'No confirm with --suppress-cc' ' | ||||
| 	test_no_confirm --suppress-cc=sob | ||||
| test_expect_success $PREREQ 'No confirm with --suppress-cc' ' | ||||
| 	test_no_confirm --suppress-cc=sob && | ||||
| 	check_no_confirm | ||||
| ' | ||||
| check_no_confirm | ||||
|  | ||||
| test_expect_success 'No confirm with --confirm=never' ' | ||||
| 	test_no_confirm --confirm=never | ||||
|  | ||||
| test_expect_success $PREREQ 'No confirm with --confirm=never' ' | ||||
| 	test_no_confirm --confirm=never && | ||||
| 	check_no_confirm | ||||
| ' | ||||
| check_no_confirm | ||||
|  | ||||
| # leave sendemail.confirm set to never after this so that none of the | ||||
| # remaining tests prompt unintentionally. | ||||
| test_expect_success 'No confirm with sendemail.confirm=never' ' | ||||
| test_expect_success $PREREQ 'No confirm with sendemail.confirm=never' ' | ||||
| 	git config sendemail.confirm never && | ||||
| 	test_no_confirm --compose --subject=foo | ||||
| 	test_no_confirm --compose --subject=foo && | ||||
| 	check_no_confirm | ||||
| ' | ||||
| check_no_confirm | ||||
|  | ||||
| test_expect_success 'Send patches' ' | ||||
| test_expect_success $PREREQ 'Send patches' ' | ||||
|      git send-email --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' ' | ||||
| cat >expected <<\EOF | ||||
| !nobody@example.com! | ||||
| !author@example.com! | ||||
| !one@example.com! | ||||
| !two@example.com! | ||||
| EOF | ||||
| test_expect_success \ | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ \ | ||||
|     'Verify commandline' \ | ||||
|     'test_cmp expected commandline1' | ||||
|  | ||||
| test_expect_success 'Send patches with --envelope-sender' ' | ||||
| test_expect_success $PREREQ 'Send patches with --envelope-sender' ' | ||||
|     clean_fake_sendmail && | ||||
|      git send-email --envelope-sender="Patch Contributer <patch@example.com>" --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' ' | ||||
| cat >expected <<\EOF | ||||
| !patch@example.com! | ||||
| !-i! | ||||
| @ -108,15 +112,18 @@ cat >expected <<\EOF | ||||
| !one@example.com! | ||||
| !two@example.com! | ||||
| EOF | ||||
| test_expect_success \ | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ \ | ||||
|     'Verify commandline' \ | ||||
|     'test_cmp expected commandline1' | ||||
|  | ||||
| test_expect_success 'Send patches with --envelope-sender=auto' ' | ||||
| test_expect_success $PREREQ 'Send patches with --envelope-sender=auto' ' | ||||
|     clean_fake_sendmail && | ||||
|      git send-email --envelope-sender=auto --suppress-cc=sob --from="Example <nobody@example.com>" --to=nobody@example.com --smtp-server="$(pwd)/fake.sendmail" $patches 2>errors | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' ' | ||||
| cat >expected <<\EOF | ||||
| !nobody@example.com! | ||||
| !-i! | ||||
| @ -125,10 +132,13 @@ cat >expected <<\EOF | ||||
| !one@example.com! | ||||
| !two@example.com! | ||||
| EOF | ||||
| test_expect_success \ | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ \ | ||||
|     'Verify commandline' \ | ||||
|     'test_cmp expected commandline1' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' " | ||||
| cat >expected-show-all-headers <<\EOF | ||||
| 0001-Second.patch | ||||
| (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>' | ||||
| @ -158,8 +168,9 @@ References: <unique-message-id@example.com> | ||||
|  | ||||
| Result: OK | ||||
| EOF | ||||
| " | ||||
|  | ||||
| test_expect_success 'Show all headers' ' | ||||
| test_expect_success $PREREQ 'Show all headers' ' | ||||
| 	git send-email \ | ||||
| 		--dry-run \ | ||||
| 		--suppress-cc=sob \ | ||||
| @ -177,7 +188,7 @@ test_expect_success 'Show all headers' ' | ||||
| 	test_cmp expected-show-all-headers actual-show-all-headers | ||||
| ' | ||||
|  | ||||
| test_expect_success 'Prompting works' ' | ||||
| test_expect_success $PREREQ 'Prompting works' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	(echo "Example <from@example.com>" | ||||
| 	 echo "to@example.com" | ||||
| @ -190,7 +201,7 @@ test_expect_success 'Prompting works' ' | ||||
| 		grep "^To: to@example.com\$" msgtxt1 | ||||
| ' | ||||
|  | ||||
| test_expect_success 'cccmd works' ' | ||||
| test_expect_success $PREREQ 'cccmd works' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	cp $patches cccmd.patch && | ||||
| 	echo cccmd--cccmd@example.com >>cccmd.patch && | ||||
| @ -209,10 +220,10 @@ test_expect_success 'cccmd works' ' | ||||
| 	grep "^	cccmd@example.com" msgtxt1 | ||||
| ' | ||||
|  | ||||
| z8=zzzzzzzz | ||||
| z64=$z8$z8$z8$z8$z8$z8$z8$z8 | ||||
| z512=$z64$z64$z64$z64$z64$z64$z64$z64 | ||||
| test_expect_success 'reject long lines' ' | ||||
| test_expect_success $PREREQ 'reject long lines' ' | ||||
| 	z8=zzzzzzzz && | ||||
| 	z64=$z8$z8$z8$z8$z8$z8$z8$z8 && | ||||
| 	z512=$z64$z64$z64$z64$z64$z64$z64$z64 && | ||||
| 	clean_fake_sendmail && | ||||
| 	cp $patches longline.patch && | ||||
| 	echo $z512$z512 >>longline.patch && | ||||
| @ -225,11 +236,11 @@ test_expect_success 'reject long lines' ' | ||||
| 	grep longline.patch errors | ||||
| ' | ||||
|  | ||||
| test_expect_success 'no patch was sent' ' | ||||
| test_expect_success $PREREQ 'no patch was sent' ' | ||||
| 	! test -e commandline1 | ||||
| ' | ||||
|  | ||||
| test_expect_success 'Author From: in message body' ' | ||||
| test_expect_success $PREREQ 'Author From: in message body' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	git send-email \ | ||||
| 		--from="Example <nobody@example.com>" \ | ||||
| @ -240,7 +251,7 @@ test_expect_success 'Author From: in message body' ' | ||||
| 	grep "From: A <author@example.com>" msgbody1 | ||||
| ' | ||||
|  | ||||
| test_expect_success 'Author From: not in message body' ' | ||||
| test_expect_success $PREREQ 'Author From: not in message body' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	git send-email \ | ||||
| 		--from="A <author@example.com>" \ | ||||
| @ -251,7 +262,7 @@ test_expect_success 'Author From: not in message body' ' | ||||
| 	! grep "From: A <author@example.com>" msgbody1 | ||||
| ' | ||||
|  | ||||
| test_expect_success 'allow long lines with --no-validate' ' | ||||
| test_expect_success $PREREQ 'allow long lines with --no-validate' ' | ||||
| 	git send-email \ | ||||
| 		--from="Example <nobody@example.com>" \ | ||||
| 		--to=nobody@example.com \ | ||||
| @ -261,7 +272,7 @@ test_expect_success 'allow long lines with --no-validate' ' | ||||
| 		2>errors | ||||
| ' | ||||
|  | ||||
| test_expect_success 'Invalid In-Reply-To' ' | ||||
| test_expect_success $PREREQ 'Invalid In-Reply-To' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	git send-email \ | ||||
| 		--from="Example <nobody@example.com>" \ | ||||
| @ -273,7 +284,7 @@ test_expect_success 'Invalid In-Reply-To' ' | ||||
| 	! grep "^In-Reply-To: < *>" msgtxt1 | ||||
| ' | ||||
|  | ||||
| test_expect_success 'Valid In-Reply-To when prompting' ' | ||||
| test_expect_success $PREREQ 'Valid In-Reply-To when prompting' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	(echo "From Example <from@example.com>" | ||||
| 	 echo "To Example <to@example.com>" | ||||
| @ -284,7 +295,7 @@ test_expect_success 'Valid In-Reply-To when prompting' ' | ||||
| 	! grep "^In-Reply-To: < *>" msgtxt1 | ||||
| ' | ||||
|  | ||||
| test_expect_success 'setup fake editor' ' | ||||
| test_expect_success $PREREQ 'setup fake editor' ' | ||||
| 	(echo "#!$SHELL_PATH" && | ||||
| 	 echo "echo fake edit >>\"\$1\"" | ||||
| 	) >fake-editor && | ||||
| @ -293,7 +304,7 @@ test_expect_success 'setup fake editor' ' | ||||
|  | ||||
| test_set_editor "$(pwd)/fake-editor" | ||||
|  | ||||
| test_expect_success '--compose works' ' | ||||
| test_expect_success $PREREQ '--compose works' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	git send-email \ | ||||
| 	--compose --subject foo \ | ||||
| @ -304,14 +315,15 @@ test_expect_success '--compose works' ' | ||||
| 	2>errors | ||||
| ' | ||||
|  | ||||
| test_expect_success 'first message is compose text' ' | ||||
| test_expect_success $PREREQ 'first message is compose text' ' | ||||
| 	grep "^fake edit" msgtxt1 | ||||
| ' | ||||
|  | ||||
| test_expect_success 'second message is patch' ' | ||||
| test_expect_success $PREREQ 'second message is patch' ' | ||||
| 	grep "Subject:.*Second" msgtxt2 | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' " | ||||
| cat >expected-suppress-sob <<\EOF | ||||
| 0001-Second.patch | ||||
| (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>' | ||||
| @ -338,6 +350,7 @@ X-Mailer: X-MAILER-STRING | ||||
|  | ||||
| Result: OK | ||||
| EOF | ||||
| " | ||||
|  | ||||
| test_suppression () { | ||||
| 	git send-email \ | ||||
| @ -354,11 +367,12 @@ test_suppression () { | ||||
| 	test_cmp expected-suppress-$1${2+"-$2"} actual-suppress-$1${2+"-$2"} | ||||
| } | ||||
|  | ||||
| test_expect_success 'sendemail.cc set' ' | ||||
| test_expect_success $PREREQ 'sendemail.cc set' ' | ||||
| 	git config sendemail.cc cc@example.com && | ||||
| 	test_suppression sob | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' " | ||||
| cat >expected-suppress-sob <<\EOF | ||||
| 0001-Second.patch | ||||
| (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>' | ||||
| @ -383,12 +397,14 @@ X-Mailer: X-MAILER-STRING | ||||
|  | ||||
| Result: OK | ||||
| EOF | ||||
| " | ||||
|  | ||||
| test_expect_success 'sendemail.cc unset' ' | ||||
| test_expect_success $PREREQ 'sendemail.cc unset' ' | ||||
| 	git config --unset sendemail.cc && | ||||
| 	test_suppression sob | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' " | ||||
| cat >expected-suppress-cccmd <<\EOF | ||||
| 0001-Second.patch | ||||
| (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>' | ||||
| @ -416,14 +432,16 @@ X-Mailer: X-MAILER-STRING | ||||
|  | ||||
| Result: OK | ||||
| EOF | ||||
| " | ||||
|  | ||||
| test_expect_success 'sendemail.cccmd' ' | ||||
| test_expect_success $PREREQ 'sendemail.cccmd' ' | ||||
| 	echo echo cc-cmd@example.com > cccmd && | ||||
| 	chmod +x cccmd && | ||||
| 	git config sendemail.cccmd ./cccmd && | ||||
| 	test_suppression cccmd | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' ' | ||||
| cat >expected-suppress-all <<\EOF | ||||
| 0001-Second.patch | ||||
| Dry-OK. Log says: | ||||
| @ -439,11 +457,13 @@ X-Mailer: X-MAILER-STRING | ||||
|  | ||||
| Result: OK | ||||
| EOF | ||||
| ' | ||||
|  | ||||
| test_expect_success '--suppress-cc=all' ' | ||||
| test_expect_success $PREREQ '--suppress-cc=all' ' | ||||
| 	test_suppression all | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' " | ||||
| cat >expected-suppress-body <<\EOF | ||||
| 0001-Second.patch | ||||
| (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>' | ||||
| @ -471,11 +491,13 @@ X-Mailer: X-MAILER-STRING | ||||
|  | ||||
| Result: OK | ||||
| EOF | ||||
| " | ||||
|  | ||||
| test_expect_success '--suppress-cc=body' ' | ||||
| test_expect_success $PREREQ '--suppress-cc=body' ' | ||||
| 	test_suppression body | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' " | ||||
| cat >expected-suppress-body-cccmd <<\EOF | ||||
| 0001-Second.patch | ||||
| (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>' | ||||
| @ -500,11 +522,13 @@ X-Mailer: X-MAILER-STRING | ||||
|  | ||||
| Result: OK | ||||
| EOF | ||||
| " | ||||
|  | ||||
| test_expect_success '--suppress-cc=body --suppress-cc=cccmd' ' | ||||
| test_expect_success $PREREQ '--suppress-cc=body --suppress-cc=cccmd' ' | ||||
| 	test_suppression body cccmd | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' " | ||||
| cat >expected-suppress-sob <<\EOF | ||||
| 0001-Second.patch | ||||
| (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>' | ||||
| @ -529,12 +553,14 @@ X-Mailer: X-MAILER-STRING | ||||
|  | ||||
| Result: OK | ||||
| EOF | ||||
| " | ||||
|  | ||||
| test_expect_success '--suppress-cc=sob' ' | ||||
| test_expect_success $PREREQ '--suppress-cc=sob' ' | ||||
| 	git config --unset sendemail.cccmd | ||||
| 	test_suppression sob | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' " | ||||
| cat >expected-suppress-bodycc <<\EOF | ||||
| 0001-Second.patch | ||||
| (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>' | ||||
| @ -562,11 +588,13 @@ X-Mailer: X-MAILER-STRING | ||||
|  | ||||
| Result: OK | ||||
| EOF | ||||
| " | ||||
|  | ||||
| test_expect_success '--suppress-cc=bodycc' ' | ||||
| test_expect_success $PREREQ '--suppress-cc=bodycc' ' | ||||
| 	test_suppression bodycc | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' " | ||||
| cat >expected-suppress-cc <<\EOF | ||||
| 0001-Second.patch | ||||
| (mbox) Adding cc: A <author@example.com> from line 'From: A <author@example.com>' | ||||
| @ -588,8 +616,9 @@ X-Mailer: X-MAILER-STRING | ||||
|  | ||||
| Result: OK | ||||
| EOF | ||||
| " | ||||
|  | ||||
| test_expect_success '--suppress-cc=cc' ' | ||||
| test_expect_success $PREREQ '--suppress-cc=cc' ' | ||||
| 	test_suppression cc | ||||
| ' | ||||
|  | ||||
| @ -604,23 +633,23 @@ test_confirm () { | ||||
| 	grep "Send this email" stdout | ||||
| } | ||||
|  | ||||
| test_expect_success '--confirm=always' ' | ||||
| test_expect_success $PREREQ '--confirm=always' ' | ||||
| 	test_confirm --confirm=always --suppress-cc=all | ||||
| ' | ||||
|  | ||||
| test_expect_success '--confirm=auto' ' | ||||
| test_expect_success $PREREQ '--confirm=auto' ' | ||||
| 	test_confirm --confirm=auto | ||||
| ' | ||||
|  | ||||
| test_expect_success '--confirm=cc' ' | ||||
| test_expect_success $PREREQ '--confirm=cc' ' | ||||
| 	test_confirm --confirm=cc | ||||
| ' | ||||
|  | ||||
| test_expect_success '--confirm=compose' ' | ||||
| test_expect_success $PREREQ '--confirm=compose' ' | ||||
| 	test_confirm --confirm=compose --compose | ||||
| ' | ||||
|  | ||||
| test_expect_success 'confirm by default (due to cc)' ' | ||||
| test_expect_success $PREREQ 'confirm by default (due to cc)' ' | ||||
| 	CONFIRM=$(git config --get sendemail.confirm) && | ||||
| 	git config --unset sendemail.confirm && | ||||
| 	test_confirm | ||||
| @ -629,7 +658,7 @@ test_expect_success 'confirm by default (due to cc)' ' | ||||
| 	test $ret = "0" | ||||
| ' | ||||
|  | ||||
| test_expect_success 'confirm by default (due to --compose)' ' | ||||
| test_expect_success $PREREQ 'confirm by default (due to --compose)' ' | ||||
| 	CONFIRM=$(git config --get sendemail.confirm) && | ||||
| 	git config --unset sendemail.confirm && | ||||
| 	test_confirm --suppress-cc=all --compose | ||||
| @ -638,7 +667,7 @@ test_expect_success 'confirm by default (due to --compose)' ' | ||||
| 	test $ret = "0" | ||||
| ' | ||||
|  | ||||
| test_expect_success 'confirm detects EOF (inform assumes y)' ' | ||||
| test_expect_success $PREREQ 'confirm detects EOF (inform assumes y)' ' | ||||
| 	CONFIRM=$(git config --get sendemail.confirm) && | ||||
| 	git config --unset sendemail.confirm && | ||||
| 	rm -fr outdir && | ||||
| @ -654,7 +683,7 @@ test_expect_success 'confirm detects EOF (inform assumes y)' ' | ||||
| 	test $ret = "0" | ||||
| ' | ||||
|  | ||||
| test_expect_success 'confirm detects EOF (auto causes failure)' ' | ||||
| test_expect_success $PREREQ 'confirm detects EOF (auto causes failure)' ' | ||||
| 	CONFIRM=$(git config --get sendemail.confirm) && | ||||
| 	git config sendemail.confirm auto && | ||||
| 	GIT_SEND_EMAIL_NOTTY=1 && | ||||
| @ -669,7 +698,7 @@ test_expect_success 'confirm detects EOF (auto causes failure)' ' | ||||
| 	test $ret = "0" | ||||
| ' | ||||
|  | ||||
| test_expect_success 'confirm doesnt loop forever' ' | ||||
| test_expect_success $PREREQ 'confirm doesnt loop forever' ' | ||||
| 	CONFIRM=$(git config --get sendemail.confirm) && | ||||
| 	git config sendemail.confirm auto && | ||||
| 	GIT_SEND_EMAIL_NOTTY=1 && | ||||
| @ -684,7 +713,7 @@ test_expect_success 'confirm doesnt loop forever' ' | ||||
| 	test $ret = "0" | ||||
| ' | ||||
|  | ||||
| test_expect_success 'utf8 Cc is rfc2047 encoded' ' | ||||
| test_expect_success $PREREQ 'utf8 Cc is rfc2047 encoded' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	rm -fr outdir && | ||||
| 	git format-patch -1 -o outdir --cc="àéìöú <utf8@example.com>" && | ||||
| @ -697,7 +726,7 @@ test_expect_success 'utf8 Cc is rfc2047 encoded' ' | ||||
| 	grep "=?UTF-8?q?=C3=A0=C3=A9=C3=AC=C3=B6=C3=BA?= <utf8@example.com>" | ||||
| ' | ||||
|  | ||||
| test_expect_success '--compose adds MIME for utf8 body' ' | ||||
| test_expect_success $PREREQ '--compose adds MIME for utf8 body' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	(echo "#!$SHELL_PATH" && | ||||
| 	 echo "echo utf8 body: àéìöú >>\"\$1\"" | ||||
| @ -714,7 +743,7 @@ test_expect_success '--compose adds MIME for utf8 body' ' | ||||
| 	grep "^Content-Type: text/plain; charset=UTF-8" msgtxt1 | ||||
| ' | ||||
|  | ||||
| test_expect_success '--compose respects user mime type' ' | ||||
| test_expect_success $PREREQ '--compose respects user mime type' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	(echo "#!$SHELL_PATH" && | ||||
| 	 echo "(echo MIME-Version: 1.0" | ||||
| @ -737,7 +766,7 @@ test_expect_success '--compose respects user mime type' ' | ||||
| 	! grep "^Content-Type: text/plain; charset=UTF-8" msgtxt1 | ||||
| ' | ||||
|  | ||||
| test_expect_success '--compose adds MIME for utf8 subject' ' | ||||
| test_expect_success $PREREQ '--compose adds MIME for utf8 subject' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	  GIT_EDITOR="\"$(pwd)/fake-editor\"" \ | ||||
| 	  git send-email \ | ||||
| @ -750,7 +779,7 @@ test_expect_success '--compose adds MIME for utf8 subject' ' | ||||
| 	grep "^Subject: =?UTF-8?q?utf8-s=C3=BCbj=C3=ABct?=" msgtxt1 | ||||
| ' | ||||
|  | ||||
| test_expect_success 'detects ambiguous reference/file conflict' ' | ||||
| test_expect_success $PREREQ 'detects ambiguous reference/file conflict' ' | ||||
| 	echo master > master && | ||||
| 	git add master && | ||||
| 	git commit -m"add master" && | ||||
| @ -758,7 +787,7 @@ test_expect_success 'detects ambiguous reference/file conflict' ' | ||||
| 	grep disambiguate errors | ||||
| ' | ||||
|  | ||||
| test_expect_success 'feed two files' ' | ||||
| test_expect_success $PREREQ 'feed two files' ' | ||||
| 	rm -fr outdir && | ||||
| 	git format-patch -2 -o outdir && | ||||
| 	git send-email \ | ||||
| @ -771,7 +800,7 @@ test_expect_success 'feed two files' ' | ||||
| 	test "z$(sed -n -e 2p subjects)" = "zSubject: [PATCH 2/2] add master" | ||||
| ' | ||||
|  | ||||
| test_expect_success 'in-reply-to but no threading' ' | ||||
| test_expect_success $PREREQ 'in-reply-to but no threading' ' | ||||
| 	git send-email \ | ||||
| 		--dry-run \ | ||||
| 		--from="Example <nobody@example.com>" \ | ||||
| @ -782,7 +811,7 @@ test_expect_success 'in-reply-to but no threading' ' | ||||
| 	grep "In-Reply-To: <in-reply-id@example.com>" | ||||
| ' | ||||
|  | ||||
| test_expect_success 'no in-reply-to and no threading' ' | ||||
| test_expect_success $PREREQ 'no in-reply-to and no threading' ' | ||||
| 	git send-email \ | ||||
| 		--dry-run \ | ||||
| 		--from="Example <nobody@example.com>" \ | ||||
| @ -792,7 +821,7 @@ test_expect_success 'no in-reply-to and no threading' ' | ||||
| 	! grep "In-Reply-To: " stdout | ||||
| ' | ||||
|  | ||||
| test_expect_success 'threading but no chain-reply-to' ' | ||||
| test_expect_success $PREREQ 'threading but no chain-reply-to' ' | ||||
| 	git send-email \ | ||||
| 		--dry-run \ | ||||
| 		--from="Example <nobody@example.com>" \ | ||||
| @ -803,7 +832,7 @@ test_expect_success 'threading but no chain-reply-to' ' | ||||
| 	grep "In-Reply-To: " stdout | ||||
| ' | ||||
|  | ||||
| test_expect_success 'warning with an implicit --chain-reply-to' ' | ||||
| test_expect_success $PREREQ 'warning with an implicit --chain-reply-to' ' | ||||
| 	git send-email \ | ||||
| 	--dry-run \ | ||||
| 	--from="Example <nobody@example.com>" \ | ||||
| @ -812,7 +841,7 @@ test_expect_success 'warning with an implicit --chain-reply-to' ' | ||||
| 	grep "no-chain-reply-to" errors | ||||
| ' | ||||
|  | ||||
| test_expect_success 'no warning with an explicit --chain-reply-to' ' | ||||
| test_expect_success $PREREQ 'no warning with an explicit --chain-reply-to' ' | ||||
| 	git send-email \ | ||||
| 	--dry-run \ | ||||
| 	--from="Example <nobody@example.com>" \ | ||||
| @ -822,7 +851,7 @@ test_expect_success 'no warning with an explicit --chain-reply-to' ' | ||||
| 	! grep "no-chain-reply-to" errors | ||||
| ' | ||||
|  | ||||
| test_expect_success 'no warning with an explicit --no-chain-reply-to' ' | ||||
| test_expect_success $PREREQ 'no warning with an explicit --no-chain-reply-to' ' | ||||
| 	git send-email \ | ||||
| 	--dry-run \ | ||||
| 	--from="Example <nobody@example.com>" \ | ||||
| @ -832,7 +861,7 @@ test_expect_success 'no warning with an explicit --no-chain-reply-to' ' | ||||
| 	! grep "no-chain-reply-to" errors | ||||
| ' | ||||
|  | ||||
| test_expect_success 'no warning with sendemail.chainreplyto = false' ' | ||||
| test_expect_success $PREREQ 'no warning with sendemail.chainreplyto = false' ' | ||||
| 	git config sendemail.chainreplyto false && | ||||
| 	git send-email \ | ||||
| 	--dry-run \ | ||||
| @ -842,7 +871,7 @@ test_expect_success 'no warning with sendemail.chainreplyto = false' ' | ||||
| 	! grep "no-chain-reply-to" errors | ||||
| ' | ||||
|  | ||||
| test_expect_success 'no warning with sendemail.chainreplyto = true' ' | ||||
| test_expect_success $PREREQ 'no warning with sendemail.chainreplyto = true' ' | ||||
| 	git config sendemail.chainreplyto true && | ||||
| 	git send-email \ | ||||
| 	--dry-run \ | ||||
| @ -852,7 +881,7 @@ test_expect_success 'no warning with sendemail.chainreplyto = true' ' | ||||
| 	! grep "no-chain-reply-to" errors | ||||
| ' | ||||
|  | ||||
| test_expect_success 'sendemail.to works' ' | ||||
| test_expect_success $PREREQ 'sendemail.to works' ' | ||||
| 	git config --replace-all sendemail.to "Somebody <somebody@ex.com>" && | ||||
| 	git send-email \ | ||||
| 		--dry-run \ | ||||
| @ -861,7 +890,7 @@ test_expect_success 'sendemail.to works' ' | ||||
| 	grep "To: Somebody <somebody@ex.com>" stdout | ||||
| ' | ||||
|  | ||||
| test_expect_success '--no-to overrides sendemail.to' ' | ||||
| test_expect_success $PREREQ '--no-to overrides sendemail.to' ' | ||||
| 	git send-email \ | ||||
| 		--dry-run \ | ||||
| 		--from="Example <nobody@example.com>" \ | ||||
| @ -872,7 +901,7 @@ test_expect_success '--no-to overrides sendemail.to' ' | ||||
| 	! grep "To: Somebody <somebody@ex.com>" stdout | ||||
| ' | ||||
|  | ||||
| test_expect_success 'sendemail.cc works' ' | ||||
| test_expect_success $PREREQ 'sendemail.cc works' ' | ||||
| 	git config --replace-all sendemail.cc "Somebody <somebody@ex.com>" && | ||||
| 	git send-email \ | ||||
| 		--dry-run \ | ||||
| @ -882,7 +911,7 @@ test_expect_success 'sendemail.cc works' ' | ||||
| 	grep "Cc: Somebody <somebody@ex.com>" stdout | ||||
| ' | ||||
|  | ||||
| test_expect_success '--no-cc overrides sendemail.cc' ' | ||||
| test_expect_success $PREREQ '--no-cc overrides sendemail.cc' ' | ||||
| 	git send-email \ | ||||
| 		--dry-run \ | ||||
| 		--from="Example <nobody@example.com>" \ | ||||
| @ -894,7 +923,7 @@ test_expect_success '--no-cc overrides sendemail.cc' ' | ||||
| 	! grep "Cc: Somebody <somebody@ex.com>" stdout | ||||
| ' | ||||
|  | ||||
| test_expect_success 'sendemail.bcc works' ' | ||||
| test_expect_success $PREREQ 'sendemail.bcc works' ' | ||||
| 	git config --replace-all sendemail.bcc "Other <other@ex.com>" && | ||||
| 	git send-email \ | ||||
| 		--dry-run \ | ||||
| @ -905,7 +934,7 @@ test_expect_success 'sendemail.bcc works' ' | ||||
| 	grep "RCPT TO:<other@ex.com>" stdout | ||||
| ' | ||||
|  | ||||
| test_expect_success '--no-bcc overrides sendemail.bcc' ' | ||||
| test_expect_success $PREREQ '--no-bcc overrides sendemail.bcc' ' | ||||
| 	git send-email \ | ||||
| 		--dry-run \ | ||||
| 		--from="Example <nobody@example.com>" \ | ||||
| @ -918,6 +947,7 @@ test_expect_success '--no-bcc overrides sendemail.bcc' ' | ||||
| 	! grep "RCPT TO:<other@ex.com>" stdout | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' ' | ||||
| cat >email-using-8bit <<EOF | ||||
| From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001 | ||||
| Message-Id: <bogus-message-id@example.com> | ||||
| @ -927,14 +957,17 @@ Subject: subject goes here | ||||
|  | ||||
| Dieser deutsche Text enthält einen Umlaut! | ||||
| EOF | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' ' | ||||
| cat >content-type-decl <<EOF | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| EOF | ||||
| ' | ||||
|  | ||||
| test_expect_success 'asks about and fixes 8bit encodings' ' | ||||
| test_expect_success $PREREQ 'asks about and fixes 8bit encodings' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	echo | | ||||
| 	git send-email --from=author@example.com --to=nobody@example.com \ | ||||
| @ -947,7 +980,7 @@ test_expect_success 'asks about and fixes 8bit encodings' ' | ||||
| 	test_cmp actual content-type-decl | ||||
| ' | ||||
|  | ||||
| test_expect_success 'sendemail.8bitEncoding works' ' | ||||
| test_expect_success $PREREQ 'sendemail.8bitEncoding works' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	git config sendemail.assume8bitEncoding UTF-8 && | ||||
| 	echo bogus | | ||||
| @ -958,7 +991,7 @@ test_expect_success 'sendemail.8bitEncoding works' ' | ||||
| 	test_cmp actual content-type-decl | ||||
| ' | ||||
|  | ||||
| test_expect_success '--8bit-encoding overrides sendemail.8bitEncoding' ' | ||||
| test_expect_success $PREREQ '--8bit-encoding overrides sendemail.8bitEncoding' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	git config sendemail.assume8bitEncoding "bogus too" && | ||||
| 	echo bogus | | ||||
| @ -970,6 +1003,7 @@ test_expect_success '--8bit-encoding overrides sendemail.8bitEncoding' ' | ||||
| 	test_cmp actual content-type-decl | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' ' | ||||
| cat >email-using-8bit <<EOF | ||||
| From fe6ecc66ece37198fe5db91fa2fc41d9f4fe5cc4 Mon Sep 17 00:00:00 2001 | ||||
| Message-Id: <bogus-message-id@example.com> | ||||
| @ -979,12 +1013,15 @@ Subject: Dieser Betreff enthält auch einen Umlaut! | ||||
|  | ||||
| Nothing to see here. | ||||
| EOF | ||||
| ' | ||||
|  | ||||
| test_expect_success $PREREQ 'setup expect' ' | ||||
| cat >expected <<EOF | ||||
| Subject: =?UTF-8?q?Dieser=20Betreff=20enth=C3=A4lt=20auch=20einen=20Umlaut!?= | ||||
| EOF | ||||
| ' | ||||
|  | ||||
| test_expect_success '--8bit-encoding also treats subject' ' | ||||
| test_expect_success $PREREQ '--8bit-encoding also treats subject' ' | ||||
| 	clean_fake_sendmail && | ||||
| 	echo bogus | | ||||
| 	git send-email --from=author@example.com --to=nobody@example.com \ | ||||
|  | ||||
| @ -95,8 +95,6 @@ test_expect_success 'fresh clone with svn.authors-file in config' ' | ||||
| 	( | ||||
| 		rm -r "$GIT_DIR" && | ||||
| 		test x = x"$(git config svn.authorsfile)" && | ||||
| 		HOME="`pwd`" && | ||||
| 		export HOME && | ||||
| 		test_config="$HOME"/.gitconfig && | ||||
| 		unset GIT_CONFIG_NOGLOBAL && | ||||
| 		unset GIT_DIR && | ||||
|  | ||||
| @ -5,6 +5,7 @@ | ||||
| test_description='Test export of commits to CVS' | ||||
|  | ||||
| . ./test-lib.sh | ||||
| . "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh | ||||
|  | ||||
| if ! test_have_prereq PERL; then | ||||
| 	skip_all='skipping git cvsexportcommit tests, perl not available' | ||||
| @ -229,11 +230,6 @@ test_expect_success \ | ||||
|       test_must_fail git cvsexportcommit -c $id | ||||
|       )' | ||||
|  | ||||
| if ! test "$(git config --bool core.filemode)" = false | ||||
| then | ||||
| 	test_set_prereq FILEMODE | ||||
| fi | ||||
|  | ||||
| test_expect_success FILEMODE \ | ||||
|      'Retain execute bit' \ | ||||
|      'mkdir G && | ||||
|  | ||||
| @ -3,17 +3,14 @@ | ||||
| test_description='git cvsimport basic tests' | ||||
| . ./lib-cvs.sh | ||||
|  | ||||
| if ! test_have_prereq PERL; then | ||||
| 	skip_all='skipping git cvsimport tests, perl not available' | ||||
| 	test_done | ||||
| fi | ||||
| test_expect_success PERL 'setup cvsroot environment' ' | ||||
| 	CVSROOT=$(pwd)/cvsroot && | ||||
| 	export CVSROOT | ||||
| ' | ||||
|  | ||||
| CVSROOT=$(pwd)/cvsroot | ||||
| export CVSROOT | ||||
| test_expect_success PERL 'setup cvsroot' '$CVS init' | ||||
|  | ||||
| test_expect_success 'setup cvsroot' '$CVS init' | ||||
|  | ||||
| test_expect_success 'setup a cvs module' ' | ||||
| test_expect_success PERL 'setup a cvs module' ' | ||||
|  | ||||
| 	mkdir "$CVSROOT/module" && | ||||
| 	$CVS co -d module-cvs module && | ||||
| @ -45,23 +42,23 @@ EOF | ||||
| 	cd .. | ||||
| ' | ||||
|  | ||||
| test_expect_success 'import a trivial module' ' | ||||
| test_expect_success PERL 'import a trivial module' ' | ||||
|  | ||||
| 	git cvsimport -a -R -z 0 -C module-git module && | ||||
| 	test_cmp module-cvs/o_fortuna module-git/o_fortuna | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'pack refs' 'cd module-git && git gc && cd ..' | ||||
| test_expect_success PERL 'pack refs' 'cd module-git && git gc && cd ..' | ||||
|  | ||||
| test_expect_success 'initial import has correct .git/cvs-revisions' ' | ||||
| test_expect_success PERL 'initial import has correct .git/cvs-revisions' ' | ||||
|  | ||||
| 	(cd module-git && | ||||
| 	 git log --format="o_fortuna 1.1 %H" -1) > expected && | ||||
| 	test_cmp expected module-git/.git/cvs-revisions | ||||
| ' | ||||
|  | ||||
| test_expect_success 'update cvs module' ' | ||||
| test_expect_success PERL 'update cvs module' ' | ||||
|  | ||||
| 	cd module-cvs && | ||||
| 	cat <<EOF >o_fortuna && | ||||
| @ -90,7 +87,7 @@ EOF | ||||
| 	cd .. | ||||
| ' | ||||
|  | ||||
| test_expect_success 'update git module' ' | ||||
| test_expect_success PERL 'update git module' ' | ||||
|  | ||||
| 	cd module-git && | ||||
| 	git cvsimport -a -R -z 0 module && | ||||
| @ -100,7 +97,7 @@ test_expect_success 'update git module' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'update has correct .git/cvs-revisions' ' | ||||
| test_expect_success PERL 'update has correct .git/cvs-revisions' ' | ||||
|  | ||||
| 	(cd module-git && | ||||
| 	 git log --format="o_fortuna 1.1 %H" -1 HEAD^ && | ||||
| @ -108,7 +105,7 @@ test_expect_success 'update has correct .git/cvs-revisions' ' | ||||
| 	test_cmp expected module-git/.git/cvs-revisions | ||||
| ' | ||||
|  | ||||
| test_expect_success 'update cvs module' ' | ||||
| test_expect_success PERL 'update cvs module' ' | ||||
|  | ||||
| 	cd module-cvs && | ||||
| 		echo 1 >tick && | ||||
| @ -118,7 +115,7 @@ test_expect_success 'update cvs module' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'cvsimport.module config works' ' | ||||
| test_expect_success PERL 'cvsimport.module config works' ' | ||||
|  | ||||
| 	cd module-git && | ||||
| 		git config cvsimport.module module && | ||||
| @ -129,7 +126,7 @@ test_expect_success 'cvsimport.module config works' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'second update has correct .git/cvs-revisions' ' | ||||
| test_expect_success PERL 'second update has correct .git/cvs-revisions' ' | ||||
|  | ||||
| 	(cd module-git && | ||||
| 	 git log --format="o_fortuna 1.1 %H" -1 HEAD^^ && | ||||
| @ -138,7 +135,7 @@ test_expect_success 'second update has correct .git/cvs-revisions' ' | ||||
| 	test_cmp expected module-git/.git/cvs-revisions | ||||
| ' | ||||
|  | ||||
| test_expect_success 'import from a CVS working tree' ' | ||||
| test_expect_success PERL 'import from a CVS working tree' ' | ||||
|  | ||||
| 	$CVS co -d import-from-wt module && | ||||
| 	cd import-from-wt && | ||||
| @ -150,12 +147,12 @@ test_expect_success 'import from a CVS working tree' ' | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'no .git/cvs-revisions created by default' ' | ||||
| test_expect_success PERL 'no .git/cvs-revisions created by default' ' | ||||
|  | ||||
| 	! test -e import-from-wt/.git/cvs-revisions | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'test entire HEAD' 'test_cmp_branch_tree master' | ||||
| test_expect_success PERL 'test entire HEAD' 'test_cmp_branch_tree master' | ||||
|  | ||||
| test_done | ||||
|  | ||||
| @ -34,50 +34,49 @@ | ||||
| test_description='git cvsimport handling of vendor branches' | ||||
| . ./lib-cvs.sh | ||||
|  | ||||
| CVSROOT="$TEST_DIRECTORY"/t9601/cvsroot | ||||
| export CVSROOT | ||||
| setup_cvs_test_repository t9601 | ||||
|  | ||||
| test_expect_success 'import a module with a vendor branch' ' | ||||
| test_expect_success PERL 'import a module with a vendor branch' ' | ||||
|  | ||||
| 	git cvsimport -C module-git module | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check HEAD out of cvs repository' 'test_cvs_co master' | ||||
| test_expect_success PERL 'check HEAD out of cvs repository' 'test_cvs_co master' | ||||
|  | ||||
| test_expect_success 'check master out of git repository' 'test_git_co master' | ||||
| test_expect_success PERL 'check master out of git repository' 'test_git_co master' | ||||
|  | ||||
| test_expect_success 'check a file that was imported once' ' | ||||
| test_expect_success PERL 'check a file that was imported once' ' | ||||
|  | ||||
| 	test_cmp_branch_file master imported-once.txt | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_failure 'check a file that was imported twice' ' | ||||
| test_expect_failure PERL 'check a file that was imported twice' ' | ||||
|  | ||||
| 	test_cmp_branch_file master imported-twice.txt | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check a file that was imported then modified on HEAD' ' | ||||
| test_expect_success PERL 'check a file that was imported then modified on HEAD' ' | ||||
|  | ||||
| 	test_cmp_branch_file master imported-modified.txt | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check a file that was imported, modified, then imported again' ' | ||||
| test_expect_success PERL 'check a file that was imported, modified, then imported again' ' | ||||
|  | ||||
| 	test_cmp_branch_file master imported-modified-imported.txt | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'check a file that was added to HEAD then imported' ' | ||||
| test_expect_success PERL 'check a file that was added to HEAD then imported' ' | ||||
|  | ||||
| 	test_cmp_branch_file master added-imported.txt | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'a vendor branch whose tag has been removed' ' | ||||
| test_expect_success PERL 'a vendor branch whose tag has been removed' ' | ||||
|  | ||||
| 	test_cmp_branch_file master imported-anonymously.txt | ||||
|  | ||||
|  | ||||
| @ -6,70 +6,69 @@ | ||||
| test_description='git cvsimport handling of branches and tags' | ||||
| . ./lib-cvs.sh | ||||
|  | ||||
| CVSROOT="$TEST_DIRECTORY"/t9602/cvsroot | ||||
| export CVSROOT | ||||
| setup_cvs_test_repository t9602 | ||||
|  | ||||
| test_expect_success 'import module' ' | ||||
| test_expect_success PERL 'import module' ' | ||||
|  | ||||
| 	git cvsimport -C module-git module | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'test branch master' ' | ||||
| test_expect_success PERL 'test branch master' ' | ||||
|  | ||||
| 	test_cmp_branch_tree master | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'test branch vendorbranch' ' | ||||
| test_expect_success PERL 'test branch vendorbranch' ' | ||||
|  | ||||
| 	test_cmp_branch_tree vendorbranch | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_failure 'test branch B_FROM_INITIALS' ' | ||||
| test_expect_failure PERL 'test branch B_FROM_INITIALS' ' | ||||
|  | ||||
| 	test_cmp_branch_tree B_FROM_INITIALS | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_failure 'test branch B_FROM_INITIALS_BUT_ONE' ' | ||||
| test_expect_failure PERL 'test branch B_FROM_INITIALS_BUT_ONE' ' | ||||
|  | ||||
| 	test_cmp_branch_tree B_FROM_INITIALS_BUT_ONE | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_failure 'test branch B_MIXED' ' | ||||
| test_expect_failure PERL 'test branch B_MIXED' ' | ||||
|  | ||||
| 	test_cmp_branch_tree B_MIXED | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'test branch B_SPLIT' ' | ||||
| test_expect_success PERL 'test branch B_SPLIT' ' | ||||
|  | ||||
| 	test_cmp_branch_tree B_SPLIT | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_failure 'test tag vendortag' ' | ||||
| test_expect_failure PERL 'test tag vendortag' ' | ||||
|  | ||||
| 	test_cmp_branch_tree vendortag | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'test tag T_ALL_INITIAL_FILES' ' | ||||
| test_expect_success PERL 'test tag T_ALL_INITIAL_FILES' ' | ||||
|  | ||||
| 	test_cmp_branch_tree T_ALL_INITIAL_FILES | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_failure 'test tag T_ALL_INITIAL_FILES_BUT_ONE' ' | ||||
| test_expect_failure PERL 'test tag T_ALL_INITIAL_FILES_BUT_ONE' ' | ||||
|  | ||||
| 	test_cmp_branch_tree T_ALL_INITIAL_FILES_BUT_ONE | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_failure 'test tag T_MIXED' ' | ||||
| test_expect_failure PERL 'test tag T_MIXED' ' | ||||
|  | ||||
| 	test_cmp_branch_tree T_MIXED | ||||
|  | ||||
|  | ||||
| @ -14,8 +14,7 @@ | ||||
| test_description='git cvsimport testing for correct patchset estimation' | ||||
| . ./lib-cvs.sh | ||||
|  | ||||
| CVSROOT="$TEST_DIRECTORY"/t9603/cvsroot | ||||
| export CVSROOT | ||||
| setup_cvs_test_repository t9603 | ||||
|  | ||||
| test_expect_failure 'import with criss cross times on revisions' ' | ||||
|  | ||||
|  | ||||
							
								
								
									
										119
									
								
								t/test-lib.sh
									
									
									
									
									
								
							
							
						
						
									
										119
									
								
								t/test-lib.sh
									
									
									
									
									
								
							| @ -331,12 +331,35 @@ test_set_prereq () { | ||||
| satisfied=" " | ||||
|  | ||||
| test_have_prereq () { | ||||
| 	case $satisfied in | ||||
| 	*" $1 "*) | ||||
| 		: yes, have it ;; | ||||
| 	*) | ||||
| 		! : nope ;; | ||||
| 	esac | ||||
| 	# prerequisites can be concatenated with ',' | ||||
| 	save_IFS=$IFS | ||||
| 	IFS=, | ||||
| 	set -- $* | ||||
| 	IFS=$save_IFS | ||||
|  | ||||
| 	total_prereq=0 | ||||
| 	ok_prereq=0 | ||||
| 	missing_prereq= | ||||
|  | ||||
| 	for prerequisite | ||||
| 	do | ||||
| 		total_prereq=$(($total_prereq + 1)) | ||||
| 		case $satisfied in | ||||
| 		*" $prerequisite "*) | ||||
| 			ok_prereq=$(($ok_prereq + 1)) | ||||
| 			;; | ||||
| 		*) | ||||
| 			# Keep a list of missing prerequisites | ||||
| 			if test -z "$missing_prereq" | ||||
| 			then | ||||
| 				missing_prereq=$prerequisite | ||||
| 			else | ||||
| 				missing_prereq="$prerequisite,$missing_prereq" | ||||
| 			fi | ||||
| 		esac | ||||
| 	done | ||||
|  | ||||
| 	test $total_prereq = $ok_prereq | ||||
| } | ||||
|  | ||||
| # You are not expected to call test_ok_ and test_failure_ directly, use | ||||
| @ -398,8 +421,14 @@ test_skip () { | ||||
| 	fi | ||||
| 	case "$to_skip" in | ||||
| 	t) | ||||
| 		of_prereq= | ||||
| 		if test "$missing_prereq" != "$prereq" | ||||
| 		then | ||||
| 			of_prereq=" of $prereq" | ||||
| 		fi | ||||
|  | ||||
| 		say_color skip >&3 "skipping test: $@" | ||||
| 		say_color skip "ok $test_count # skip $1" | ||||
| 		say_color skip "ok $test_count # skip $1 (missing $missing_prereq${of_prereq})" | ||||
| 		: true | ||||
| 		;; | ||||
| 	*) | ||||
| @ -657,28 +686,31 @@ test_when_finished () { | ||||
| test_create_repo () { | ||||
| 	test "$#" = 1 || | ||||
| 	error "bug in the test script: not 1 parameter to test-create-repo" | ||||
| 	owd=`pwd` | ||||
| 	repo="$1" | ||||
| 	mkdir -p "$repo" | ||||
| 	cd "$repo" || error "Cannot setup test environment" | ||||
| 	"$GIT_EXEC_PATH/git-init" "--template=$TEST_DIRECTORY/../templates/blt/" >&3 2>&4 || | ||||
| 	error "cannot run git init -- have you built things yet?" | ||||
| 	mv .git/hooks .git/hooks-disabled | ||||
| 	cd "$owd" | ||||
| 	( | ||||
| 		cd "$repo" || error "Cannot setup test environment" | ||||
| 		"$GIT_EXEC_PATH/git-init" "--template=$GIT_BUILD_DIR/templates/blt/" >&3 2>&4 || | ||||
| 		error "cannot run git init -- have you built things yet?" | ||||
| 		mv .git/hooks .git/hooks-disabled | ||||
| 	) || exit | ||||
| } | ||||
|  | ||||
| test_done () { | ||||
| 	GIT_EXIT_OK=t | ||||
| 	test_results_dir="$TEST_DIRECTORY/test-results" | ||||
| 	mkdir -p "$test_results_dir" | ||||
| 	test_results_path="$test_results_dir/${0%.sh}-$$.counts" | ||||
|  | ||||
| 	echo "total $test_count" >> $test_results_path | ||||
| 	echo "success $test_success" >> $test_results_path | ||||
| 	echo "fixed $test_fixed" >> $test_results_path | ||||
| 	echo "broken $test_broken" >> $test_results_path | ||||
| 	echo "failed $test_failure" >> $test_results_path | ||||
| 	echo "" >> $test_results_path | ||||
| 	if test -z "$HARNESS_ACTIVE"; then | ||||
| 		test_results_dir="$TEST_DIRECTORY/test-results" | ||||
| 		mkdir -p "$test_results_dir" | ||||
| 		test_results_path="$test_results_dir/${0%.sh}-$$.counts" | ||||
|  | ||||
| 		echo "total $test_count" >> $test_results_path | ||||
| 		echo "success $test_success" >> $test_results_path | ||||
| 		echo "fixed $test_fixed" >> $test_results_path | ||||
| 		echo "broken $test_broken" >> $test_results_path | ||||
| 		echo "failed $test_failure" >> $test_results_path | ||||
| 		echo "" >> $test_results_path | ||||
| 	fi | ||||
|  | ||||
| 	if test "$test_fixed" != 0 | ||||
| 	then | ||||
| @ -720,7 +752,15 @@ test_done () { | ||||
|  | ||||
| # Test the binaries we have just built.  The tests are kept in | ||||
| # t/ subdirectory and are run in 'trash directory' subdirectory. | ||||
| TEST_DIRECTORY=$(pwd) | ||||
| if test -z "$TEST_DIRECTORY" | ||||
| then | ||||
| 	# We allow tests to override this, in case they want to run tests | ||||
| 	# outside of t/, e.g. for running tests on the test library | ||||
| 	# itself. | ||||
| 	TEST_DIRECTORY=$(pwd) | ||||
| fi | ||||
| GIT_BUILD_DIR="$TEST_DIRECTORY"/.. | ||||
|  | ||||
| if test -n "$valgrind" | ||||
| then | ||||
| 	make_symlink () { | ||||
| @ -747,7 +787,7 @@ then | ||||
| 		test -x "$1" || return | ||||
|  | ||||
| 		base=$(basename "$1") | ||||
| 		symlink_target=$TEST_DIRECTORY/../$base | ||||
| 		symlink_target=$GIT_BUILD_DIR/$base | ||||
| 		# do not override scripts | ||||
| 		if test -x "$symlink_target" && | ||||
| 		    test ! -d "$symlink_target" && | ||||
| @ -766,7 +806,7 @@ then | ||||
| 	# override all git executables in TEST_DIRECTORY/.. | ||||
| 	GIT_VALGRIND=$TEST_DIRECTORY/valgrind | ||||
| 	mkdir -p "$GIT_VALGRIND"/bin | ||||
| 	for file in $TEST_DIRECTORY/../git* $TEST_DIRECTORY/../test-* | ||||
| 	for file in $GIT_BUILD_DIR/git* $GIT_BUILD_DIR/test-* | ||||
| 	do | ||||
| 		make_valgrind_symlink $file | ||||
| 	done | ||||
| @ -787,10 +827,10 @@ then | ||||
| elif test -n "$GIT_TEST_INSTALLED" ; then | ||||
| 	GIT_EXEC_PATH=$($GIT_TEST_INSTALLED/git --exec-path)  || | ||||
| 	error "Cannot run git from $GIT_TEST_INSTALLED." | ||||
| 	PATH=$GIT_TEST_INSTALLED:$TEST_DIRECTORY/..:$PATH | ||||
| 	PATH=$GIT_TEST_INSTALLED:$GIT_BUILD_DIR:$PATH | ||||
| 	GIT_EXEC_PATH=${GIT_TEST_EXEC_PATH:-$GIT_EXEC_PATH} | ||||
| else # normal case, use ../bin-wrappers only unless $with_dashes: | ||||
| 	git_bin_dir="$TEST_DIRECTORY/../bin-wrappers" | ||||
| 	git_bin_dir="$GIT_BUILD_DIR/bin-wrappers" | ||||
| 	if ! test -x "$git_bin_dir/git" ; then | ||||
| 		if test -z "$with_dashes" ; then | ||||
| 			say "$git_bin_dir/git is not executable; using GIT_EXEC_PATH" | ||||
| @ -798,18 +838,18 @@ else # normal case, use ../bin-wrappers only unless $with_dashes: | ||||
| 		with_dashes=t | ||||
| 	fi | ||||
| 	PATH="$git_bin_dir:$PATH" | ||||
| 	GIT_EXEC_PATH=$TEST_DIRECTORY/.. | ||||
| 	GIT_EXEC_PATH=$GIT_BUILD_DIR | ||||
| 	if test -n "$with_dashes" ; then | ||||
| 		PATH="$TEST_DIRECTORY/..:$PATH" | ||||
| 		PATH="$GIT_BUILD_DIR:$PATH" | ||||
| 	fi | ||||
| fi | ||||
| GIT_TEMPLATE_DIR=$(pwd)/../templates/blt | ||||
| GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt | ||||
| unset GIT_CONFIG | ||||
| GIT_CONFIG_NOSYSTEM=1 | ||||
| GIT_CONFIG_NOGLOBAL=1 | ||||
| export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_CONFIG_NOGLOBAL | ||||
|  | ||||
| . ../GIT-BUILD-OPTIONS | ||||
| . "$GIT_BUILD_DIR"/GIT-BUILD-OPTIONS | ||||
|  | ||||
| if test -z "$GIT_TEST_CMP" | ||||
| then | ||||
| @ -821,22 +861,22 @@ then | ||||
| 	fi | ||||
| fi | ||||
|  | ||||
| GITPERLLIB=$(pwd)/../perl/blib/lib:$(pwd)/../perl/blib/arch/auto/Git | ||||
| GITPERLLIB="$GIT_BUILD_DIR"/perl/blib/lib:"$GIT_BUILD_DIR"/perl/blib/arch/auto/Git | ||||
| export GITPERLLIB | ||||
| test -d ../templates/blt || { | ||||
| test -d "$GIT_BUILD_DIR"/templates/blt || { | ||||
| 	error "You haven't built things yet, have you?" | ||||
| } | ||||
|  | ||||
| if test -z "$GIT_TEST_INSTALLED" && test -z "$NO_PYTHON" | ||||
| then | ||||
| 	GITPYTHONLIB="$(pwd)/../git_remote_helpers/build/lib" | ||||
| 	GITPYTHONLIB="$GIT_BUILD_DIR/git_remote_helpers/build/lib" | ||||
| 	export GITPYTHONLIB | ||||
| 	test -d ../git_remote_helpers/build || { | ||||
| 	test -d "$GIT_BUILD_DIR"/git_remote_helpers/build || { | ||||
| 		error "You haven't built git_remote_helpers yet, have you?" | ||||
| 	} | ||||
| fi | ||||
|  | ||||
| if ! test -x ../test-chmtime; then | ||||
| if ! test -x "$GIT_BUILD_DIR"/test-chmtime; then | ||||
| 	echo >&2 'You need to build test-chmtime:' | ||||
| 	echo >&2 'Run "make test-chmtime" in the source (toplevel) directory' | ||||
| 	exit 1 | ||||
| @ -861,6 +901,9 @@ test_create_repo "$test" | ||||
| # in subprocesses like git equals our $PWD (for pathname comparisons). | ||||
| cd -P "$test" || exit 1 | ||||
|  | ||||
| HOME=$(pwd) | ||||
| export HOME | ||||
|  | ||||
| this_test=${0##*/} | ||||
| this_test=${this_test%%-*} | ||||
| for skp in $GIT_SKIP_TESTS | ||||
| @ -922,3 +965,7 @@ test -z "$NO_PYTHON" && test_set_prereq PYTHON | ||||
| # test whether the filesystem supports symbolic links | ||||
| ln -s x y 2>/dev/null && test -h y 2>/dev/null && test_set_prereq SYMLINKS | ||||
| rm -f y | ||||
|  | ||||
| # When the tests are run as root, permission tests will report that | ||||
| # things are writable when they shouldn't be. | ||||
| test -w / || test_set_prereq SANITY | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Junio C Hamano
					Junio C Hamano