read-cache.c: write prefix-compressed names in the index

Teach the code to write the index in the v4 on-disk format.

Record the format version of the on-disk index we read from in the
index_state, and use the format when writing the new index out.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
update-index: upgrade/downgrade on-disk index version

With the "--index-version <n>" parameter, write the index out in the
specified version.  With this, an index file that is written in newer
format (say v4) can be downgraded to be read by older versions of Git.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
add -p: skip conflicted paths

On Mon, Apr 02, 2012 at 11:25:33AM -0700, Junio C Hamano wrote:

> >> I like that we are down to a single ls-files invocation here. But can't
> >> we determine from the diff-files output whether an entry is unmerged. In
> >> my simple tests, I see that --numstat will show two lines for such an
> >> entry. Is that reliable?
> >
> > Nice. I've observed the same thing (although I've seen three entries,
> > not two). I don't know about the reliability, but I think it kind of
> > makes sense; one entry for both parents, and one for the unmerged
> > working-copy version.
>
> Should I be dissappointed, or should I be happy for seeing "division of
> labor" working?

The latter. I suspected something similar when writing my original
message, but didn't think too hard about it. Thanks for clarifying.

I do still think it would be nicer to pass the information out to the
caller instead of just filtering. So combining the two patches, we have
something like:
snap
fixup from rctay
difftool: teach difftool to handle directory diffs

When 'difftool' is called to compare a range of commits that modify
more than one file, it opens a separate instance of the diff tool for
each file that changed.

The new '--dir-diff' option copies all the modified files to a temporary
location and runs a directory diff on them in a single instance of the
diff tool.

Signed-off-by: Tim Henigan <tim.henigan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
difftool: print list of valid tools with '--tool-help'

Since bc7a96a (mergetool--lib: Refactor tools into separate files,
2011-08-18), it is possible to add a new diff tool by creating a simple
script in the '$(git --exec-path)/mergetools' directory.  Updating the
difftool help text is still a manual process, and the documentation can
easily go out of sync.

This commit teaches difftool the '--tool-help' option, which:
  - Reads the list of valid tools from 'mergetools/*'
  - Determines which of them are actually installed
  - Determines which are capable of diffing (i.e. not just a merge tool)
  - Prints the resulting list for the user

Signed-off-by: Tim Henigan <tim.henigan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Merge branch 'jk/diff-no-rename-empty' into pu

Forbids rename detection logic from matching two empty files as renames
during merge-recursive to prevent mismerges.

* jk/diff-no-rename-empty:
  merge-recursive: don't detect renames of empty files
  teach diffcore-rename to optionally ignore empty content
  make is_empty_blob_sha1 available everywhere
  drop casts from users EMPTY_TREE_SHA1_BIN
Merge branch 'rs/combine-diff-zero-context-at-the-beginning' into pu

Fixes an age old corner case bug in combine diff (only triggered with -U0
and the hunk at the beginning of the file needs to be shown).

* rs/combine-diff-zero-context-at-the-beginning:
  combine-diff: fix loop index underflow
Merge branch 'jc/commit-unedited-template' into pu

When "git commit --template F" errors out because the user did not touch
the message, it claimed that it aborts due to "empty message", which was
utterly wrong.

* jc/commit-unedited-template:
  Documentation/git-commit: rephrase the "initial-ness" of templates
  git-commit.txt: clarify -t requires editing message
  commit: rephrase the error when user did not touch templated log message
  commit: do not trigger bogus "has templated message edited" check
  t7501: test the right kind of breakage
Merge branch 'jk/http-backend-keep-committer-ident-env' into pu

The smart-http backend used to always override GIT_COMMITTER_* variables
with REMOTE_USER and REMOTE_ADDR.

* jk/http-backend-keep-committer-ident-env:
  http-backend: respect existing GIT_COMMITTER_* variables
Merge branch 'jc/push-upstream-sanity' into pu

"git push $there" without refspec, when the current branch is set to push
to a remote different from $there, used to push to $there using the
upstream information to a remote unreleated to $there.

This is necessary if we were to switch the push.default to 'current'.

* jc/push-upstream-sanity:
  [fixup] remove misguided "try to see if URLs are the same"
  push: detect nonsense "upstream" check more carefully
Merge branch 'jk/branch-quiet' into pu

Even with "-q"uiet option, "checkout" used to report setting up tracking.
Also "branch" learns "-q"uiet option to squelch informational message.

* jk/branch-quiet:
  teach "git branch" a --quiet option
  checkout: suppress tracking message with "-q"
Merge branch 'jc/run-hook-env-1' into pu

Not urgent.

Updates run_hook() API to be much less specific to "commit".  It would
only be useful if people start doing more interesting things with hooks.

* jc/run-hook-env-1:
  run_hook(): enhance the interface to pass arbitrary environment
Merge branch 'sl/autoconf' into pu

Updates our configure.ac to follow a better "autoconf" style.

* sl/autoconf:
  configure: be more idiomatic
  configure: avoid some code repetitions thanks to m4_{push,pop}def
  configure: move definitions of private m4 macros before AC_INIT invocation
Merge branch 'th/difftool-diffall' into pu

Rolls the two-directory-diff logic from diffall script (in contrib/) into
"git difftool" framework.

* th/difftool-diffall:
  difftool: print list of valid tools with '--tool-help'
  difftool: teach difftool to handle directory diffs
  difftool: eliminate setup_environment function
  difftool: stop appending '.exe' to git
  difftool: remove explicit change of PATH
  difftool: exit(0) when usage is printed
  difftool: add '--no-gui' option
  difftool: parse options using Getopt::Long
Merge branch 'jb/am-include' into pu

* jb/am-include:
  am: support --include option
Merge branch 'jc/am-report-3way' into pu

* jc/am-report-3way:
  am -3: list the paths that needed 3-way fallback
Merge branch 'jc/fmt-merge-msg-people' into pu

The "fmt-merge-msg" command learns to list the primary contributors
involved in the side topic you are merging.

Will defer til 1.7.10.

* jc/fmt-merge-msg-people:
  fmt-merge-msg: show those involved in a merged series
Merge branch 'jk/run-command-eacces' into pu

When PATH contains an unreadable directory, alias expansion code did not
kick in, and failed with an error that said "git-subcmd" was not found.

* jk/run-command-eacces:
  run-command: treat inaccessible directories as ENOENT