Git v2.9.3 Release Notes
========================

Fixes since v2.9.2
------------------

 * A helper function that takes the contents of a commit object and
   finds its subject line did not ignore leading blank lines, as is
   commonly done by other codepaths.  Make it ignore leading blank
   lines to match.

 * Git does not know what the contents in the index should be for a
   path added with "git add -N" yet, so "git grep --cached" should not
   show hits (or show lack of hits, with -L) in such a path, but that
   logic does not apply to "git grep", i.e. searching in the working
   tree files.  But we did so by mistake, which has been corrected.

 * "git rebase -i --autostash" did not restore the auto-stashed change
   when the operation was aborted.

 * "git commit --amend --allow-empty-message -S" for a commit without
   any message body could have misidentified where the header of the
   commit object ends.

 * More mark-up updates to typeset strings that are expected to
   literally typed by the end user in fixed-width font.

 * For a long time, we carried an in-code comment that said our
   colored output would work only when we use fprintf/fputs on
   Windows, which no longer is the case for the past few years.

 * "gc.autoPackLimit" when set to 1 should not trigger a repacking
   when there is only one pack, but the code counted poorly and did
   so.

 * One part of "git am" had an oddball helper function that called
   stuff from outside "his" as opposed to calling what we have "ours",
   which was not gender-neutral and also inconsistent with the rest of
   the system where outside stuff is usually called "theirs" in
   contrast to "ours".

 * The test framework learned a new helper test_match_signal to
   check an exit code from getting killed by an expected signal.

 * "git blame -M" missed a single line that was moved within the file.

 * Fix recently introduced codepaths that are involved in parallel
   submodule operations, which gave up on reading too early, and
   could have wasted CPU while attempting to write under a corner
   case condition.

 * "git grep -i" has been taught to fold case in non-ascii locales
   correctly.

 * A test that unconditionally used "mktemp" learned that the command
   is not necessarily available everywhere.

 * "git blame file" allowed the lineage of lines in the uncommitted,
   unadded contents of "file" to be inspected, but it refused when
   "file" did not appear in the current commit.  When "file" was
   created by renaming an existing file (but the change has not been
   committed), this restriction was unnecessarily tight.

 * "git add -N dir/file && git write-tree" produced an incorrect tree
   when there are other paths in the same directory that sorts after
   "file".

 * "git fetch http://user:pass@host/repo..." scrubbed the userinfo
   part, but "git push" didn't.

 * An age old bug that caused "git diff --ignore-space-at-eol"
   misbehave has been fixed.

 * "git notes merge" had a code to see if a path exists (and fails if
   it does) and then open the path for writing (when it doesn't).
   Replace it with open with O_EXCL.

 * "git pack-objects" and "git index-pack" mostly operate with off_t
   when talking about the offset of objects in a packfile, but there
   were a handful of places that used "unsigned long" to hold that
   value, leading to an unintended truncation.

 * Recent update to "git daemon" tries to enable the socket-level
   KEEPALIVE, but when it is spawned via inetd, the standard input
   file descriptor may not necessarily be connected to a socket.
   Suppress an ENOTSOCK error from setsockopt().

 * Recent FreeBSD stopped making perl available at /usr/bin/perl;
   switch the default the built-in path to /usr/local/bin/perl on not
   too ancient FreeBSD releases.

 * "git status" learned to suggest "merge --abort" during a conflicted
   merge, just like it already suggests "rebase --abort" during a
   conflicted rebase.

 * The .c/.h sources are marked as such in our .gitattributes file so
   that "git diff -W" and friends would work better.

 * Existing autoconf generated test for the need to link with pthread
   library did not check all the functions from pthread libraries;
   recent FreeBSD has some functions in libc but not others, and we
   mistakenly thought linking with libc is enough when it is not.

 * Allow http daemon tests in Travis CI tests.

 * Users of the parse_options_concat() API function need to allocate
   extra slots in advance and fill them with OPT_END() when they want
   to decide the set of supported options dynamically, which makes the
   code error-prone and hard to read.  This has been corrected by tweaking
   the API to allocate and return a new copy of "struct option" array.

 * The use of strbuf in "git rm" to build filename to remove was a bit
   suboptimal, which has been fixed.

 * "git commit --help" said "--no-verify" is only about skipping the
   pre-commit hook, and failed to say that it also skipped the
   commit-msg hook.

 * "git merge" in Git v2.9 was taught to forbid merging an unrelated
   lines of history by default, but that is exactly the kind of thing
   the "--rejoin" mode of "git subtree" (in contrib/) wants to do.
   "git subtree" has been taught to use the "--allow-unrelated-histories"
   option to override the default.

 * The build procedure for "git persistent-https" helper (in contrib/)
   has been updated so that it can be built with more recent versions
   of Go.

 * There is an optimization used in "git diff $treeA $treeB" to borrow
   an already checked-out copy in the working tree when it is known to
   be the same as the blob being compared, expecting that open/mmap of
   such a file is faster than reading it from the object store, which
   involves inflating and applying delta.  This however kicked in even
   when the checked-out copy needs to go through the convert-to-git
   conversion (including the clean filter), which defeats the whole
   point of the optimization.  The optimization has been disabled when
   the conversion is necessary.

 * "git -c grep.patternType=extended log --basic-regexp" misbehaved
   because the internal API to access the grep machinery was not
   designed well.

 * Windows port was failing some tests in t4130, due to the lack of
   inum in the returned values by its lstat(2) emulation.

 * The characters in the label shown for tags/refs for commits in
   "gitweb" output are now properly escaped for proper HTML output.

 * FreeBSD can lie when asked mtime of a directory, which made the
   untracked cache code to fall back to a slow-path, which in turn
   caused tests in t7063 to fail because it wanted to verify the
   behaviour of the fast-path.

 * Squelch compiler warnings for netmalloc (in compat/) library.

 * The API documentation for hashmap was unclear if hashmap_entry
   can be safely discarded without any other consideration.  State
   that it is safe to do so.

 * Not-so-recent rewrite of "git am" that started making internal
   calls into the commit machinery had an unintended regression, in
   that no matter how many seconds it took to apply many patches, the
   resulting committer timestamp for the resulting commits were all
   the same.

 * "git difftool <paths>..." started in a subdirectory failed to
   interpret the paths relative to that directory, which has been
   fixed.

Also contains minor documentation updates and code clean-ups.
