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