From: Junio C Hamano Date: Mon, 13 Feb 2012 19:47:01 +0000 (-0800) Subject: Sync with maint X-Git-Tag: v1.7.10-rc0~88 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/6f5e880c68099b185e60b2492c75e506e16d8292?ds=inline;hp=-c Sync with maint Signed-off-by: Junio C Hamano --- 6f5e880c68099b185e60b2492c75e506e16d8292 diff --combined Documentation/RelNotes/1.7.10.txt index 0be3d3af31,0000000000..4bafa7c366 mode 100644,000000..100644 --- a/Documentation/RelNotes/1.7.10.txt +++ b/Documentation/RelNotes/1.7.10.txt @@@ -1,131 -1,0 +1,110 @@@ +Git v1.7.10 Release Notes +========================= + +Updates since v1.7.9 +-------------------- + +UI, Workflows & Features + + * Improved handling of views, labels and branches in git-p4 (in contrib). + + * Updated command line arguments completion script for zsh (in contrib). + + * "vcs-svn"/"svn-fe" learned to read dumps with svn-deltas and + support incremental imports. + + * "git am" learned to pass "-b" option to underlying "git mailinfo", so + that bracketed string other than "PATCH" at the beginning can be kept. + + * "git clone" learned "--single-branch" option to limit cloning to a + single branch (surprise!). + + * "git clone" learned to detach the HEAD in the resulting repository + when the source repository's HEAD does not point to a branch. + + * The commands in the "git diff" family and "git apply --stat" that + count the number of files changed and the number of lines + inserted/deleted have been updated to match the output from + "diffstat". This also opens the door to i18n this line. + + * When showing a patch while ignoring whitespace changes, the context + lines are taken from the postimage, in order to make it easier to + view the output. + + * "git merge" in an interactive session learned to spawn the editor + by default to let the user edit the auto-generated merge message, + to encourage people to explain their merges better. Legacy scripts + can export MERGE_AUTOEDIT=no to retain the historical behaviour. + + * "gitweb" allows intermediate entries in the directory hierarchy + that leads to a projects to be clicked, which in turn shows the + list of projects inside that directory. + +Performance + + * During "git upload-pack" in respose to "git fetch", unnecessary calls + to parse_object() have been eliminated, to help performance in + repositories with excessive number of refs. + +Internal Implementation + + * Recursive call chains in "git index-pack" to deal with long delta + chains have been flattened, to reduce the stack footprint. + + * Use of add_extra_ref() API is slowly getting removed, to make it + possible to cleanly restructure the overall refs API. + + * The test suite supports the new "test_pause" helper function. + + * t/Makefile is adjusted to prevent newer versions of GNU make from + running tests in seemingly random order. + +Also contains minor documentation updates and code clean-ups. + + +Fixes since v1.7.9 +------------------ + +Unless otherwise noted, all the fixes since v1.7.9 in the maintenance +releases are contained in this release (see release notes to them for +details). + + * "git merge --no-edit $tag" failed to honor the --no-edit option. + (merge 3adab6f jn/merge-no-edit-fix later to maint). + + * The error message emitted when we see an empty loose object was + not phrased correctly. + (merge 33e42de mm/empty-loose-error-message later to maint). + + * Many small corner case bugs on "git tag -n" was corrected. + (merge 31fd8d7 jk/maint-tag-show-fixes later to maint). + + * "git commit" refused to create a commit when entries added with + "add -N" remained in the index, without telling Git what their content + in the next commit should be. We should have created the commit without + these paths. + (merge 3f6d56d jc/maint-commit-ignore-i-t-a later to maint). + + * Search box in "gitweb" did not accept non-ASCII characters correctly. + (merge 84d9e2d jn/gitweb-search-utf-8 later to maint). + + * The code to ask for password did not fall back to the terminal + input when GIT_ASKPASS is set but does not work (e.g. lack of X + with GUI askpass helper). + (merge 84d7273 jk/prompt-fallback-to-tty later to maint). + + * map_user() was not rewriting its output correctly, which resulted + in the user visible symptom that "git blame -e" sometimes showed + excess '>' at the end of email addresses. + (merge f026358 jc/maint-mailmap-output later to maint). + + * "checkout -b" did not allow switching out of an unborn branch. - (merge abe1998 jc/checkout-out-of-unborn later to maint). - - * "add -e" learned not to show a diff for an otherwise unmodified - submodule that only has uncommitted local changes in the patch - prepared by for the user to edit. - (merge 701825d js/add-e-submodule-fix later to maint). - - * "rebase" and "commit --amend" failed to work on commits with ancient - timestamps near year 1970. - (merge 2c733fb jc/parse-date-raw later to maint). - - * "git merge --ff-only $tag" failed because it cannot record the - required mergetag without creating a merge, but this is so common - operation for branch that is used _only_ to follow the upstream, so - it is allowed to fast-forward without recording the mergetag. - (merge b5c9f1c jc/merge-ff-only-stronger-than-signed-merge later to maint). - - * Typo in "git branch --edit-description my-tpoic" was not diagnosed. - (merge c2d17ba jc/branch-desc-typoavoidance later to maint). - - * rpmbuild noticed an unpackaged but installed *.mo file and failed. - (merge 3a9f58c jn/rpm-spec later to maint). ++ (merge abe1998 jc/checkout-out-of-unborn later to maint). + +--- +exec >/var/tmp/1 +O=v1.7.9-249-gaa47ec9 +echo O=$(git describe) +git log --first-parent --oneline ^maint $O.. +echo +git shortlog --no-merges ^maint $O.. diff --combined Makefile index 4817157a96,b5530cbaae..2bce23e5eb --- a/Makefile +++ b/Makefile @@@ -47,9 -47,6 +47,9 @@@ all: # A translated Git requires GNU libintl or another gettext implementation, # plus libintl-perl at runtime. # +# Define USE_GETTEXT_SCHEME and set it to 'fallthrough', if you don't trust +# the installed gettext translation of the shell scripts output. +# # Define HAVE_LIBCHARSET_H if you haven't set NO_GETTEXT and you can't # trust the langinfo.h's nl_langinfo(CODESET) function to return the # current character set. GNU and Solaris have a nl_langinfo(CODESET), @@@ -342,7 -339,7 +342,7 @@@ pathsep = export prefix bindir sharedir sysconfdir gitwebdir localedir - CC = gcc + CC = cc AR = ar RM = rm -f DIFF = diff @@@ -377,11 -374,6 +377,11 @@@ BUILTIN_OBJS BUILT_INS = COMPAT_CFLAGS = COMPAT_OBJS = +XDIFF_H = +XDIFF_OBJS = +VCSSVN_H = +VCSSVN_OBJS = +VCSSVN_TEST_OBJS = EXTRA_CPPFLAGS = LIB_H = LIB_OBJS = @@@ -460,9 -452,6 +460,9 @@@ PROGRAM_OBJS += http-backend. PROGRAM_OBJS += sh-i18n--envsubst.o PROGRAM_OBJS += credential-store.o +# Binary suffix, set to .exe for Windows builds +X = + PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS)) TEST_PROGRAMS_NEED_X += test-chmtime @@@ -477,13 -466,16 +477,13 @@@ TEST_PROGRAMS_NEED_X += test-index-vers TEST_PROGRAMS_NEED_X += test-line-buffer TEST_PROGRAMS_NEED_X += test-match-trees TEST_PROGRAMS_NEED_X += test-mktemp -TEST_PROGRAMS_NEED_X += test-obj-pool TEST_PROGRAMS_NEED_X += test-parse-options TEST_PROGRAMS_NEED_X += test-path-utils TEST_PROGRAMS_NEED_X += test-run-command TEST_PROGRAMS_NEED_X += test-sha1 TEST_PROGRAMS_NEED_X += test-sigchain -TEST_PROGRAMS_NEED_X += test-string-pool TEST_PROGRAMS_NEED_X += test-subprocess TEST_PROGRAMS_NEED_X += test-svn-fe -TEST_PROGRAMS_NEED_X += test-treap TEST_PROGRAMS = $(patsubst %,%$X,$(TEST_PROGRAMS_NEED_X)) @@@ -1529,7 -1521,6 +1529,7 @@@ ifdef GETTEXT_POISO endif ifdef NO_GETTEXT BASIC_CFLAGS += -DNO_GETTEXT + USE_GETTEXT_SCHEME ?= fallthrough endif ifdef NO_STRCASESTR COMPAT_CFLAGS += -DNO_STRCASESTR @@@ -1777,26 -1768,6 +1777,26 @@@ ifdef ASCIIDOC export ASCIIDOC7 endif +### profile feedback build +# + +# Can adjust this to be a global directory if you want to do extended +# data gathering +PROFILE_DIR := $(CURDIR) + +ifeq ("$(PROFILE)","GEN") + CFLAGS += -fprofile-generate=$(PROFILE_DIR) -DNO_NORETURN=1 + EXTLIBS += -lgcov + export CCACHE_DISABLE=t + V=1 +else +ifneq ("$(PROFILE)","") + CFLAGS += -fprofile-use=$(PROFILE_DIR) -fprofile-correction -DNO_NORETURN=1 + export CCACHE_DISABLE=t + V=1 +endif +endif + # Shell quote (do not use $(call) to accommodate ancient setups); SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER)) @@@ -1853,17 -1824,7 +1853,17 @@@ export DIFF TAR INSTALL DESTDIR SHELL_P SHELL = $(SHELL_PATH) -all:: shell_compatibility_test $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS +all:: shell_compatibility_test + +ifeq "$(PROFILE)" "BUILD" +ifeq ($(filter all,$(MAKECMDGOALS)),all) +all:: profile-clean + $(MAKE) PROFILE=GEN all + $(MAKE) PROFILE=GEN -j1 test +endif +endif + +all:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) GIT-BUILD-OPTIONS ifneq (,$X) $(QUIET_BUILT_IN)$(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_PROGRAMS) $(BUILT_INS) git$X)), test -d '$p' -o '$p' -ef '$p$X' || $(RM) '$p';) endif @@@ -1926,7 -1887,6 +1926,7 @@@ sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)| -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \ -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' \ -e 's/@@NO_CURL@@/$(NO_CURL)/g' \ + -e 's/@@USE_GETTEXT_SCHEME@@/$(USE_GETTEXT_SCHEME)/g' \ -e $(BROKEN_PATH_FIX) \ $@.sh >$@+ endef @@@ -2028,24 -1988,12 +2028,24 @@@ GIT_OBJS := $(LIB_OBJS) $(BUILTIN_OBJS ifndef NO_CURL GIT_OBJS += http.o http-walker.o remote-curl.o endif -XDIFF_OBJS = xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o \ - xdiff/xmerge.o xdiff/xpatience.o xdiff/xhistogram.o -VCSSVN_OBJS = vcs-svn/string_pool.o vcs-svn/line_buffer.o \ - vcs-svn/repo_tree.o vcs-svn/fast_export.o vcs-svn/svndump.o -VCSSVN_TEST_OBJS = test-obj-pool.o test-string-pool.o \ - test-line-buffer.o test-treap.o + +XDIFF_OBJS += xdiff/xdiffi.o +XDIFF_OBJS += xdiff/xprepare.o +XDIFF_OBJS += xdiff/xutils.o +XDIFF_OBJS += xdiff/xemit.o +XDIFF_OBJS += xdiff/xmerge.o +XDIFF_OBJS += xdiff/xpatience.o +XDIFF_OBJS += xdiff/xhistogram.o + +VCSSVN_OBJS += vcs-svn/line_buffer.o +VCSSVN_OBJS += vcs-svn/sliding_window.o +VCSSVN_OBJS += vcs-svn/repo_tree.o +VCSSVN_OBJS += vcs-svn/fast_export.o +VCSSVN_OBJS += vcs-svn/svndiff.o +VCSSVN_OBJS += vcs-svn/svndump.o + +VCSSVN_TEST_OBJS += test-line-buffer.o + OBJECTS := $(GIT_OBJS) $(XDIFF_OBJS) $(VCSSVN_OBJS) dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d) @@@ -2164,25 -2112,16 +2164,25 @@@ connect.o transport.o url.o http-backen http-fetch.o http-walker.o remote-curl.o transport.o walker.o: walker.h http.o http-walker.o http-push.o http-fetch.o remote-curl.o: http.h url.h -xdiff-interface.o $(XDIFF_OBJS): \ - xdiff/xinclude.h xdiff/xmacros.h xdiff/xdiff.h xdiff/xtypes.h \ - xdiff/xutils.h xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h +XDIFF_H += xdiff/xinclude.h +XDIFF_H += xdiff/xmacros.h +XDIFF_H += xdiff/xdiff.h +XDIFF_H += xdiff/xtypes.h +XDIFF_H += xdiff/xutils.h +XDIFF_H += xdiff/xprepare.h +XDIFF_H += xdiff/xdiffi.h +XDIFF_H += xdiff/xemit.h + +xdiff-interface.o $(XDIFF_OBJS): $(XDIFF_H) -$(VCSSVN_OBJS) $(VCSSVN_TEST_OBJS): $(LIB_H) \ - vcs-svn/obj_pool.h vcs-svn/trp.h vcs-svn/string_pool.h \ - vcs-svn/line_buffer.h vcs-svn/repo_tree.h vcs-svn/fast_export.h \ - vcs-svn/svndump.h +VCSSVN_H += vcs-svn/line_buffer.h +VCSSVN_H += vcs-svn/sliding_window.h +VCSSVN_H += vcs-svn/repo_tree.h +VCSSVN_H += vcs-svn/fast_export.h +VCSSVN_H += vcs-svn/svndiff.h +VCSSVN_H += vcs-svn/svndump.h -test-svn-fe.o: vcs-svn/svndump.h +$(VCSSVN_OBJS) $(VCSSVN_TEST_OBJS): $(LIB_H) $(VCSSVN_H) endif exec_cmd.sp exec_cmd.s exec_cmd.o: EXTRA_CPPFLAGS = \ @@@ -2325,7 -2264,7 +2325,7 @@@ cscope ### Detect prefix changes TRACK_CFLAGS = $(CC):$(subst ','\'',$(ALL_CFLAGS)):\ $(bindir_SQ):$(gitexecdir_SQ):$(template_dir_SQ):$(prefix_SQ):\ - $(localedir_SQ) + $(localedir_SQ):$(USE_GETTEXT_SCHEME) GIT-CFLAGS: FORCE @FLAGS='$(TRACK_CFLAGS)'; \ @@@ -2410,6 -2349,8 +2410,6 @@@ test-line-buffer$X: vcs-svn/lib. test-parse-options$X: parse-options.o parse-options-cb.o -test-string-pool$X: vcs-svn/lib.a - test-svn-fe$X: vcs-svn/lib.a .PRECIOUS: $(TEST_OBJS) @@@ -2611,11 -2552,7 +2611,11 @@@ distclean: clea $(RM) configure $(RM) po/git.pot -clean: +profile-clean: + $(RM) $(addsuffix *.gcda,$(addprefix $(PROFILE_DIR)/, $(object_dirs))) + $(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs))) + +clean: profile-clean $(RM) *.o block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o xdiff/*.o vcs-svn/*.o \ builtin/*.o $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB) $(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X @@@ -2645,7 -2582,7 +2645,7 @@@ ifndef NO_TCLT endif $(RM) GIT-VERSION-FILE GIT-CFLAGS GIT-LDFLAGS GIT-GUI-VARS GIT-BUILD-OPTIONS -.PHONY: all install clean strip +.PHONY: all install profile-clean clean strip .PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell .PHONY: FORCE cscope @@@ -2755,3 -2692,18 +2755,3 @@@ cover_db: coverage-repor cover_db_html: cover_db cover -report html -outputdir cover_db_html cover_db -### profile feedback build -# -.PHONY: profile-all profile-clean - -PROFILE_GEN_CFLAGS := $(CFLAGS) -fprofile-generate -DNO_NORETURN=1 -PROFILE_USE_CFLAGS := $(CFLAGS) -fprofile-use -fprofile-correction -DNO_NORETURN=1 - -profile-clean: - $(RM) $(addsuffix *.gcda,$(object_dirs)) - $(RM) $(addsuffix *.gcno,$(object_dirs)) - -profile-all: profile-clean - $(MAKE) CFLAGS="$(PROFILE_GEN_CFLAGS)" all - $(MAKE) CFLAGS="$(PROFILE_GEN_CFLAGS)" -j1 test - $(MAKE) CFLAGS="$(PROFILE_USE_CFLAGS)" all diff --combined t/Makefile index 66ceefefcc,52a23fffc4..b5048ab77b --- a/t/Makefile +++ b/t/Makefile @@@ -17,9 -17,9 +17,9 @@@ DEFAULT_TEST_TARGET ?= tes # Shell quote; SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) -T = $(wildcard t[0-9][0-9][0-9][0-9]-*.sh) -TSVN = $(wildcard t91[0-9][0-9]-*.sh) -TGITWEB = $(wildcard t95[0-9][0-9]-*.sh) +T = $(sort $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)) +TSVN = $(sort $(wildcard t91[0-9][0-9]-*.sh)) +TGITWEB = $(sort $(wildcard t95[0-9][0-9]-*.sh)) all: $(DEFAULT_TEST_TARGET) @@@ -73,42 -73,4 +73,4 @@@ gitweb-test valgrind: $(MAKE) GIT_TEST_OPTS="$(GIT_TEST_OPTS) --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 + .PHONY: pre-clean $(T) aggregate-results clean valgrind diff --combined t/README index c09c582c16,681e8b4320..3534f43d01 --- a/t/README +++ b/t/README @@@ -548,19 -548,6 +548,19 @@@ library for your script to use ... ' + - test_pause + + This command is useful for writing and debugging tests and must be + removed before submitting. It halts the execution of the test and + spawns a shell in the trash directory. Exit the shell to continue + the test. Example: + + test_expect_success 'test' ' + git do-something >actual && + test_pause && + test_cmp expected actual + ' + Prerequisites ------------- @@@ -671,76 -658,3 +671,3 @@@ Then, at the top-level 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 /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= SMOKE_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= SMOKE_PASSWORD= \ - SMOKE_COMMENT= SMOKE_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. diff --combined t/t4150-am.sh index 8807b602a5,7e6e59aefe..f1b60b8560 --- a/t/t4150-am.sh +++ b/t/t4150-am.sh @@@ -136,7 -136,7 +136,7 @@@ test_expect_success setup git format-patch -M --stdout lorem^ >rename-add.patch && # reset time - unset test_tick && + sane_unset test_tick && test_tick ' @@@ -237,7 -237,7 +237,7 @@@ test_expect_success 'am stays in branch test_expect_success 'am --signoff does not add Signed-off-by: line if already there' ' git format-patch --stdout HEAD^ >patch3 && - sed -e "/^Subject/ s,\[PATCH,Re: Re: Re: & 1/5 v2," patch3 >patch4 && + sed -e "/^Subject/ s,\[PATCH,Re: Re: Re: & 1/5 v2] [foo," patch3 >patch4 && rm -fr .git/rebase-apply && git reset --hard && git checkout HEAD^ && @@@ -259,17 -259,7 +259,17 @@@ test_expect_success 'am --keep really k git am --keep patch4 && ! test -d .git/rebase-apply && git cat-file commit HEAD >actual && - grep "Re: Re: Re: \[PATCH 1/5 v2\] third" actual + grep "Re: Re: Re: \[PATCH 1/5 v2\] \[foo\] third" actual +' + +test_expect_success 'am --keep-non-patch really keeps the non-patch part' ' + rm -fr .git/rebase-apply && + git reset --hard && + git checkout HEAD^ && + git am --keep-non-patch patch4 && + ! test -d .git/rebase-apply && + git cat-file commit HEAD >actual && + grep "^\[foo\] third" actual ' test_expect_success 'am -3 falls back to 3-way merge' '