1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 package org.eclipse.jgit.merge;
46
47 import java.io.IOException;
48 import java.io.OutputStream;
49 import java.util.List;
50
51 import org.eclipse.jgit.diff.RawText;
52 import org.eclipse.jgit.merge.MergeChunk.ConflictState;
53
54 class MergeFormatterPass {
55
56 private final EolAwareOutputStream out;
57
58 private final MergeResult<RawText> res;
59
60 private final List<String> seqName;
61
62 private final String charsetName;
63
64 private final boolean threeWayMerge;
65
66 private String lastConflictingName;
67
68
69 MergeFormatterPass(OutputStream out, MergeResult<RawText> res, List<String> seqName,
70 String charsetName) {
71 this.out = new EolAwareOutputStream(out);
72 this.res = res;
73 this.seqName = seqName;
74 this.charsetName = charsetName;
75 this.threeWayMerge = (res.getSequences().size() == 3);
76 }
77
78 void formatMerge() throws IOException {
79 boolean missingNewlineAtEnd = false;
80 for (MergeChunk chunk : res) {
81 RawText seq = res.getSequences().get(chunk.getSequenceIndex());
82 writeConflictMetadata(chunk);
83
84 for (int i = chunk.getBegin(); i < chunk.getEnd(); i++)
85 writeLine(seq, i);
86 missingNewlineAtEnd = seq.isMissingNewlineAtEnd();
87 }
88
89
90 if (lastConflictingName != null)
91 writeConflictEnd();
92 if (!missingNewlineAtEnd)
93 out.beginln();
94 }
95
96 private void writeConflictMetadata(MergeChunk chunk) throws IOException {
97 if (lastConflictingName != null
98 && chunk.getConflictState() != ConflictState.NEXT_CONFLICTING_RANGE) {
99
100 writeConflictEnd();
101 }
102 if (chunk.getConflictState() == ConflictState.FIRST_CONFLICTING_RANGE) {
103
104 writeConflictStart(chunk);
105 } else if (chunk.getConflictState() == ConflictState.NEXT_CONFLICTING_RANGE) {
106
107 writeConflictChange(chunk);
108 }
109 }
110
111 private void writeConflictEnd() throws IOException {
112 writeln(">>>>>>> " + lastConflictingName);
113 lastConflictingName = null;
114 }
115
116 private void writeConflictStart(MergeChunk chunk) throws IOException {
117 lastConflictingName = seqName.get(chunk.getSequenceIndex());
118 writeln("<<<<<<< " + lastConflictingName);
119 }
120
121 private void writeConflictChange(MergeChunk chunk) throws IOException {
122
123
124
125
126
127
128
129 lastConflictingName = seqName.get(chunk.getSequenceIndex());
130 writeln(threeWayMerge ? "=======" : "======= "
131 + lastConflictingName);
132 }
133
134 private void writeln(String s) throws IOException {
135 out.beginln();
136 out.write((s + "\n").getBytes(charsetName));
137 }
138
139 private void writeLine(RawText seq, int i) throws IOException {
140 out.beginln();
141 seq.writeLine(out, i);
142
143 if (out.isBeginln())
144 out.write('\n');
145 }
146 }