@Override protected void run() throws Exception { if (squash && ff == FastForwardMode.NO_FF) throw die(CLIText.get().cannotCombineSquashWithNoff); // determine the merge strategy if (strategyName != null) { mergeStrategy = MergeStrategy.get(strategyName); if (mergeStrategy == null) throw die(MessageFormat.format(CLIText.get().unknownMergeStrategy, strategyName)); } // determine the other revision we want to merge with HEAD final Ref srcRef = db.getRef(ref); final ObjectId src = db.resolve(ref + "^{commit}"); // $NON-NLS-1$ if (src == null) throw die(MessageFormat.format(CLIText.get().refDoesNotExistOrNoCommit, ref)); Ref oldHead = db.getRef(Constants.HEAD); Git git = new Git(db); MergeCommand mergeCmd = git.merge() .setStrategy(mergeStrategy) .setSquash(squash) .setFastForward(ff) .setCommit(!noCommit); if (srcRef != null) mergeCmd.include(srcRef); else mergeCmd.include(src); MergeResult result; try { result = mergeCmd.call(); } catch (CheckoutConflictException e) { result = new MergeResult(e.getConflictingPaths()); // CHECKOUT_CONFLICT } switch (result.getMergeStatus()) { case ALREADY_UP_TO_DATE: if (squash) outw.print(CLIText.get().nothingToSquash); outw.println(CLIText.get().alreadyUpToDate); break; case FAST_FORWARD: ObjectId oldHeadId = oldHead.getObjectId(); outw.println( MessageFormat.format( CLIText.get().updating, oldHeadId.abbreviate(7).name(), result.getNewHead().abbreviate(7).name())); outw.println(result.getMergeStatus().toString()); break; case CHECKOUT_CONFLICT: outw.println(CLIText.get().mergeCheckoutConflict); for (String collidingPath : result.getCheckoutConflicts()) outw.println("\t" + collidingPath); // $NON-NLS-1$ outw.println(CLIText.get().mergeCheckoutFailed); break; case CONFLICTING: for (String collidingPath : result.getConflicts().keySet()) outw.println(MessageFormat.format(CLIText.get().mergeConflict, collidingPath)); outw.println(CLIText.get().mergeFailed); break; case FAILED: for (Map.Entry<String, MergeFailureReason> entry : result.getFailingPaths().entrySet()) switch (entry.getValue()) { case DIRTY_WORKTREE: case DIRTY_INDEX: outw.println(CLIText.get().dontOverwriteLocalChanges); outw.println(" " + entry.getKey()); // $NON-NLS-1$ break; case COULD_NOT_DELETE: outw.println(CLIText.get().cannotDeleteFile); outw.println(" " + entry.getKey()); // $NON-NLS-1$ break; } break; case MERGED: String name; if (!isMergedInto(oldHead, src)) name = mergeStrategy.getName(); else name = "recursive"; // $NON-NLS-1$ outw.println(MessageFormat.format(CLIText.get().mergeMadeBy, name)); break; case MERGED_NOT_COMMITTED: outw.println(CLIText.get().mergeWentWellStoppedBeforeCommitting); break; case MERGED_SQUASHED: case FAST_FORWARD_SQUASHED: case MERGED_SQUASHED_NOT_COMMITTED: outw.println(CLIText.get().mergedSquashed); outw.println(CLIText.get().mergeWentWellStoppedBeforeCommitting); break; case ABORTED: throw die(CLIText.get().ffNotPossibleAborting); case NOT_SUPPORTED: outw.println(MessageFormat.format(CLIText.get().unsupportedOperation, result.toString())); } }
@Override protected void run() throws Exception { if (file == null) { if (revision == null) throw die(CLIText.get().fileIsRequired); file = revision; revision = null; } boolean autoAbbrev = abbrev == 0; if (abbrev == 0) abbrev = db.getConfig().getInt("core", "abbrev", 7); // $NON-NLS-1$ //$NON-NLS-2$ if (!showBlankBoundary) root = db.getConfig().getBoolean("blame", "blankboundary", false); // $NON-NLS-1$ //$NON-NLS-2$ if (!root) root = db.getConfig().getBoolean("blame", "showroot", false); // $NON-NLS-1$ //$NON-NLS-2$ if (showRawTimestamp) dateFmt = new SimpleDateFormat("ZZZZ"); // $NON-NLS-1$ else dateFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ZZZZ"); // $NON-NLS-1$ reader = db.newObjectReader(); try (BlameGenerator generator = new BlameGenerator(db, file)) { RevFlag scanned = generator.newFlag("SCANNED"); // $NON-NLS-1$ generator.setTextComparator(comparator); if (!reverseRange.isEmpty()) { RevCommit rangeStart = null; List<RevCommit> rangeEnd = new ArrayList<RevCommit>(2); for (RevCommit c : reverseRange) { if (c.has(RevFlag.UNINTERESTING)) rangeStart = c; else rangeEnd.add(c); } generator.reverse(rangeStart, rangeEnd); } else if (revision != null) { generator.push(null, db.resolve(revision + "^{commit}")); // $NON-NLS-1$ } else { generator.push(null, db.resolve(Constants.HEAD)); if (!db.isBare()) { DirCache dc = db.readDirCache(); int entry = dc.findEntry(file); if (0 <= entry) generator.push(null, dc.getEntry(entry).getObjectId()); File inTree = new File(db.getWorkTree(), file); if (db.getFS().isFile(inTree)) generator.push(null, new RawText(inTree)); } } blame = BlameResult.create(generator); begin = 0; end = blame.getResultContents().size(); if (rangeString != null) parseLineRangeOption(); blame.computeRange(begin, end); int authorWidth = 8; int dateWidth = 8; int pathWidth = 1; int maxSourceLine = 1; for (int line = begin; line < end; line++) { RevCommit c = blame.getSourceCommit(line); if (c != null && !c.has(scanned)) { c.add(scanned); if (autoAbbrev) abbrev = Math.max(abbrev, uniqueAbbrevLen(c)); authorWidth = Math.max(authorWidth, author(line).length()); dateWidth = Math.max(dateWidth, date(line).length()); pathWidth = Math.max(pathWidth, path(line).length()); } while (line + 1 < end && blame.getSourceCommit(line + 1) == c) line++; maxSourceLine = Math.max(maxSourceLine, blame.getSourceLine(line)); } String pathFmt = MessageFormat.format(" %{0}s", valueOf(pathWidth)); // $NON-NLS-1$ String numFmt = MessageFormat.format( " %{0}d", //$NON-NLS-1$ valueOf(1 + (int) Math.log10(maxSourceLine + 1))); String lineFmt = MessageFormat.format( " %{0}d) ", //$NON-NLS-1$ valueOf(1 + (int) Math.log10(end + 1))); String authorFmt = MessageFormat.format( " (%-{0}s %{1}s", //$NON-NLS-1$ valueOf(authorWidth), valueOf(dateWidth)); for (int line = begin; line < end; ) { RevCommit c = blame.getSourceCommit(line); String commit = abbreviate(c); String author = null; String date = null; if (!noAuthor) { author = author(line); date = date(line); } do { outw.print(commit); if (showSourcePath) outw.format(pathFmt, path(line)); if (showSourceLine) outw.format(numFmt, valueOf(blame.getSourceLine(line) + 1)); if (!noAuthor) outw.format(authorFmt, author, date); outw.format(lineFmt, valueOf(line + 1)); outw.flush(); blame.getResultContents().writeLine(outs, line); outs.flush(); outw.print('\n'); } while (++line < end && blame.getSourceCommit(line) == c); } } finally { reader.close(); } }