Git 2.5 Release Notes
=====================

Updates since v2.4
------------------

Ports


UI, Workflows & Features

 * "git p4" now detects the filetype (e.g. binary) correctly even when
   the files are opened exclusively.

 * git p4 attempts to better handle branches in Perforce.

 * "git p4" learned "--changes-block-size <n>" to read the changes in
   chunks from Perforce, instead of making one call to "p4 changes"
   that may trigger "too many rows scanned" error from Perforce.

 * "git show-branch --topics HEAD" (with no other arguments) did not
   do anything interesting.  Instead, contrast the given revision
   against all the local branches by default.

 * A replacement for contrib/workdir/git-new-workdir that does not
   rely on symbolic links and make sharing of objects and refs safer
   by making the borrowee and borrowers aware of each other.

 * Tweak the sample "store" backend of the credential helper to honor
   XDG configuration file locations when specified.

 * A heuristic to help the "git <cmd> <revs> <pathspec>" command line
   convention to catch mistyped paths is to make sure all the non-rev
   parameters in the later part of the command line are names of the
   files in the working tree, but that means "git grep $str -- \*.c"
   must always be disambiguated with "--", because nobody sane will
   create a file whose name literally is asterisk-dot-see.  Loosen the
   heuristic to declare that with a wildcard string the user likely
   meant to give us a pathspec.

 * "git merge FETCH_HEAD" learned that the previous "git fetch" could
   be to create an Octopus merge, i.e. recording multiple branches
   that are not marked as "not-for-merge"; this allows us to lose an
   old style invocation "git merge <msg> HEAD $commits..." in the
   implementation of "git pull" script; the old style syntax can now
   be deprecated.

 * Help us to find broken test script that splits the body part of the
   test by mistaken use of wrong kind of quotes.
   (merge d93d5d5 jc/test-prereq-validate later to maint).

 * Developer support to automatically detect broken &&-chain in the
   test scripts is now turned on by default.
   (merge 92b269f jk/test-chain-lint later to maint).

 * Filter scripts were run with SIGPIPE disabled on the Git side,
   expecting that they may not read what Git feeds them to filter.
   We however treated a filter that does not read its input fully
   before exiting as an error.

   This changes semantics, but arguably in a good way.  If a filter
   can produce its output without consuming its input using whatever
   magic, we now let it do so, instead of diagnosing it as a
   programming error.

 * Instead of dying immediately upon failing to obtain a lock, the
   locking (of refs etc) retries after a short while with backoff.

 * Introduce http.<url>.SSLCipherList configuration variable to tweak
   the list of cipher suite to be used with libcURL when talking with
   https:// sites.

 * "git subtree" script (in contrib/) used "echo -n" to produce
   progress messages in a non-portable way.

 * "git subtree" script (in contrib/) does not have --squash option
   when pushing, but the documentation and help text pretended as if
   it did.

 * The Git subcommand completion (in contrib/) listed credential
   helpers among candidates, which is not something the end user would
   invoke interatively.


