Search in sources :

Example 6 with InteractiveHandler

use of org.eclipse.jgit.api.RebaseCommand.InteractiveHandler in project egit by eclipse.

the class SquashCommitsOperation method execute.

@Override
public void execute(IProgressMonitor m) throws CoreException {
    IWorkspaceRunnable action = new IWorkspaceRunnable() {

        @Override
        public void run(IProgressMonitor pm) throws CoreException {
            SubMonitor progress = SubMonitor.convert(pm, 2);
            progress.subTask(MessageFormat.format(CoreText.SquashCommitsOperation_squashing, Integer.valueOf(commits.size())));
            InteractiveHandler handler = new InteractiveHandler() {

                @Override
                public void prepareSteps(List<RebaseTodoLine> steps) {
                    RevCommit firstCommit = commits.get(0);
                    for (RebaseTodoLine step : steps) {
                        if (isRelevant(step.getCommit())) {
                            try {
                                if (step.getCommit().prefixCompare(firstCommit) == 0)
                                    step.setAction(RebaseTodoLine.Action.PICK);
                                else
                                    step.setAction(RebaseTodoLine.Action.SQUASH);
                            } catch (IllegalTodoFileModification e) {
                            // shouldn't happen
                            }
                        }
                    }
                }

                private boolean isRelevant(AbbreviatedObjectId id) {
                    for (RevCommit commit : commits) {
                        if (id.prefixCompare(commit) == 0)
                            return true;
                    }
                    return false;
                }

                @Override
                public String modifyCommitMessage(String oldMessage) {
                    return messageHandler.modifyCommitMessage(oldMessage);
                }
            };
            try (Git git = new Git(repository)) {
                RebaseCommand command = git.rebase().setUpstream(commits.get(0).getParent(0)).runInteractively(handler).setOperation(RebaseCommand.Operation.BEGIN);
                MergeStrategy strategy = Activator.getDefault().getPreferredMergeStrategy();
                if (strategy != null) {
                    command.setStrategy(strategy);
                }
                command.call();
            } catch (GitAPIException e) {
                throw new TeamException(e.getLocalizedMessage(), e.getCause());
            }
            progress.worked(1);
            ProjectUtil.refreshValidProjects(ProjectUtil.getValidOpenProjects(repository), progress.newChild(1));
        }
    };
    ResourcesPlugin.getWorkspace().run(action, getSchedulingRule(), IWorkspace.AVOID_UPDATE, m);
}
Also used : RebaseTodoLine(org.eclipse.jgit.lib.RebaseTodoLine) IWorkspaceRunnable(org.eclipse.core.resources.IWorkspaceRunnable) IllegalTodoFileModification(org.eclipse.jgit.errors.IllegalTodoFileModification) RebaseCommand(org.eclipse.jgit.api.RebaseCommand) MergeStrategy(org.eclipse.jgit.merge.MergeStrategy) SubMonitor(org.eclipse.core.runtime.SubMonitor) InteractiveHandler(org.eclipse.jgit.api.RebaseCommand.InteractiveHandler) GitAPIException(org.eclipse.jgit.api.errors.GitAPIException) TeamException(org.eclipse.team.core.TeamException) IProgressMonitor(org.eclipse.core.runtime.IProgressMonitor) Git(org.eclipse.jgit.api.Git) AbbreviatedObjectId(org.eclipse.jgit.lib.AbbreviatedObjectId) List(java.util.List) RevCommit(org.eclipse.jgit.revwalk.RevCommit)

Aggregations

InteractiveHandler (org.eclipse.jgit.api.RebaseCommand.InteractiveHandler)6 List (java.util.List)5 IProgressMonitor (org.eclipse.core.runtime.IProgressMonitor)4 Git (org.eclipse.jgit.api.Git)4 GitAPIException (org.eclipse.jgit.api.errors.GitAPIException)4 IWorkspaceRunnable (org.eclipse.core.resources.IWorkspaceRunnable)3 SubMonitor (org.eclipse.core.runtime.SubMonitor)3 IllegalTodoFileModification (org.eclipse.jgit.errors.IllegalTodoFileModification)3 RebaseTodoLine (org.eclipse.jgit.lib.RebaseTodoLine)3 RevCommit (org.eclipse.jgit.revwalk.RevCommit)3 TeamException (org.eclipse.team.core.TeamException)3 SquashCommitsOperation (org.eclipse.egit.core.op.SquashCommitsOperation)2 CoreException (org.eclipse.core.runtime.CoreException)1 NullProgressMonitor (org.eclipse.core.runtime.NullProgressMonitor)1 Job (org.eclipse.core.runtime.jobs.Job)1 RebaseOperation (org.eclipse.egit.core.op.RebaseOperation)1 RebaseInteractiveHandler (org.eclipse.egit.ui.internal.rebase.RebaseInteractiveHandler)1 LogCommand (org.eclipse.jgit.api.LogCommand)1 RebaseCommand (org.eclipse.jgit.api.RebaseCommand)1 AbbreviatedObjectId (org.eclipse.jgit.lib.AbbreviatedObjectId)1