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 `diff_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 abbreviate 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 postimage 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 presence 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)