Performance, Internal Implementation, Development Support etc.

 * "unsigned char [20]" used thoughout the code to represent object
   names are being converted into a semi-opaque "struct object_id".
   This effort is expected to interfere with other topics in flight,
   but hopefully will give us one extra level of abstraction in the
   end, when completed.

 * Catch a programmer mistake to feed a pointer not an array to
   ARRAY_SIZE() macro, by using a couple of GCC extensions.
   (merge 89c855e ep/do-not-feed-a-pointer-to-array-size later to maint).

 * Some error messages in "git config" were emitted without calling
   the usual error() facility.

 * When "add--interactive" splits a hunk into two overlapping hunks
   and then let the user choose only one, it sometimes feeds an
   incorrect patch text to "git apply".  Add tests to demonstrate
   this.

   I have a slight suspicion that this may be $gmane/87202 coming back
   and biting us (I seem to have said "let's run with this and see
   what happens" back then).

 * More line-ending tests.

 * An earlier rewrite to use strbuf_getwholeline() instead of fgets(3)
   to read packed-refs file revealed that the former is unacceptably
   inefficient.

 * The refs API uses ref_lock struct which had its own "int fd", even
   though the same file descriptor was in the lock struct it contains.
   Clean-up the code to lose this redundant field.

 * Add the "--allow-unknown-type" option to "cat-file" to allow
   inspecting loose objects of an experimental or a broken type.

 * Many long-running operations show progress eye-candy, even when
   they are later backgrounded.  Hide the eye-candy when the process
   is sent to the background instead.
   (merge 9a9a41d lm/squelch-bg-progress later to maint).

 * There was a dead code that used to handle "git pull --tags" and
   show special-cased error message, which was made irrelevant when
   the semantics of the option changed back in Git 1.9 days.
   (merge 19d122b pt/pull-tags-error-diag later to maint).


Also contains various documentation updates and code clean-ups.


Fixes since v2.4
----------------

Unless otherwise noted, all the fixes since v2.4 in the maintenance
track are contained in this release (see the maintenance releases'
notes for details).

 * Git 2.4 broke setting verbosity and progress levels on "git clone"
   with native transports.
   (merge 822f0c4 mh/clone-verbosity-fix later to maint).

 * "git add -e" did not allow the user to abort the operation by
   killing the editor.
   (merge cb64800 jk/add-e-kill-editor later to maint).

 * Memory usage of "git index-pack" has been trimmed by tens of
   per-cent.
   (merge c6458e6 nd/slim-index-pack-memory-usage later to maint).

 * "git rev-list --objects $old --not --all" to see if everything that
   is reachable from $old is already connected to the existing refs
   was very inefficient.
   (merge b6e8a3b jk/still-interesting later to maint).

 * "hash-object --literally" introduced in v2.2 was not prepared to
   take a really long object type name.
   (merge 1427a7f jc/hash-object later to maint).

 * "git rebase --quiet" was not quite quiet when there is nothing to
   do.
   (merge 22946a9 jk/rebase-quiet-noop later to maint).

 * The completion for "log --decorate=" parameter value was incorrect.
   (merge af16bda sg/complete-decorate-full-not-long later to maint).

 * "filter-branch" corrupted commit log message that ends with an
   incomplete line on platforms with some "sed" implementations that
   munge such a line.  Work it around by avoiding to use "sed".
   (merge df06201 jk/filter-branch-use-of-sed-on-incomplete-line later to maint).

 * "git daemon" fails to build from the source under NO_IPV6
   configuration (regression in 2.4).
   (merge d358f77 jc/daemon-no-ipv6-for-2.4.1 later to maint).

 * Some time ago, "git blame" (incorrectly) lost the convert_to_git()
   call when synthesizing a fake "tip" commit that represents the
   state in the working tree, which broke folks who record the history
   with LF line ending to make their project portabile across
   platforms while terminating lines in their working tree files with
   CRLF for their platform.
   (merge 4bf256d tb/blame-resurrect-convert-to-git later to maint).

 * We avoid setting core.worktree when the repository location is the
   ".git" directory directly at the top level of the working tree, but
   the code misdetected the case in which the working tree is at the
   root level of the filesystem (which arguably is a silly thing to
   do, but still valid).
   (merge 84ccad8 jk/init-core-worktree-at-root later to maint).

 * "git commit --date=now" or anything that relies on approxidate lost
   the daylight-saving-time offset.
   (merge f6e6362 jc/epochtime-wo-tz later to maint).

 * Access to objects in repositories that borrow from another one on a
   slow NFS server unnecessarily got more expensive due to recent code
   becoming more cautious in a naive way not to lose objects to pruning.
   (merge ee1c6c3 jk/prune-mtime later to maint).

 * The codepaths that read .gitignore and .gitattributes files have been
   taught that these files encoded in UTF-8 may have UTF-8 BOM marker at
   the beginning; this makes it in line with what we do for configuration
   files already.
   (merge 27547e5 cn/bom-in-gitignore later to maint).

 * a few helper scripts in the test suite did not report errors
   correcty.
   (merge de248e9 ep/fix-test-lib-functions-report later to maint).

 * The default $HOME/.gitconfig file created upon "git config --global"
   that edits it had incorrectly spelled user.name and user.email
   entries in it.
   (merge 7e11052 oh/fix-config-default-user-name-section later to maint).

 * "git cat-file bl $blob" failed to barf even though there is no
   object type that is "bl".
   (merge b7994af jk/type-from-string-gently later to maint).

 * The usual "git diff" when seeing a file turning into a directory
   showed a patchset to remove the file and create all files in the
   directory, but "git diff --no-index" simply refused to work.  Also,
   when asked to compare a file and a directory, imitate POSIX "diff"
   and compare the file with the file with the same name in the
   directory, instead of refusing to run.
   (merge 0615173 jc/diff-no-index-d-f later to maint).

 * "git rebase -i" moved the "current" command from "todo" to "done" a
   bit too prematurely, losing a step when a "pick" did not even start.
   (merge 8cbc57c ph/rebase-i-redo later to maint).

 * The connection initiation code for "ssh" transport tried to absorb
   differences between the stock "ssh" and Putty-supplied "plink" and
   its derivatives, but the logic to tell that we are using "plink"
   variants were too loose and falsely triggered when "plink" appeared
   anywhere in the path (e.g. "/home/me/bin/uplink/ssh").
   (merge baaf233 bc/connect-plink later to maint).

 * "git stash pop/apply" forgot to make sure that not just the working
   tree is clean but also the index is clean. The latter is important
   as a stash application can conflict and the index will be used for
   conflict resolution.
   (merge ed178ef jk/stash-require-clean-index later to maint).

 * We have prepended $GIT_EXEC_PATH and the path "git" is installed in
   (typically "/usr/bin") to $PATH when invoking subprograms and hooks
   for almost eternity, but the original use case the latter tried to
   support was semi-bogus (i.e. install git to /opt/foo/git and run it
   without having /opt/foo on $PATH), and more importantly it has
   become less and less relevant as Git grew more mainstream (i.e. the
   users would _want_ to have it on their $PATH).  Stop prepending the
   path in which "git" is installed to users' $PATH, as that would
   interfere the command search order people depend on (e.g. they may
   not like versions of programs that are unrelated to Git in /usr/bin
   and want to override them by having different ones in /usr/local/bin
   and have the latter directory earlier in their $PATH).
   (merge a0b4507 jk/git-no-more-argv0-path-munging later to maint).

 * core.excludesfile (defaulting to $XDG_HOME/git/ignore) is supposed
   to be overridden by repository-specific .git/info/exclude file, but
   the order was swapped from the beginning. This belatedly fixes it.
   (merge 099d2d8 jc/gitignore-precedence later to maint).

 * After "git add -N", the path appeared in output of "git diff HEAD"
   and "git diff --cached HEAD", leading "git status" to classify it
   as "Changes to be committed".  Such a path, however, is not yet to
   be scheduled to be committed.  "git diff" showed the change to the
   path as modification, not as a "new file", in the header of its
   output.

   Treat such paths as "yet to be added to the index but Git already
   know about them"; "git diff HEAD" and "git diff --cached HEAD"
   should not talk about them, and "git diff" should show them as new
   files yet to be added to the index.
   (merge d95d728 nd/diff-i-t-a later to maint).

 * There was a commented-out (instead of being marked to expect
   failure) test that documented a breakage that was fixed since the
   test was written; turn it into a proper test.
   (merge 66d2e04 sb/t1020-cleanup later to maint).

 * The "log --decorate" enhancement in Git 2.4 that shows the commit
   at the tip of the current branch e.g. "HEAD -> master", did not
   work with --decorate=full.
   (merge 429ad20 mg/log-decorate-HEAD later to maint).

 * The ref API did not handle cases where 'refs/heads/xyzzy/frotz' is
   removed at the same time as 'refs/heads/xyzzy' is added (or vice
   versa) very well.
   (merge c628edf mh/ref-directory-file later to maint).

 * Multi-ref transaction support we merged a few releases ago
   unnecessarily kept many file descriptors open, risking to fail with
   resource exhaustion.  This is for 2.4.x track.
   (merge 185ce3a mh/write-refs-sooner-2.4 later to maint).

 * "git bundle verify" did not diagnose extra parameters on the
   command line.
   (merge 7886cfa ps/bundle-verify-arg later to maint).

 * Various documentation mark-up fixes to make the output more
   consistent in general and also make AsciiDoctor (an alternative
   formatter) happier.
   (merge d0258b9 jk/asciidoc-markup-fix later to maint).
   (merge ad3967a jk/stripspace-asciidoctor-fix later to maint).
   (merge 975e382 ja/tutorial-asciidoctor-fix later to maint).

 * Code cleanups and documentation updates.
   (merge 0269f96 mm/usage-log-l-can-take-regex later to maint).
   (merge 64f2589 nd/t1509-chroot-test later to maint).
   (merge f86a374 sb/test-bitmap-free-at-end later to maint).
   (merge 05bfc7d sb/line-log-plug-pairdiff-leak later to maint).
   (merge 846e5df pt/xdg-config-path later to maint).
   (merge 1154aa4 jc/plug-fmt-merge-msg-leak later to maint).
   (merge 319b678 jk/sha1-file-reduce-useless-warnings later to maint).
   (merge 9a35c14 fg/document-commit-message-stripping later to maint).
   (merge bbf431c ps/doc-packfile-vs-pack-file later to maint).
   (merge 309a9e3 jk/skip-http-tests-under-no-curl later to maint).
   (merge ccd593c dl/branch-error-message later to maint).
