]>
Commit | Line | Data |
---|---|---|
525ab639 JH |
1 | /* |
2 | * Low level 3-way in-core file merge. | |
3 | */ | |
4 | ||
5 | #ifndef LL_MERGE_H | |
6 | #define LL_MERGE_H | |
7 | ||
ef3ca954 EN |
8 | #include "xdiff/xdiff.h" |
9 | ||
d3d7172e HW |
10 | /** |
11 | * | |
12 | * Calling sequence: | |
13 | * ---------------- | |
14 | * | |
15 | * - Prepare a `struct ll_merge_options` to record options. | |
16 | * If you have no special requests, skip this and pass `NULL` | |
17 | * as the `opts` parameter to use the default options. | |
18 | * | |
19 | * - Allocate an mmbuffer_t variable for the result. | |
20 | * | |
21 | * - Allocate and fill variables with the file's original content | |
22 | * and two modified versions (using `read_mmfile`, for example). | |
23 | * | |
24 | * - Call `ll_merge()`. | |
25 | * | |
26 | * - Read the merged content from `result_buf.ptr` and `result_buf.size`. | |
27 | * | |
28 | * - Release buffers when finished. A simple | |
29 | * `free(ancestor.ptr); free(ours.ptr); free(theirs.ptr); | |
30 | * free(result_buf.ptr);` will do. | |
31 | * | |
32 | * If the modifications do not merge cleanly, `ll_merge` will return a | |
33 | * nonzero value and `result_buf` will generally include a description of | |
34 | * the conflict bracketed by markers such as the traditional `<<<<<<<` | |
35 | * and `>>>>>>>`. | |
36 | * | |
37 | * The `ancestor_label`, `our_label`, and `their_label` parameters are | |
38 | * used to label the different sides of a conflict if the merge driver | |
39 | * supports this. | |
40 | */ | |
41 | ||
42 | ||
32eaa468 NTND |
43 | struct index_state; |
44 | ||
d3d7172e HW |
45 | /** |
46 | * This describes the set of options the calling program wants to affect | |
47 | * the operation of a low-level (single file) merge. | |
48 | */ | |
712516bc | 49 | struct ll_merge_options { |
d3d7172e HW |
50 | |
51 | /** | |
52 | * Behave as though this were part of a merge between common ancestors in | |
53 | * a recursive merge (merges of binary files may need to be handled | |
54 | * differently in such cases, for example). If a helper program is | |
55 | * specified by the `[merge "<driver>"] recursive` configuration, it will | |
56 | * be used. | |
57 | */ | |
712516bc | 58 | unsigned virtual_ancestor : 1; |
d3d7172e HW |
59 | |
60 | /** | |
61 | * Resolve local conflicts automatically in favor of one side or the other | |
62 | * (as in 'git merge-file' `--ours`/`--theirs`/`--union`). Can be `0`, | |
63 | * `XDL_MERGE_FAVOR_OURS`, `XDL_MERGE_FAVOR_THEIRS`, | |
64 | * or `XDL_MERGE_FAVOR_UNION`. | |
65 | */ | |
66 | unsigned variant : 2; | |
67 | ||
68 | /** | |
69 | * Resmudge and clean the "base", "theirs" and "ours" files before merging. | |
70 | * Use this when the merge is likely to have overlapped with a change in | |
71 | * smudge/clean or end-of-line normalization rules. | |
72 | */ | |
712516bc | 73 | unsigned renormalize : 1; |
d3d7172e HW |
74 | |
75 | /** | |
76 | * Increase the length of conflict markers so that nested conflicts | |
77 | * can be differentiated. | |
78 | */ | |
b2a7942b | 79 | unsigned extra_marker_size; |
d3d7172e HW |
80 | |
81 | /* Extra xpparam_t flags as defined in xdiff/xdiff.h. */ | |
58a1ece4 | 82 | long xdl_opts; |
712516bc | 83 | }; |
73cf7f71 | 84 | |
d3d7172e HW |
85 | /** |
86 | * Perform a three-way single-file merge in core. This is a thin wrapper | |
87 | * around `xdl_merge` that takes the path and any merge backend specified in | |
88 | * `.gitattributes` or `.git/info/attributes` into account. | |
89 | * Returns 0 for a clean merge. | |
90 | */ | |
525ab639 JH |
91 | int ll_merge(mmbuffer_t *result_buf, |
92 | const char *path, | |
f01de62e | 93 | mmfile_t *ancestor, const char *ancestor_label, |
525ab639 JH |
94 | mmfile_t *ours, const char *our_label, |
95 | mmfile_t *theirs, const char *their_label, | |
32eaa468 | 96 | struct index_state *istate, |
712516bc | 97 | const struct ll_merge_options *opts); |
525ab639 | 98 | |
32eaa468 | 99 | int ll_merge_marker_size(struct index_state *istate, const char *path); |
2c65d90f | 100 | void reset_merge_attributes(void); |
8588567c | 101 | |
525ab639 | 102 | #endif |