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