Autogenerated HTML docs for v1.7.7-rc2-4-g5ec82
[git/jnareb-git.git] / technical / api-merge.html
blobde3829f2a8457dcd059f67e30d89282e92afc876
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
4 <head>
5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6 <meta name="generator" content="AsciiDoc 8.5.2" />
7 <title>merge API</title>
8 <style type="text/css">
9 /* Debug borders */
10 p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
12 border: 1px solid red;
16 body {
17 margin: 1em 5% 1em 5%;
20 a {
21 color: blue;
22 text-decoration: underline;
24 a:visited {
25 color: fuchsia;
28 em {
29 font-style: italic;
30 color: navy;
33 strong {
34 font-weight: bold;
35 color: #083194;
38 tt {
39 color: navy;
42 h1, h2, h3, h4, h5, h6 {
43 color: #527bbd;
44 font-family: sans-serif;
45 margin-top: 1.2em;
46 margin-bottom: 0.5em;
47 line-height: 1.3;
50 h1, h2, h3 {
51 border-bottom: 2px solid silver;
53 h2 {
54 padding-top: 0.5em;
56 h3 {
57 float: left;
59 h3 + * {
60 clear: left;
63 div.sectionbody {
64 font-family: serif;
65 margin-left: 0;
68 hr {
69 border: 1px solid silver;
72 p {
73 margin-top: 0.5em;
74 margin-bottom: 0.5em;
77 ul, ol, li > p {
78 margin-top: 0;
81 pre {
82 padding: 0;
83 margin: 0;
86 span#author {
87 color: #527bbd;
88 font-family: sans-serif;
89 font-weight: bold;
90 font-size: 1.1em;
92 span#email {
94 span#revnumber, span#revdate, span#revremark {
95 font-family: sans-serif;
98 div#footer {
99 font-family: sans-serif;
100 font-size: small;
101 border-top: 2px solid silver;
102 padding-top: 0.5em;
103 margin-top: 4.0em;
105 div#footer-text {
106 float: left;
107 padding-bottom: 0.5em;
109 div#footer-badges {
110 float: right;
111 padding-bottom: 0.5em;
114 div#preamble {
115 margin-top: 1.5em;
116 margin-bottom: 1.5em;
118 div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
119 div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
120 div.admonitionblock {
121 margin-top: 1.0em;
122 margin-bottom: 1.5em;
124 div.admonitionblock {
125 margin-top: 2.0em;
126 margin-bottom: 2.0em;
127 margin-right: 10%;
128 color: #606060;
131 div.content { /* Block element content. */
132 padding: 0;
135 /* Block element titles. */
136 div.title, caption.title {
137 color: #527bbd;
138 font-family: sans-serif;
139 font-weight: bold;
140 text-align: left;
141 margin-top: 1.0em;
142 margin-bottom: 0.5em;
144 div.title + * {
145 margin-top: 0;
148 td div.title:first-child {
149 margin-top: 0.0em;
151 div.content div.title:first-child {
152 margin-top: 0.0em;
154 div.content + div.title {
155 margin-top: 0.0em;
158 div.sidebarblock > div.content {
159 background: #ffffee;
160 border: 1px solid silver;
161 padding: 0.5em;
164 div.listingblock > div.content {
165 border: 1px solid silver;
166 background: #f4f4f4;
167 padding: 0.5em;
170 div.quoteblock, div.verseblock {
171 padding-left: 1.0em;
172 margin-left: 1.0em;
173 margin-right: 10%;
174 border-left: 5px solid #dddddd;
175 color: #777777;
178 div.quoteblock > div.attribution {
179 padding-top: 0.5em;
180 text-align: right;
183 div.verseblock > div.content {
184 white-space: pre;
186 div.verseblock > div.attribution {
187 padding-top: 0.75em;
188 text-align: left;
190 /* DEPRECATED: Pre version 8.2.7 verse style literal block. */
191 div.verseblock + div.attribution {
192 text-align: left;
195 div.admonitionblock .icon {
196 vertical-align: top;
197 font-size: 1.1em;
198 font-weight: bold;
199 text-decoration: underline;
200 color: #527bbd;
201 padding-right: 0.5em;
203 div.admonitionblock td.content {
204 padding-left: 0.5em;
205 border-left: 3px solid #dddddd;
208 div.exampleblock > div.content {
209 border-left: 3px solid #dddddd;
210 padding-left: 0.5em;
213 div.imageblock div.content { padding-left: 0; }
214 span.image img { border-style: none; }
215 a.image:visited { color: white; }
217 dl {
218 margin-top: 0.8em;
219 margin-bottom: 0.8em;
221 dt {
222 margin-top: 0.5em;
223 margin-bottom: 0;
224 font-style: normal;
225 color: navy;
227 dd > *:first-child {
228 margin-top: 0.1em;
231 ul, ol {
232 list-style-position: outside;
234 ol.arabic {
235 list-style-type: decimal;
237 ol.loweralpha {
238 list-style-type: lower-alpha;
240 ol.upperalpha {
241 list-style-type: upper-alpha;
243 ol.lowerroman {
244 list-style-type: lower-roman;
246 ol.upperroman {
247 list-style-type: upper-roman;
250 div.compact ul, div.compact ol,
251 div.compact p, div.compact p,
252 div.compact div, div.compact div {
253 margin-top: 0.1em;
254 margin-bottom: 0.1em;
257 div.tableblock > table {
258 border: 3px solid #527bbd;
260 thead, p.table.header {
261 font-family: sans-serif;
262 font-weight: bold;
264 tfoot {
265 font-weight: bold;
267 td > div.verse {
268 white-space: pre;
270 p.table {
271 margin-top: 0;
273 /* Because the table frame attribute is overriden by CSS in most browsers. */
274 div.tableblock > table[frame="void"] {
275 border-style: none;
277 div.tableblock > table[frame="hsides"] {
278 border-left-style: none;
279 border-right-style: none;
281 div.tableblock > table[frame="vsides"] {
282 border-top-style: none;
283 border-bottom-style: none;
287 div.hdlist {
288 margin-top: 0.8em;
289 margin-bottom: 0.8em;
291 div.hdlist tr {
292 padding-bottom: 15px;
294 dt.hdlist1.strong, td.hdlist1.strong {
295 font-weight: bold;
297 td.hdlist1 {
298 vertical-align: top;
299 font-style: normal;
300 padding-right: 0.8em;
301 color: navy;
303 td.hdlist2 {
304 vertical-align: top;
306 div.hdlist.compact tr {
307 margin: 0;
308 padding-bottom: 0;
311 .comment {
312 background: yellow;
315 .footnote, .footnoteref {
316 font-size: 0.8em;
319 span.footnote, span.footnoteref {
320 vertical-align: super;
323 #footnotes {
324 margin: 20px 0 20px 0;
325 padding: 7px 0 0 0;
328 #footnotes div.footnote {
329 margin: 0 0 5px 0;
332 #footnotes hr {
333 border: none;
334 border-top: 1px solid silver;
335 height: 1px;
336 text-align: left;
337 margin-left: 0;
338 width: 20%;
339 min-width: 100px;
343 @media print {
344 div#footer-badges { display: none; }
347 div#toc {
348 margin-bottom: 2.5em;
351 div#toctitle {
352 color: #527bbd;
353 font-family: sans-serif;
354 font-size: 1.1em;
355 font-weight: bold;
356 margin-top: 1.0em;
357 margin-bottom: 0.1em;
360 div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
361 margin-top: 0;
362 margin-bottom: 0;
364 div.toclevel2 {
365 margin-left: 2em;
366 font-size: 0.9em;
368 div.toclevel3 {
369 margin-left: 4em;
370 font-size: 0.9em;
372 div.toclevel4 {
373 margin-left: 6em;
374 font-size: 0.9em;
376 /* Workarounds for IE6's broken and incomplete CSS2. */
378 div.sidebar-content {
379 background: #ffffee;
380 border: 1px solid silver;
381 padding: 0.5em;
383 div.sidebar-title, div.image-title {
384 color: #527bbd;
385 font-family: sans-serif;
386 font-weight: bold;
387 margin-top: 0.0em;
388 margin-bottom: 0.5em;
391 div.listingblock div.content {
392 border: 1px solid silver;
393 background: #f4f4f4;
394 padding: 0.5em;
397 div.quoteblock-attribution {
398 padding-top: 0.5em;
399 text-align: right;
402 div.verseblock-content {
403 white-space: pre;
405 div.verseblock-attribution {
406 padding-top: 0.75em;
407 text-align: left;
410 div.exampleblock-content {
411 border-left: 3px solid #dddddd;
412 padding-left: 0.5em;
415 /* IE6 sets dynamically generated links as visited. */
416 div#toc a:visited { color: blue; }
417 </style>
418 <script type="text/javascript">
419 /*<![CDATA[*/
420 window.onload = function(){asciidoc.footnotes();}
421 var asciidoc = { // Namespace.
423 /////////////////////////////////////////////////////////////////////
424 // Table Of Contents generator
425 /////////////////////////////////////////////////////////////////////
427 /* Author: Mihai Bazon, September 2002
428 * http://students.infoiasi.ro/~mishoo
430 * Table Of Content generator
431 * Version: 0.4
433 * Feel free to use this script under the terms of the GNU General Public
434 * License, as long as you do not remove or alter this notice.
437 /* modified by Troy D. Hanson, September 2006. License: GPL */
438 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
440 // toclevels = 1..4.
441 toc: function (toclevels) {
443 function getText(el) {
444 var text = "";
445 for (var i = el.firstChild; i != null; i = i.nextSibling) {
446 if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
447 text += i.data;
448 else if (i.firstChild != null)
449 text += getText(i);
451 return text;
454 function TocEntry(el, text, toclevel) {
455 this.element = el;
456 this.text = text;
457 this.toclevel = toclevel;
460 function tocEntries(el, toclevels) {
461 var result = new Array;
462 var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
463 // Function that scans the DOM tree for header elements (the DOM2
464 // nodeIterator API would be a better technique but not supported by all
465 // browsers).
466 var iterate = function (el) {
467 for (var i = el.firstChild; i != null; i = i.nextSibling) {
468 if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
469 var mo = re.exec(i.tagName);
470 if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
471 result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
473 iterate(i);
477 iterate(el);
478 return result;
481 var toc = document.getElementById("toc");
482 var entries = tocEntries(document.getElementById("content"), toclevels);
483 for (var i = 0; i < entries.length; ++i) {
484 var entry = entries[i];
485 if (entry.element.id == "")
486 entry.element.id = "_toc_" + i;
487 var a = document.createElement("a");
488 a.href = "#" + entry.element.id;
489 a.appendChild(document.createTextNode(entry.text));
490 var div = document.createElement("div");
491 div.appendChild(a);
492 div.className = "toclevel" + entry.toclevel;
493 toc.appendChild(div);
495 if (entries.length == 0)
496 toc.parentNode.removeChild(toc);
500 /////////////////////////////////////////////////////////////////////
501 // Footnotes generator
502 /////////////////////////////////////////////////////////////////////
504 /* Based on footnote generation code from:
505 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
508 footnotes: function () {
509 var cont = document.getElementById("content");
510 var noteholder = document.getElementById("footnotes");
511 var spans = cont.getElementsByTagName("span");
512 var refs = {};
513 var n = 0;
514 for (i=0; i<spans.length; i++) {
515 if (spans[i].className == "footnote") {
516 n++;
517 // Use [\s\S] in place of . so multi-line matches work.
518 // Because JavaScript has no s (dotall) regex flag.
519 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
520 noteholder.innerHTML +=
521 "<div class='footnote' id='_footnote_" + n + "'>" +
522 "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
523 n + "</a>. " + note + "</div>";
524 spans[i].innerHTML =
525 "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
526 "' title='View footnote' class='footnote'>" + n + "</a>]";
527 var id =spans[i].getAttribute("id");
528 if (id != null) refs["#"+id] = n;
531 if (n == 0)
532 noteholder.parentNode.removeChild(noteholder);
533 else {
534 // Process footnoterefs.
535 for (i=0; i<spans.length; i++) {
536 if (spans[i].className == "footnoteref") {
537 var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
538 href = href.match(/#.*/)[0]; // Because IE return full URL.
539 n = refs[href];
540 spans[i].innerHTML =
541 "[<a href='#_footnote_" + n +
542 "' title='View footnote' class='footnote'>" + n + "</a>]";
549 /*]]>*/
550 </script>
551 </head>
552 <body>
553 <div id="header">
554 <h1>merge API</h1>
555 </div>
556 <div id="content">
557 <div id="preamble">
558 <div class="sectionbody">
559 <div class="paragraph"><p>The merge API helps a program to reconcile two competing sets of
560 improvements to some files (e.g., unregistered changes from the work
561 tree versus changes involved in switching to a new branch), reporting
562 conflicts if found. The library called through this API is
563 responsible for a few things.</p></div>
564 <div class="ulist"><ul>
565 <li>
567 determining which trees to merge (recursive ancestor consolidation);
568 </p>
569 </li>
570 <li>
572 lining up corresponding files in the trees to be merged (rename
573 detection, subtree shifting), reporting edge cases like add/add
574 and rename/rename conflicts to the user;
575 </p>
576 </li>
577 <li>
579 performing a three-way merge of corresponding files, taking
580 path-specific merge drivers (specified in <tt>.gitattributes</tt>)
581 into account.
582 </p>
583 </li>
584 </ul></div>
585 </div>
586 </div>
587 <h2 id="_data_structures">Data structures</h2>
588 <div class="sectionbody">
589 <div class="ulist"><ul>
590 <li>
592 <tt>mmbuffer_t</tt>, <tt>mmfile_t</tt>
593 </p>
594 </li>
595 </ul></div>
596 <div class="paragraph"><p>These store data usable for use by the xdiff backend, for writing and
597 for reading, respectively. See <tt>xdiff/xdiff.h</tt> for the definitions
598 and <tt>diff.c</tt> for examples.</p></div>
599 <div class="ulist"><ul>
600 <li>
602 <tt>struct ll_merge_options</tt>
603 </p>
604 </li>
605 </ul></div>
606 <div class="paragraph"><p>This describes the set of options the calling program wants to affect
607 the operation of a low-level (single file) merge. Some options:</p></div>
608 <div class="dlist"><dl>
609 <dt class="hdlist1">
610 <tt>virtual_ancestor</tt>
611 </dt>
612 <dd>
614 Behave as though this were part of a merge between common
615 ancestors in a recursive merge.
616 If a helper program is specified by the
617 <tt>[merge "&lt;driver&gt;"] recursive</tt> configuration, it will
618 be used (see <a href="gitattributes.html">gitattributes(5)</a>).
619 </p>
620 </dd>
621 <dt class="hdlist1">
622 <tt>variant</tt>
623 </dt>
624 <dd>
626 Resolve local conflicts automatically in favor
627 of one side or the other (as in <em>git merge-file</em>
628 <tt>--ours</tt>/<tt>--theirs</tt>/<tt>--union</tt>). Can be <tt>0</tt>,
629 <tt>XDL_MERGE_FAVOR_OURS</tt>, <tt>XDL_MERGE_FAVOR_THEIRS</tt>, or
630 <tt>XDL_MERGE_FAVOR_UNION</tt>.
631 </p>
632 </dd>
633 <dt class="hdlist1">
634 <tt>renormalize</tt>
635 </dt>
636 <dd>
638 Resmudge and clean the "base", "theirs" and "ours" files
639 before merging. Use this when the merge is likely to have
640 overlapped with a change in smudge/clean or end-of-line
641 normalization rules.
642 </p>
643 </dd>
644 </dl></div>
645 </div>
646 <h2 id="_low_level_single_file_merge">Low-level (single file) merge</h2>
647 <div class="sectionbody">
648 <div class="dlist"><dl>
649 <dt class="hdlist1">
650 <tt>ll_merge</tt>
651 </dt>
652 <dd>
654 Perform a three-way single-file merge in core. This is
655 a thin wrapper around <tt>xdl_merge</tt> that takes the path and
656 any merge backend specified in <tt>.gitattributes</tt> or
657 <tt>.git/info/attributes</tt> into account. Returns 0 for a
658 clean merge.
659 </p>
660 </dd>
661 </dl></div>
662 <div class="paragraph"><p>Calling sequence:</p></div>
663 <div class="ulist"><ul>
664 <li>
666 Prepare a <tt>struct ll_merge_options</tt> to record options.
667 If you have no special requests, skip this and pass <tt>NULL</tt>
668 as the <tt>opts</tt> parameter to use the default options.
669 </p>
670 </li>
671 <li>
673 Allocate an mmbuffer_t variable for the result.
674 </p>
675 </li>
676 <li>
678 Allocate and fill variables with the file&#8217;s original content
679 and two modified versions (using <tt>read_mmfile</tt>, for example).
680 </p>
681 </li>
682 <li>
684 Call <tt>ll_merge()</tt>.
685 </p>
686 </li>
687 <li>
689 Read the merged content from <tt>result_buf.ptr</tt> and <tt>result_buf.size</tt>.
690 </p>
691 </li>
692 <li>
694 Release buffers when finished. A simple
695 <tt>free(ancestor.ptr); free(ours.ptr); free(theirs.ptr);
696 free(result_buf.ptr);</tt> will do.
697 </p>
698 </li>
699 </ul></div>
700 <div class="paragraph"><p>If the modifications do not merge cleanly, <tt>ll_merge</tt> will return a
701 nonzero value and <tt>result_buf</tt> will generally include a description of
702 the conflict bracketed by markers such as the traditional <tt>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</tt>
703 and <tt>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</tt>.</p></div>
704 <div class="paragraph"><p>The <tt>ancestor_label</tt>, <tt>our_label</tt>, and <tt>their_label</tt> parameters are
705 used to label the different sides of a conflict if the merge driver
706 supports this.</p></div>
707 </div>
708 <h2 id="_everything_else">Everything else</h2>
709 <div class="sectionbody">
710 <div class="paragraph"><p>Talk about &lt;merge-recursive.h&gt; and merge_file():</p></div>
711 <div class="ulist"><ul>
712 <li>
714 merge_trees() to merge with rename detection
715 </p>
716 </li>
717 <li>
719 merge_recursive() for ancestor consolidation
720 </p>
721 </li>
722 <li>
724 try_merge_command() for other strategies
725 </p>
726 </li>
727 <li>
729 conflict format
730 </p>
731 </li>
732 <li>
734 merge options
735 </p>
736 </li>
737 </ul></div>
738 <div class="paragraph"><p>(Daniel, Miklos, Stephan, JC)</p></div>
739 </div>
740 </div>
741 <div id="footnotes"><hr /></div>
742 <div id="footer">
743 <div id="footer-text">
744 Last updated 2011-09-21 23:01:14 PDT
745 </div>
746 </div>
747 </body>
748 </html>