1
2
3
4
5
6
7
8
9
10
11 package org.eclipse.jgit.api;
12
13 import java.text.MessageFormat;
14 import java.util.HashMap;
15 import java.util.List;
16 import java.util.Map;
17
18 import org.eclipse.jgit.internal.JGitText;
19 import org.eclipse.jgit.lib.ObjectId;
20 import org.eclipse.jgit.merge.MergeChunk;
21 import org.eclipse.jgit.merge.MergeChunk.ConflictState;
22 import org.eclipse.jgit.merge.MergeStrategy;
23 import org.eclipse.jgit.merge.ResolveMerger.MergeFailureReason;
24
25
26
27
28 public class MergeResult {
29
30
31
32
33 public enum MergeStatus {
34
35 FAST_FORWARD {
36 @Override
37 public String toString() {
38 return "Fast-forward";
39 }
40
41 @Override
42 public boolean isSuccessful() {
43 return true;
44 }
45 },
46
47
48
49 FAST_FORWARD_SQUASHED {
50 @Override
51 public String toString() {
52 return "Fast-forward-squashed";
53 }
54
55 @Override
56 public boolean isSuccessful() {
57 return true;
58 }
59 },
60
61 ALREADY_UP_TO_DATE {
62 @Override
63 public String toString() {
64 return "Already-up-to-date";
65 }
66
67 @Override
68 public boolean isSuccessful() {
69 return true;
70 }
71 },
72
73 FAILED {
74 @Override
75 public String toString() {
76 return "Failed";
77 }
78
79 @Override
80 public boolean isSuccessful() {
81 return false;
82 }
83 },
84
85 MERGED {
86 @Override
87 public String toString() {
88 return "Merged";
89 }
90
91 @Override
92 public boolean isSuccessful() {
93 return true;
94 }
95 },
96
97
98
99 MERGED_SQUASHED {
100 @Override
101 public String toString() {
102 return "Merged-squashed";
103 }
104
105 @Override
106 public boolean isSuccessful() {
107 return true;
108 }
109 },
110
111
112
113 MERGED_SQUASHED_NOT_COMMITTED {
114 @Override
115 public String toString() {
116 return "Merged-squashed-not-committed";
117 }
118
119 @Override
120 public boolean isSuccessful() {
121 return true;
122 }
123 },
124
125 CONFLICTING {
126 @Override
127 public String toString() {
128 return "Conflicting";
129 }
130
131 @Override
132 public boolean isSuccessful() {
133 return false;
134 }
135 },
136
137
138
139 ABORTED {
140 @Override
141 public String toString() {
142 return "Aborted";
143 }
144
145 @Override
146 public boolean isSuccessful() {
147 return false;
148 }
149 },
150
151
152
153 MERGED_NOT_COMMITTED {
154 @Override
155 public String toString() {
156 return "Merged-not-committed";
157 }
158
159 @Override
160 public boolean isSuccessful() {
161 return true;
162 }
163 },
164
165 NOT_SUPPORTED {
166 @Override
167 public String toString() {
168 return "Not-yet-supported";
169 }
170
171 @Override
172 public boolean isSuccessful() {
173 return false;
174 }
175 },
176
177
178
179
180
181 CHECKOUT_CONFLICT {
182 @Override
183 public String toString() {
184 return "Checkout Conflict";
185 }
186
187 @Override
188 public boolean isSuccessful() {
189 return false;
190 }
191 };
192
193
194
195
196 public abstract boolean isSuccessful();
197 }
198
199 private ObjectId[] mergedCommits;
200
201 private ObjectId base;
202
203 private ObjectId newHead;
204
205 private Map<String, int[][]> conflicts;
206
207 private MergeStatus mergeStatus;
208
209 private String description;
210
211 private MergeStrategy mergeStrategy;
212
213 private Map<String, MergeFailureReason> failingPaths;
214
215 private List<String> checkoutConflicts;
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237 public MergeResult(ObjectId./../../../org/eclipse/jgit/lib/ObjectId.html#ObjectId">ObjectId newHead, ObjectId base,
238 ObjectId[] mergedCommits, MergeStatus mergeStatus,
239 MergeStrategy mergeStrategy,
240 Map<String, org.eclipse.jgit.merge.MergeResult<?>> lowLevelResults) {
241 this(newHead, base, mergedCommits, mergeStatus, mergeStrategy,
242 lowLevelResults, null);
243 }
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266 public MergeResult(ObjectId./../../../org/eclipse/jgit/lib/ObjectId.html#ObjectId">ObjectId newHead, ObjectId base,
267 ObjectId[] mergedCommits, MergeStatus mergeStatus,
268 MergeStrategy mergeStrategy,
269 Map<String, org.eclipse.jgit.merge.MergeResult<?>> lowLevelResults,
270 String description) {
271 this(newHead, base, mergedCommits, mergeStatus, mergeStrategy,
272 lowLevelResults, null, description);
273 }
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299 public MergeResult(ObjectId./../../../org/eclipse/jgit/lib/ObjectId.html#ObjectId">ObjectId newHead, ObjectId base,
300 ObjectId[] mergedCommits, MergeStatus mergeStatus,
301 MergeStrategy mergeStrategy,
302 Map<String, org.eclipse.jgit.merge.MergeResult<?>> lowLevelResults,
303 Map<String, MergeFailureReason> failingPaths, String description) {
304 this.newHead = newHead;
305 this.mergedCommits = mergedCommits;
306 this.base = base;
307 this.mergeStatus = mergeStatus;
308 this.mergeStrategy = mergeStrategy;
309 this.description = description;
310 this.failingPaths = failingPaths;
311 if (lowLevelResults != null)
312 for (Map.Entry<String, org.eclipse.jgit.merge.MergeResult<?>> result : lowLevelResults
313 .entrySet())
314 addConflict(result.getKey(), result.getValue());
315 }
316
317
318
319
320
321
322
323
324 public MergeResult(List<String> checkoutConflicts) {
325 this.checkoutConflicts = checkoutConflicts;
326 this.mergeStatus = MergeStatus.CHECKOUT_CONFLICT;
327 }
328
329
330
331
332
333
334 public ObjectId getNewHead() {
335 return newHead;
336 }
337
338
339
340
341
342
343 public MergeStatus getMergeStatus() {
344 return mergeStatus;
345 }
346
347
348
349
350
351
352 public ObjectId[] getMergedCommits() {
353 return mergedCommits;
354 }
355
356
357
358
359
360
361
362
363 public ObjectId getBase() {
364 return base;
365 }
366
367
368 @SuppressWarnings("nls")
369 @Override
370 public String toString() {
371 boolean first = true;
372 StringBuilder commits = new StringBuilder();
373 for (ObjectId commit : mergedCommits) {
374 if (!first)
375 commits.append(", ");
376 else
377 first = false;
378 commits.append(ObjectId.toString(commit));
379 }
380 return MessageFormat.format(
381 JGitText.get().mergeUsingStrategyResultedInDescription,
382 commits, ObjectId.toString(base), mergeStrategy.getName(),
383 mergeStatus, (description == null ? "" : ", " + description));
384 }
385
386
387
388
389
390
391
392 public void setConflicts(Map<String, int[][]> conflicts) {
393 this.conflicts = conflicts;
394 }
395
396
397
398
399
400
401
402
403
404 public void addConflict(String path, int[][] conflictingRanges) {
405 if (conflicts == null)
406 conflicts = new HashMap<>();
407 conflicts.put(path, conflictingRanges);
408 }
409
410
411
412
413
414
415
416
417
418 public void addConflict(String path, org.eclipse.jgit.merge.MergeResult<?> lowLevelResult) {
419 if (!lowLevelResult.containsConflicts())
420 return;
421 if (conflicts == null)
422 conflicts = new HashMap<>();
423 int nrOfConflicts = 0;
424
425 for (MergeChunk mergeChunk : lowLevelResult) {
426 if (mergeChunk.getConflictState().equals(ConflictState.FIRST_CONFLICTING_RANGE)) {
427 nrOfConflicts++;
428 }
429 }
430 int currentConflict = -1;
431 int[][] ret=new int[nrOfConflicts][mergedCommits.length+1];
432 for (MergeChunk mergeChunk : lowLevelResult) {
433
434 int endOfChunk = 0;
435 if (mergeChunk.getConflictState().equals(ConflictState.FIRST_CONFLICTING_RANGE)) {
436 if (currentConflict > -1) {
437
438
439 ret[currentConflict][mergedCommits.length] = endOfChunk;
440 }
441 currentConflict++;
442 endOfChunk = mergeChunk.getEnd();
443 ret[currentConflict][mergeChunk.getSequenceIndex()] = mergeChunk.getBegin();
444 }
445 if (mergeChunk.getConflictState().equals(ConflictState.NEXT_CONFLICTING_RANGE)) {
446 if (mergeChunk.getEnd() > endOfChunk)
447 endOfChunk = mergeChunk.getEnd();
448 ret[currentConflict][mergeChunk.getSequenceIndex()] = mergeChunk.getBegin();
449 }
450 }
451 conflicts.put(path, ret);
452 }
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494 public Map<String, int[][]> getConflicts() {
495 return conflicts;
496 }
497
498
499
500
501
502
503
504
505 public Map<String, MergeFailureReason> getFailingPaths() {
506 return failingPaths;
507 }
508
509
510
511
512
513
514
515 public List<String> getCheckoutConflicts() {
516 return checkoutConflicts;
517 }
518 }