|  | merge API | 
|  | ========= | 
|  |  | 
|  | The merge API helps a program to reconcile two competing sets of | 
|  | improvements to some files (e.g., unregistered changes from the work | 
|  | tree versus changes involved in switching to a new branch), reporting | 
|  | conflicts if found. The library called through this API is | 
|  | responsible for a few things. | 
|  |  | 
|  | * determining which trees to merge (recursive ancestor consolidation); | 
|  |  | 
|  | * lining up corresponding files in the trees to be merged (rename | 
|  | detection, subtree shifting), reporting edge cases like add/add | 
|  | and rename/rename conflicts to the user; | 
|  |  | 
|  | * performing a three-way merge of corresponding files, taking | 
|  | path-specific merge drivers (specified in `.gitattributes`) | 
|  | into account. | 
|  |  | 
|  | Data structures | 
|  | --------------- | 
|  |  | 
|  | * `mmbuffer_t`, `mmfile_t` | 
|  |  | 
|  | These store data usable for use by the xdiff backend, for writing and | 
|  | for reading, respectively. See `xdiff/xdiff.h` for the definitions | 
|  | and `diff.c` for examples. | 
|  |  | 
|  | * `struct ll_merge_options` | 
|  |  | 
|  | This describes the set of options the calling program wants to affect | 
|  | the operation of a low-level (single file) merge. Some options: | 
|  |  | 
|  | `virtual_ancestor`:: | 
|  | Behave as though this were part of a merge between common | 
|  | ancestors in a recursive merge. | 
|  | If a helper program is specified by the | 
|  | `[merge "<driver>"] recursive` configuration, it will | 
|  | be used (see linkgit:gitattributes[5]). | 
|  |  | 
|  | `variant`:: | 
|  | Resolve local conflicts automatically in favor | 
|  | of one side or the other (as in 'git merge-file' | 
|  | `--ours`/`--theirs`/`--union`). Can be `0`, | 
|  | `XDL_MERGE_FAVOR_OURS`, `XDL_MERGE_FAVOR_THEIRS`, or | 
|  | `XDL_MERGE_FAVOR_UNION`. | 
|  |  | 
|  | `renormalize`:: | 
|  | Resmudge and clean the "base", "theirs" and "ours" files | 
|  | before merging. Use this when the merge is likely to have | 
|  | overlapped with a change in smudge/clean or end-of-line | 
|  | normalization rules. | 
|  |  | 
|  | Low-level (single file) merge | 
|  | ----------------------------- | 
|  |  | 
|  | `ll_merge`:: | 
|  |  | 
|  | Perform a three-way single-file merge in core. This is | 
|  | a thin wrapper around `xdl_merge` that takes the path and | 
|  | any merge backend specified in `.gitattributes` or | 
|  | `.git/info/attributes` into account. Returns 0 for a | 
|  | clean merge. | 
|  |  | 
|  | Calling sequence: | 
|  |  | 
|  | * Prepare a `struct ll_merge_options` to record options. | 
|  | If you have no special requests, skip this and pass `NULL` | 
|  | as the `opts` parameter to use the default options. | 
|  |  | 
|  | * Allocate an mmbuffer_t variable for the result. | 
|  |  | 
|  | * Allocate and fill variables with the file's original content | 
|  | and two modified versions (using `read_mmfile`, for example). | 
|  |  | 
|  | * Call `ll_merge()`. | 
|  |  | 
|  | * Read the merged content from `result_buf.ptr` and `result_buf.size`. | 
|  |  | 
|  | * Release buffers when finished. A simple | 
|  | `free(ancestor.ptr); free(ours.ptr); free(theirs.ptr); | 
|  | free(result_buf.ptr);` will do. | 
|  |  | 
|  | If the modifications do not merge cleanly, `ll_merge` will return a | 
|  | nonzero value and `result_buf` will generally include a description of | 
|  | the conflict bracketed by markers such as the traditional `<<<<<<<` | 
|  | and `>>>>>>>`. | 
|  |  | 
|  | The `ancestor_label`, `our_label`, and `their_label` parameters are | 
|  | used to label the different sides of a conflict if the merge driver | 
|  | supports this. | 
|  |  | 
|  | Everything else | 
|  | --------------- | 
|  |  | 
|  | Talk about <merge-recursive.h> and merge_file(): | 
|  |  | 
|  | - merge_trees() to merge with rename detection | 
|  | - merge_recursive() for ancestor consolidation | 
|  | - try_merge_command() for other strategies | 
|  | - conflict format | 
|  | - merge options | 
|  |  | 
|  | (Daniel, Miklos, Stephan, JC) |