List of usage examples for org.eclipse.jgit.api MergeResult getConflicts
public Map<String, int[][]> getConflicts()
From source file:br.com.riselabs.cotonet.builder.NetworkBuilder.java
License:Open Source License
/** * Returns the conflicting files of the given scenario. * /*from www . j a v a2 s .c om*/ * @param scenario * @return * @throws CheckoutConflictException * @throws GitAPIException */ private List<File> getConflictingFiles(MergeScenario scenario) throws CheckoutConflictException, GitAPIException { Git git = Git.wrap(getProject().getRepository()); // this is for the cases of restarting after exception in a conflict // scenario analysis try { git.reset().setRef(scenario.getLeft().getName()).setMode(ResetType.HARD).call(); } catch (JGitInternalException e) { Logger.log(log, "[" + project.getName() + "] JGit Reset Command ended with exception." + " Trying external reset command."); ExternalGitCommand egit = new ExternalGitCommand(); try { egit.setType(CommandType.RESET).setDirectory(project.getRepository().getDirectory().getParentFile()) .call(); } catch (BlameException e1) { Logger.logStackTrace(log, e1); return null; } } CheckoutCommand ckoutCmd = git.checkout(); ckoutCmd.setName(scenario.getLeft().getName()); ckoutCmd.setStartPoint(scenario.getLeft()); ckoutCmd.call(); MergeCommand mergeCmd = git.merge(); mergeCmd.setCommit(false); mergeCmd.setStrategy(MergeStrategy.RECURSIVE); mergeCmd.include(scenario.getRight()); Set<String> conflictingPaths; try { // dealing with MissingObjectException MergeResult mResult = mergeCmd.call(); // dealing with Ghosts conflicts conflictingPaths = mResult.getConflicts().keySet(); } catch (NullPointerException | JGitInternalException e) { StringBuilder sb = new StringBuilder(); sb.append("[" + project.getName() + ":" + project.getUrl() + "] " + "Skipping merge scenario due to '" + e.getMessage() + "'\n"); sb.append("--> Exception: " + e.getClass()); sb.append("--> Skipped scenario:\n"); sb.append("::Base:" + scenario.getBase().getName() + "\n"); sb.append("::Left:" + scenario.getLeft().getName() + "\n"); sb.append("::Right:" + scenario.getRight().getName() + "\n"); Logger.log(log, sb.toString()); return null; } List<File> result = new ArrayList<File>(); for (String path : conflictingPaths) { result.add(new File(getProject().getRepository().getDirectory().getParent(), path)); } return result; }
From source file:br.com.riselabs.cotonet.test.helpers.ConflictBasedRepositoryTestCase.java
License:Open Source License
public static void printMergeResult(MergeResult result) { Map<String, int[][]> allConflicts = result.getConflicts(); // looping over the files for (String path : allConflicts.keySet()) { int[][] c = allConflicts.get(path); System.out.println("Conflicts in file " + path); // looping over the file conflicts for (int i = 0; i < c.length; ++i) { System.out.println(" Conflict #" + i); // looping over the conflicting chunks. for (int j = 0; j < (c[i].length) - 1; ++j) { if (c[i][j] >= 0) System.out.println( " Chunk for " + result.getMergedCommits()[j] + " starts on line #" + c[i][j]); }//from w w w .j a va2s .c o m } } }
From source file:com.door43.translationstudio.tasks.PullTargetTranslationTask.java
private String pull(Repo repo, String remote) { Git git;//from ww w . j a v a 2s .c o m try { repo.deleteRemote("origin"); repo.setRemote("origin", remote); git = repo.getGit(); } catch (IOException e) { return null; } Manifest localManifest = Manifest.generate(this.targetTranslation.getPath()); // TODO: we might want to get some progress feedback for the user PullCommand pullCommand = git.pull().setTransportConfigCallback(new TransportCallback()).setRemote("origin") .setStrategy(mergeStrategy).setRemoteBranchName("master").setProgressMonitor(new ProgressMonitor() { @Override public void start(int totalTasks) { } @Override public void beginTask(String title, int totalWork) { } @Override public void update(int completed) { } @Override public void endTask() { } @Override public boolean isCancelled() { return false; } }); try { PullResult result = pullCommand.call(); MergeResult mergeResult = result.getMergeResult(); if (mergeResult != null && mergeResult.getConflicts() != null && mergeResult.getConflicts().size() > 0) { this.status = Status.MERGE_CONFLICTS; this.conflicts = mergeResult.getConflicts(); // revert manifest merge conflict to avoid corruption if (this.conflicts.containsKey("manifest.json")) { Logger.i("PullTargetTranslationTask", "Reverting to server manifest"); try { git.checkout().setStage(CheckoutCommand.Stage.THEIRS).addPath("manifest.json").call(); Manifest remoteManifest = Manifest.generate(this.targetTranslation.getPath()); localManifest = TargetTranslation.mergeManifests(localManifest, remoteManifest); } catch (CheckoutConflictException e) { // failed to reset manifest.json Logger.e(this.getClass().getName(), "Failed to reset manifest: " + e.getMessage(), e); } finally { localManifest.save(); } } // keep our license if (this.conflicts.containsKey("LICENSE.md")) { Logger.i("PullTargetTranslationTask", "Reverting to local license"); try { git.checkout().setStage(CheckoutCommand.Stage.OURS).addPath("LICENSE.md").call(); } catch (CheckoutConflictException e) { Logger.e(this.getClass().getName(), "Failed to reset license: " + e.getMessage(), e); } } } else { this.status = Status.UP_TO_DATE; } return "message"; } catch (TransportException e) { Logger.e(this.getClass().getName(), e.getMessage(), e); Throwable cause = e.getCause(); if (cause != null) { Throwable subException = cause.getCause(); if (subException != null) { String detail = subException.getMessage(); if ("Auth fail".equals(detail)) { this.status = Status.AUTH_FAILURE; // we do special handling for auth failure } } else if (cause instanceof NoRemoteRepositoryException) { this.status = Status.NO_REMOTE_REPO; } } return null; } catch (Exception e) { Throwable cause = e.getCause(); if (cause instanceof NoRemoteRepositoryException) { this.status = Status.NO_REMOTE_REPO; } Logger.e(this.getClass().getName(), e.getMessage(), e); return null; } catch (OutOfMemoryError e) { Logger.e(this.getClass().getName(), e.getMessage(), e); this.status = Status.OUT_OF_MEMORY; return null; } catch (Throwable e) { Logger.e(this.getClass().getName(), e.getMessage(), e); return null; } }
From source file:com.microsoft.gittf.core.tasks.PullTask.java
License:Open Source License
private TaskStatus merge(TaskProgressMonitor progressMonitor, int changeset, ObjectId commitId) { try {/*from w ww . j a v a 2s . c o m*/ getMergeCommand().include( Messages.formatString("PullTask.Merge.CommitNameFormat", Integer.toString(changeset)), //$NON-NLS-1$ commitId); MergeResult mergeResults = getMergeCommand().call(); progressMonitor.endTask(); switch (mergeResults.getMergeStatus()) { case ALREADY_UP_TO_DATE: progressMonitor.displayMessage(Messages.getString("PullTask.Merge.AlreadyUpToDate")); //$NON-NLS-1$ break; case FAST_FORWARD: case MERGED: progressMonitor.displayMessage(Messages.formatString("PullTask.Merge.MergeSuccessfulFormat", //$NON-NLS-1$ ObjectIdUtil.abbreviate(repository, commitId))); break; case CONFLICTING: progressMonitor .displayMessage(Messages.formatString("PullTask.Merge.MergeSuccessfulWithConflictsFormat", //$NON-NLS-1$ ObjectIdUtil.abbreviate(repository, commitId))); displayConflicts(progressMonitor, mergeResults.getConflicts()); break; case FAILED: case NOT_SUPPORTED: progressMonitor.displayMessage(Messages.formatString("PullTask.Merge.FailedFormat", //$NON-NLS-1$ ObjectIdUtil.abbreviate(repository, commitId))); displayFailures(progressMonitor, mergeResults.getFailingPaths()); break; } RepositoryUtil.fixFileAttributes(repository); } catch (Exception e) { log.error("An error occurred while merging.", e); //$NON-NLS-1$ return new TaskStatus(TaskStatus.ERROR, e); } return TaskStatus.OK_STATUS; }
From source file:gov.va.isaac.sync.git.SyncServiceGIT.java
License:Apache License
/** * @throws MergeFailure//from w w w . java 2 s .c o m * @throws AuthenticationException * @see gov.va.isaac.interfaces.sync.ProfileSyncI#updateFromRemote(java.io.File, java.lang.String, java.lang.String, * gov.va.isaac.interfaces.sync.MergeFailOption) */ @Override public Set<String> updateFromRemote(String username, String password, MergeFailOption mergeFailOption) throws IllegalArgumentException, IOException, MergeFailure, AuthenticationException { Set<String> filesChangedDuringPull; try { log.info("update from remote called "); Git git = getGit(); log.debug("Fetching from remote"); if (git.status().call().getConflicting().size() > 0) { log.info("Previous merge failure not yet resolved"); throw new MergeFailure(git.status().call().getConflicting(), new HashSet<>()); } CredentialsProvider cp = new UsernamePasswordCredentialsProvider(username, (password == null ? new char[] {} : password.toCharArray())); log.debug("Fetch Message" + git.fetch().setCredentialsProvider(cp).call().getMessages()); ObjectId masterIdBeforeMerge = git.getRepository().getRef("master").getObjectId(); if (git.getRepository().getRef("refs/remotes/origin/master").getObjectId().getName() .equals(masterIdBeforeMerge.getName())) { log.info("No changes to merge"); return new HashSet<String>(); } RevCommit stash = null; if (git.status().call().getUncommittedChanges().size() > 0) { log.info("Stashing uncommitted changes"); stash = git.stashCreate().call(); } { log.debug("Merging from remotes/origin/master"); MergeResult mr = git.merge().include(git.getRepository().getRef("refs/remotes/origin/master")) .call(); AnyObjectId headAfterMergeID = mr.getNewHead(); if (!mr.getMergeStatus().isSuccessful()) { if (mergeFailOption == null || MergeFailOption.FAIL == mergeFailOption) { addNote(NOTE_FAILED_MERGE_HAPPENED_ON_REMOTE + (stash == null ? ":NO_STASH" : STASH_MARKER + stash.getName()), git); //We can use the status here - because we already stashed the stuff that they had uncommitted above. throw new MergeFailure(mr.getConflicts().keySet(), git.status().call().getUncommittedChanges()); } else if (MergeFailOption.KEEP_LOCAL == mergeFailOption || MergeFailOption.KEEP_REMOTE == mergeFailOption) { HashMap<String, MergeFailOption> resolutions = new HashMap<>(); for (String s : mr.getConflicts().keySet()) { resolutions.put(s, mergeFailOption); } log.debug("Resolving merge failures with option {}", mergeFailOption); filesChangedDuringPull = resolveMergeFailures(MergeFailType.REMOTE_TO_LOCAL, (stash == null ? null : stash.getName()), resolutions); } else { throw new IllegalArgumentException("Unexpected option"); } } else { //Conflict free merge - or perhaps, no merge at all. if (masterIdBeforeMerge.getName().equals(headAfterMergeID.getName())) { log.debug("Merge didn't result in a commit - no incoming changes"); filesChangedDuringPull = new HashSet<>(); } else { filesChangedDuringPull = listFilesChangedInCommit(git.getRepository(), masterIdBeforeMerge, headAfterMergeID); } } } if (stash != null) { log.info("Replaying stash"); try { git.stashApply().setStashRef(stash.getName()).call(); log.debug("stash applied cleanly, dropping stash"); git.stashDrop().call(); } catch (StashApplyFailureException e) { log.debug("Stash failed to merge"); if (mergeFailOption == null || MergeFailOption.FAIL == mergeFailOption) { addNote(NOTE_FAILED_MERGE_HAPPENED_ON_STASH, git); throw new MergeFailure(git.status().call().getConflicting(), filesChangedDuringPull); } else if (MergeFailOption.KEEP_LOCAL == mergeFailOption || MergeFailOption.KEEP_REMOTE == mergeFailOption) { HashMap<String, MergeFailOption> resolutions = new HashMap<>(); for (String s : git.status().call().getConflicting()) { resolutions.put(s, mergeFailOption); } log.debug("Resolving stash apply merge failures with option {}", mergeFailOption); resolveMergeFailures(MergeFailType.STASH_TO_LOCAL, null, resolutions); //When we auto resolve to KEEP_LOCAL - these files won't have really changed, even though we recorded a change above. for (Entry<String, MergeFailOption> r : resolutions.entrySet()) { if (MergeFailOption.KEEP_LOCAL == r.getValue()) { filesChangedDuringPull.remove(r.getKey()); } } } else { throw new IllegalArgumentException("Unexpected option"); } } } log.info("Files changed during updateFromRemote: {}", filesChangedDuringPull); return filesChangedDuringPull; } catch (CheckoutConflictException e) { log.error("Unexpected", e); throw new IOException( "A local file exists (but is not yet added to source control) which conflicts with a file from the server." + " Either delete the local file, or call addFile(...) on the offending file prior to attempting to update from remote.", e); } catch (TransportException te) { if (te.getMessage().contains("Auth fail")) { log.info("Auth fail", te); throw new AuthenticationException("Auth fail"); } else { log.error("Unexpected", te); throw new IOException("Internal error", te); } } catch (GitAPIException e) { log.error("Unexpected", e); throw new IOException("Internal error", e); } }
From source file:org.archicontribs.modelrepository.dialogs.ConflictsDialog.java
License:Open Source License
private void createTableControl(Composite parent) { Composite tableComp = new Composite(parent, SWT.BORDER); TableColumnLayout tableLayout = new TableColumnLayout(); tableComp.setLayout(tableLayout);/*from w ww. j av a 2 s .co m*/ tableComp.setLayoutData(new GridData(GridData.FILL_BOTH)); Table table = new Table(tableComp, SWT.MULTI | SWT.FULL_SELECTION | SWT.CHECK); table.setHeaderVisible(true); fTableViewer = new CheckboxTableViewer(table); fTableViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); fTableViewer.getTable().setLinesVisible(true); fTableViewer.setComparator(new ViewerComparator()); // Columns TableViewerColumn column1 = new TableViewerColumn(fTableViewer, SWT.NONE, 0); column1.getColumn().setText(Messages.ConflictsDialog_5); tableLayout.setColumnData(column1.getColumn(), new ColumnWeightData(100, true)); // Content Provider fTableViewer.setContentProvider(new IStructuredContentProvider() { public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object inputElement) { MergeResult result = fHandler.getMergeResult(); return result.getConflicts().keySet().toArray(); } }); fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { String path = (String) ((StructuredSelection) event.getSelection()).getFirstElement(); try { fFileViewerOurs.setText( GraficoUtils.getFileContents(fHandler.getLocalGitFolder(), path, Constants.HEAD)); fFileViewerTheirs.setText( GraficoUtils.getFileContents(fHandler.getLocalGitFolder(), path, "origin/master")); //$NON-NLS-1$ fFileViewerDiff .setText(GraficoUtils.getWorkingTreeFileContents(fHandler.getLocalGitFolder(), path)); } catch (IOException ex) { ex.printStackTrace(); } } }); // Label Provider fTableViewer.setLabelProvider(new LabelProvider()); // Start the table fTableViewer.setInput(""); // anything will do //$NON-NLS-1$ }
From source file:org.eclipse.egit.gitflow.ui.internal.actions.AbstractGitFlowHandler.java
License:Open Source License
/** * @param mergeResult/*w w w .j a va 2 s. c o m*/ * @return Status containing detailed information about what went wrong * during merge */ private MultiStatus createMergeConflictWarning(MergeResult mergeResult) { Iterable<String> paths = mergeResult.getConflicts().keySet(); return docreateConflictWarning(paths, UIText.AbstractGitFlowHandler_finishConflicts); }
From source file:org.eclipse.egit.ui.test.team.actions.MergeToolTest.java
License:Open Source License
@Test public void useHeadOptionShouldCauseFileToNotHaveConflictMarkers() throws Exception { IPath path = new Path(PROJ1).append("folder/test.txt"); testRepository.branch("stable").commit().add(path.toString(), "stable").create(); touchAndSubmit("master", "master"); MergeOperation mergeOp = new MergeOperation(testRepository.getRepository(), "stable"); mergeOp.execute(null);/* w w w .jav a 2 s . c o m*/ MergeResult mergeResult = mergeOp.getResult(); assertThat(mergeResult.getMergeStatus(), is(MergeStatus.CONFLICTING)); assertThat(mergeResult.getConflicts().keySet(), hasItem(path.toString())); TestUtil.joinJobs(JobFamilies.INDEX_DIFF_CACHE_UPDATE); SWTBotTree packageExplorer = bot.viewById("org.eclipse.jdt.ui.PackageExplorer").bot().tree(); SWTBotTreeItem project1 = getProjectItem(packageExplorer, PROJ1).select(); SWTBotTreeItem folderNode = project1.expand().getNode(FOLDER); SWTBotTreeItem fileNode = folderNode.expand().getNode(FILE1); fileNode.select(); ContextMenuHelper.clickContextMenu(packageExplorer, util.getPluginLocalizedValue("TeamMenu.label"), util.getPluginLocalizedValue("MergeToolAction.label")); SWTBotShell shell = bot.shell(UIText.MergeModeDialog_DialogTitle).activate(); shell.bot().radio(UIText.MergeModeDialog_MergeMode_2_Label).click(); shell.bot().button(IDialogConstants.OK_LABEL).click(); SWTBotEditor editor = bot.editorById("org.eclipse.compare.CompareEditor"); SWTBotStyledText styledText = editor.bot().styledText(0); bot.waitUntil(Conditions.widgetIsEnabled(styledText)); String text = styledText.getText(); assertThat(text, is("master")); }
From source file:org.exist.git.xquery.Pull.java
License:Open Source License
@Override public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException { try {//from ww w. ja v a2 s . c om String localPath = args[0].getStringValue(); if (!(localPath.endsWith("/"))) localPath += File.separator; Git git = Git.open(new Resource(localPath), FS); PullResult answer = git.pull().setCredentialsProvider( new UsernamePasswordCredentialsProvider(args[1].getStringValue(), args[2].getStringValue())) .call(); MemTreeBuilder builder = getContext().getDocumentBuilder(); int nodeNr = builder.startElement(PULL, null); builder.addAttribute(IS_SUCCESSFUL, Boolean.toString(answer.isSuccessful())); MergeResult merge = answer.getMergeResult(); if (merge != null) { builder.startElement(MERGE, null); builder.addAttribute(STATUS, merge.getMergeStatus().toString()); builder.addAttribute(IS_SUCCESSFUL, Boolean.toString(merge.getMergeStatus().isSuccessful())); for (ObjectId commit : merge.getMergedCommits()) { builder.startElement(COMMIT, null); builder.addAttribute(ID, commit.name()); builder.endElement(); } builder.endElement(); if (merge.getConflicts() != null) { for (Entry<String, int[][]> entry : merge.getConflicts().entrySet()) { builder.startElement(CHECKOUT_CONFLICT, null); builder.addAttribute(PATH, entry.getKey()); builder.endElement(); } } if (merge.getCheckoutConflicts() != null) { for (String path : merge.getCheckoutConflicts()) { builder.startElement(CHECKOUT_CONFLICT, null); builder.addAttribute(PATH, path); builder.endElement(); } } if (merge.getFailingPaths() != null) { for (Entry<String, MergeFailureReason> entry : merge.getFailingPaths().entrySet()) { builder.startElement(FAILING_PATH, null); builder.addAttribute(PATH, entry.getKey()); builder.addAttribute(REASON, entry.getValue().name()); builder.endElement(); } } } RebaseResult rebase = answer.getRebaseResult(); if (rebase != null) { builder.startElement(REBASE, null); builder.addAttribute(STATUS, rebase.getStatus().toString()); builder.addAttribute(IS_SUCCESSFUL, Boolean.toString(rebase.getStatus().isSuccessful())); //rebase.getConflicts() if (rebase.getFailingPaths() != null) { for (Entry<String, MergeFailureReason> entry : rebase.getFailingPaths().entrySet()) { builder.startElement(FAILING_PATH, null); builder.addAttribute(PATH, entry.getKey()); builder.addAttribute(REASON, entry.getValue().name()); builder.endElement(); } } builder.endElement(); } return builder.getDocument().getNode(nodeNr); } catch (Throwable e) { e.printStackTrace(); throw new XPathException(this, Module.EXGIT001, e); } }
From source file:playRepository.GitConflicts.java
License:Apache License
/** * MergeResult? #conflictFiles ?? #conflicts ?? . * * @param repository/* ww w. j ava2 s. co m*/ * @param mergeResult * @see http://download.eclipse.org/jgit/docs/latest/apidocs/org/eclipse/jgit/api/MergeResult.html#getConflicts() */ public GitConflicts(Repository repository, MergeResult mergeResult) { Map<String, int[][]> allConflicts = mergeResult.getConflicts(); for (String path : allConflicts.keySet()) { conflictFiles.add(path); int[][] conflicts = allConflicts.get(path); for (int[] c : conflicts) { Conflict conflict = new Conflict(); conflict.fileName = path; for (int j = 0; j < (c.length) - 1; ++j) { if (c[j] >= 0) { ObjectId objectId = mergeResult.getMergedCommits()[j]; RevWalk revWalk = new RevWalk(repository); CommitAndLine commitAndLine = new CommitAndLine(); try { commitAndLine.gitCommit = new GitCommit(revWalk.parseCommit(objectId)); commitAndLine.lineNumber = c[j]; conflict.commitAndLines.add(commitAndLine); } catch (IOException e) { throw new RuntimeException(e); } } } conflictDetails.add(conflict); } } }