Git v1.7.9.2 Release Notes
==========================

Fixes since v1.7.9.1
--------------------

 * Bash completion script (in contrib/) did not like a pattern that
   begins with a dash to be passed to __git_ps1 helper function.

 * Adaptation of the bash completion script (in contrib/) for zsh
   incorrectly listed all subcommands when "git <TAB><TAB>" was given
   to ask for list of porcelain subcommands.

 * The build procedure for profile-directed optimized binary was not
   working very well.

 * Some systems need to explicitly link -lcharset to get locale_charset().

 * t5541 ignored user-supplied port number used for HTTP server testing.

 * The error message emitted when we see an empty loose object was
   not phrased correctly.

 * 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).

 * We failed to give the true terminal width to any subcommand when
   they are invoked with the pager, i.e. "git -p cmd".

 * 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.

 * "git checkout -b" did not allow switching out of an unborn branch.

 * When you have both .../foo and .../foo.git, "git clone .../foo" did not
   favor the former but the latter.

 * "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.

 * "git diff --stat" said "files", "insertions", and "deletions" even
   when it is showing one "file", one "insertion" or one "deletion".

 * The output from "git diff --stat" for two paths that have the same
   amount of changes showed graph bars of different length due to the
   way we handled rounding errors.

 * "git grep" did not pay attention to -diff (hence -binary) attribute.

 * The transport programs (fetch, push, clone)ignored --no-progress
   and showed progress when sending their output to a terminal.

 * Sometimes error status detected by a check in an earlier phase of
   "git receive-pack" (the other end of "git push") was lost by later
   checks, resulting in false indication of success.

 * "git rev-list --verify" sometimes skipped verification depending on
   the phase of the moon, which dates back to 1.7.8.x series.

 * Search box in "gitweb" did not accept non-ASCII characters correctly.

 * Search interface of "gitweb" did not show multiple matches in the same file
   correctly.

Also contains minor fixes and documentation updates.
