com.aptana.git.ui.internal.actions.CherryPickHandler.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.git.ui.internal.actions.CherryPickHandler.java

Source

/**
 * Aptana Studio
 * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
 * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
 * Please see the license.html included with this distribution for details.
 * Any modifications to this file must keep this entire header intact.
 */
package com.aptana.git.ui.internal.actions;

import java.text.MessageFormat;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.team.ui.history.IHistoryPage;
import org.eclipse.team.ui.history.IHistoryView;
import org.eclipse.ui.ISources;

import com.aptana.core.logging.IdeLog;
import com.aptana.git.core.GitPlugin;
import com.aptana.git.core.model.GitCommit;
import com.aptana.git.core.model.GitRepository;
import com.aptana.git.core.model.IGitRepositoryManager;
import com.aptana.git.ui.GitUIPlugin;
import com.aptana.git.ui.internal.Launcher;
import com.aptana.git.ui.internal.history.GitHistoryPage;

public class CherryPickHandler extends AbstractHandler {

    private GitCommit getCommit(IEvaluationContext evaluationContext) {
        ISelection selection = null;
        Object part = evaluationContext.getVariable(ISources.ACTIVE_PART_NAME);
        if (part instanceof IHistoryView) {
            IHistoryView view = (IHistoryView) part;
            IHistoryPage page = view.getHistoryPage();
            if (page instanceof GitHistoryPage) {
                GitHistoryPage ghp = (GitHistoryPage) page;
                selection = ghp.getSelectionProvider().getSelection();

                if (selection instanceof IStructuredSelection) {
                    IStructuredSelection ss = (IStructuredSelection) selection;
                    Object selected = ss.getFirstElement();
                    if (selected instanceof GitCommit) {
                        return (GitCommit) selected;
                    }
                }
            }
        }
        return null;
    }

    protected IGitRepositoryManager getGitRepositoryManager() {
        return GitPlugin.getDefault().getGitRepositoryManager();
    }

    public Object execute(ExecutionEvent event) throws ExecutionException {
        if (event == null) {
            return null;
        }
        Object context = event.getApplicationContext();
        if (context instanceof IEvaluationContext) {
            GitCommit commit = getCommit((IEvaluationContext) context);
            cherryPick(commit);
        }
        return null;
    }

    private void cherryPick(final GitCommit commit) {
        Job job = new Job(MessageFormat.format("git cherry-pick {0}", commit.sha())) //$NON-NLS-1$
        {
            @Override
            protected IStatus run(IProgressMonitor monitor) {
                SubMonitor sub = SubMonitor.convert(monitor, 1000);
                if (sub.isCanceled()) {
                    return Status.CANCEL_STATUS;
                }

                GitRepository currentRepo = commit.repository();
                currentRepo.enterWriteProcess();
                try {
                    ILaunch launch = Launcher.launch(currentRepo, sub.newChild(100), "cherry-pick", commit.sha()); //$NON-NLS-1$

                    if (launch.getProcesses() == null || launch.getProcesses().length < 1) {
                        // If something went wrong and there's no process (like unsaved files and user cancelled
                        // dialog)
                        return Status.OK_STATUS;
                    }

                    IProcess process = launch.getProcesses()[0];
                    while (!launch.isTerminated()) {
                        Thread.sleep(1);
                        if (sub.isCanceled()) {
                            launch.terminate();
                            return Status.CANCEL_STATUS;
                        }
                        sub.worked(1);
                    }

                    int exitValue = process.getExitValue();
                    if (exitValue != 0) {
                        String msg = MessageFormat.format("cherry-pick {0} returned non-zero exit value. wd: {1}", //$NON-NLS-1$
                                commit.sha(), currentRepo.workingDirectory());
                        IdeLog.logWarning(GitUIPlugin.getDefault(), msg);
                    }
                    commit.refreshAffectedFiles();
                } catch (CoreException e) {
                    return e.getStatus();
                } catch (Throwable e) {
                    return new Status(IStatus.ERROR, GitUIPlugin.getPluginId(), e.getMessage(), e);
                } finally {
                    currentRepo.exitWriteProcess();
                }
                sub.done();

                return Status.OK_STATUS;
            }
        };
        job.setPriority(Job.LONG);
        job.schedule();
    }
}