diff API
========

The diff API is for programs that compare two sets of files (e.g. two
trees, one tree and the index) and present the found difference in
various ways.  The calling program is responsible for feeding the API
pairs of files, one from the "old" set and the corresponding one from
"new" set, that are different.  The library called through this API is
called diffcore, and is responsible for two things.

* finding total rewrites (`-B`), renames (`-M`) and copies (`-C`), and
  changes that touch a string (`-S`), as specified by the caller.

* outputting the differences in various formats, as specified by the
  caller.

Calling sequence
----------------

* Prepare `struct diff_options` to record the set of diff options, and
  then call `diff_setup()` to initialize this structure.  This sets up
  the vanilla default.

* Fill in the options structure to specify desired output format, rename
  detection, etc.  `diff_opt_parse()` can be used to parse options given
  from the command line in a way consistent with existing git-diff
  family of programs.

* Call `diff_setup_done()`; this inspects the options set up so far for
  internal consistency and make necessary tweaking to it (e.g. if
  textual patch output was asked, recursive behaviour is turned on).

* As you find different pairs of files, call `diff_change()` to feed
  modified files, `diff_addremove()` to feed created or deleted files,
  or `diff_unmerged()` to feed a file whose state is 'unmerged' to the
  API.  These are thin wrappers to a lower-level `diff_queue()` function
  that is flexible enough to record any of these kinds of changes.

* Once you finish feeding the pairs of files, call `diffcore_std()`.
  This will tell the diffcore library to go ahead and do its work.

* Calling `diffcore_flush()` will produce the output.


Data structures
---------------

* `struct diff_filespec`

This is the internal representation for a single file (blob).  It
records the blob object name (if known -- for a work tree file it
typically is a NUL SHA-1), filemode and pathname.  This is what the
`diff_addremove()`, `diff_change()` and `diff_unmerged()` synthesize and
feed `diff_queue()` function with.

* `struct diff_filepair`

This records a pair of `struct diff_filespec`; the filespec for a file
in the "old" set (i.e. preimage) is called `one`, and the filespec for a
file in the "new" set (i.e. postimage) is called `two`.  A change that
represents file creation has NULL in `one`, and file deletion has NULL
in `two`.

A `filepair` starts pointing at `one` and `two` that are from the same
filename, but `diffcore_std()` can break pairs and match component
filespecs with other filespecs from a different filepair to form new
filepair.  This is called 'rename detection'.

* `struct diff_queue`

This is a collection of filepairs.  Notable members are:

`queue`::

	An array of pointers to `struct diff_filepair`.  This
	dynamically grows as you add filepairs;

`alloc`::

	The allocated size of the `queue` array;

`nr`::

	The number of elements in the `queue` array.


* `struct diff_options`

This describes the set of options the calling program wants to affect
the operation of diffcore library with.

Notable members are:

`output_format`::
	The output format used when `diff_flush()` is run.

`context`::
	Number of context lines to generate in patch output.

`break_opt`, `detect_rename`, `rename-score`, `rename_limit`::
	Affects the way detection logic for complete rewrites, renames
	and copies.

`abbrev`::
	Number of hexdigits to abbrevate raw format output to.

`pickaxe`::
	A constant string (can and typically does contain newlines to
	look for a block of text, not just a single line) to filter out
	the filepairs that do not change the number of strings contained
	in its preimage and postmage of the diff_queue.

`flags`::
	This is mostly a collection of boolean options that affects the
	operation, but some do not have anything to do with the diffcore
	library.

BINARY, TEXT;;
	Affects the way how a file that is seemingly binary is treated.

FULL_INDEX;;
	Tells the patch output format not to use abbreviated object
	names on the "index" lines.

FIND_COPIES_HARDER;;
	Tells the diffcore library that the caller is feeding unchanged
	filepairs to allow copies from unmodified files be detected.

COLOR_DIFF;;
	Output should be colored.

COLOR_DIFF_WORDS;;
	Output is a colored word-diff.

NO_INDEX;;
	Tells diff-files that the input is not tracked files but files
	in random locations on the filesystem.

ALLOW_EXTERNAL;;
	Tells output routine that it is Ok to call user specified patch
	output routine.  Plumbing disables this to ensure stable output.

QUIET;;
	Do not show any output.

REVERSE_DIFF;;
	Tells the library that the calling program is feeding the
	filepairs reversed; `one` is two, and `two` is one.

EXIT_WITH_STATUS;;
	For communication between the calling program and the options
	parser; tell the calling program to signal the presense of
	difference using program exit code.

HAS_CHANGES;;
	Internal; used for optimization to see if there is any change.

SILENT_ON_REMOVE;;
	Affects if diff-files shows removed files.

RECURSIVE, TREE_IN_RECURSIVE;;
	Tells if tree traversal done by tree-diff should recursively
	descend into a tree object pair that are different in preimage
	and postimage set.

(JC)
