Jeff King e54501004a diff: do not use null sha1 as a sentinel value
The diff code represents paths using the diff_filespec
struct. This struct has a sha1 to represent the sha1 of the
content at that path, as well as a sha1_valid member which
indicates whether its sha1 field is actually useful. If
sha1_valid is not true, then the filespec represents a
working tree file (e.g., for the no-index case, or for when
the index is not up-to-date).

The diff_filespec is only used internally, though. At the
interfaces to the diff subsystem, callers feed the sha1
directly, and we create a diff_filespec from it. It's at
that point that we look at the sha1 and decide whether it is
valid or not; callers may pass the null sha1 as a sentinel
value to indicate that it is not.

We should not typically see the null sha1 coming from any
other source (e.g., in the index itself, or from a tree).
However, a corrupt tree might have a null sha1, which would
cause "diff --patch" to accidentally diff the working tree
version of a file instead of treating it as a blob.

This patch extends the edges of the diff interface to accept
a "sha1_valid" flag whenever we accept a sha1, and to use
that flag when creating a filespec. In some cases, this
means passing the flag through several layers, making the
code change larger than would be desirable.

One alternative would be to simply die() upon seeing
corrupted trees with null sha1s. However, this fix more
directly addresses the problem (while bogus sha1s in a tree
are probably a bad thing, it is really the sentinel
confusion sending us down the wrong code path that is what
makes it devastating). And it means that git is more capable
of examining and debugging these corrupted trees. For
example, you can still "diff --raw" such a tree to find out
when the bogus entry was introduced; you just cannot do a
"--patch" diff (just as you could not with any other
corrupted tree, as we do not have any content to diff).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-07-29 15:04:32 -07:00
2012-04-26 10:23:15 -07:00
2012-01-03 13:48:00 -08:00
2011-12-19 16:05:20 -08:00
2011-12-22 11:21:26 -08:00
2011-03-17 15:30:49 -07:00
2011-12-13 22:53:08 -08:00
2012-04-26 10:22:20 -07:00
2011-10-21 16:04:32 -07:00
2012-01-06 12:44:07 -08:00
2012-01-06 12:44:07 -08:00
2012-02-10 12:53:55 -08:00
2011-10-07 15:46:14 -07:00
2011-05-26 16:47:15 -07:00
2011-12-16 22:33:40 -08:00
2011-08-11 12:21:07 -07:00
2011-09-19 20:46:48 -07:00
2011-04-28 14:11:39 -07:00
2012-04-26 10:23:15 -07:00
2012-01-08 15:07:20 -08:00
2012-02-26 16:42:35 -08:00
2011-12-19 16:06:41 -08:00
2011-12-19 16:06:41 -08:00
2012-02-05 23:53:21 -08:00
2011-08-20 22:33:57 -07:00
2011-05-19 18:23:17 -07:00
2012-01-06 12:44:07 -08:00
2011-12-19 16:05:20 -08:00
2012-01-06 12:44:07 -08:00
2012-01-06 12:44:07 -08:00
2011-08-22 10:07:07 -07:00
2011-11-06 20:31:28 -08:00
2011-12-16 22:33:40 -08:00
2011-09-28 12:46:21 -07:00
2012-01-06 12:44:07 -08:00
2011-12-12 16:09:38 -08:00
2011-11-07 22:12:19 -08:00
2011-12-20 13:25:53 -08:00
2012-04-26 10:14:45 -07:00
2011-10-26 16:16:29 -07:00
2011-05-30 00:09:55 -07:00
2011-11-12 22:27:38 -08:00
2011-08-01 15:00:29 -07:00
2011-05-26 16:47:15 -07:00
2011-12-11 23:16:24 -08:00
2011-03-22 11:43:27 -07:00
2011-03-22 10:16:54 -07:00
2011-03-22 10:16:54 -07:00
2011-12-11 23:16:25 -08:00
2011-10-17 21:37:15 -07:00
2011-05-26 13:54:18 -07:00

////////////////////////////////////////////////////////////////

	GIT - the stupid content tracker

////////////////////////////////////////////////////////////////

"git" can mean anything, depending on your mood.

 - random three-letter combination that is pronounceable, and not
   actually used by any common UNIX command.  The fact that it is a
   mispronunciation of "get" may or may not be relevant.
 - stupid. contemptible and despicable. simple. Take your pick from the
   dictionary of slang.
 - "global information tracker": you're in a good mood, and it actually
   works for you. Angels sing, and a light suddenly fills the room.
 - "goddamn idiotic truckload of sh*t": when it breaks

Git is a fast, scalable, distributed revision control system with an
unusually rich command set that provides both high-level operations
and full access to internals.

Git is an Open Source project covered by the GNU General Public License.
It was originally written by Linus Torvalds with help of a group of
hackers around the net. It is currently maintained by Junio C Hamano.

Please read the file INSTALL for installation instructions.

See Documentation/gittutorial.txt to get started, then see
Documentation/everyday.txt for a useful minimum set of commands, and
Documentation/git-commandname.txt for documentation of each command.
If git has been correctly installed, then the tutorial can also be
read with "man gittutorial" or "git help tutorial", and the
documentation of each command with "man git-commandname" or "git help
commandname".

CVS users may also want to read Documentation/gitcvs-migration.txt
("man gitcvs-migration" or "git help cvs-migration" if git is
installed).

Many Git online resources are accessible from http://git-scm.com/
including full documentation and Git related tools.

The user discussion and development of Git take place on the Git
mailing list -- everyone is welcome to post bug reports, feature
requests, comments and patches to git@vger.kernel.org (read
Documentation/SubmittingPatches for instructions on patch submission).
To subscribe to the list, send an email with just "subscribe git" in
the body to majordomo@vger.kernel.org. The mailing list archives are
available at http://marc.theaimsgroup.com/?l=git and other archival
sites.

The messages titled "A note from the maintainer", "What's in
git.git (stable)" and "What's cooking in git.git (topics)" and
the discussion following them on the mailing list give a good
reference for project status, development direction and
remaining tasks.
Description
No description provided
Readme 235 MiB
Languages
C 50.1%
Shell 38.4%
Perl 5.1%
Tcl 3.3%
Python 0.8%
Other 2%