| /******************************************************************************* |
| * Copyright (c) 2011, 2015 Ericsson Research Canada and others. |
| * |
| * All rights reserved. This program and the accompanying materials are |
| * made available under the terms of the Eclipse Public License v1.0 which |
| * accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Ericsson - Initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.mylyn.internal.git.ui.connector; |
| |
| import java.lang.reflect.InvocationTargetException; |
| |
| import org.apache.commons.lang.reflect.MethodUtils; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.Assert; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.egit.core.GitProvider; |
| import org.eclipse.egit.ui.internal.commit.CommitEditor; |
| import org.eclipse.egit.ui.internal.commit.RepositoryCommit; |
| import org.eclipse.jface.window.Window; |
| import org.eclipse.jgit.lib.ObjectId; |
| import org.eclipse.jgit.lib.Repository; |
| import org.eclipse.jgit.revwalk.RevCommit; |
| import org.eclipse.jgit.revwalk.RevWalk; |
| import org.eclipse.mylyn.commons.core.StatusHandler; |
| import org.eclipse.mylyn.internal.git.core.GitRepository; |
| import org.eclipse.mylyn.internal.git.ui.GetChangeSetDialog; |
| import org.eclipse.mylyn.versions.core.ChangeSet; |
| import org.eclipse.mylyn.versions.core.ScmCore; |
| import org.eclipse.mylyn.versions.core.ScmRepository; |
| import org.eclipse.mylyn.versions.core.spi.ScmConnector; |
| import org.eclipse.mylyn.versions.ui.spi.ScmConnectorUi; |
| |
| /** |
| * Entry class to resolve the generic versions components from a User interface. |
| * |
| * @author Alvaro Sanchez-Leon |
| */ |
| public class GitConnectorUi extends ScmConnectorUi { |
| |
| public static final String ID_PLUGIN = "org.eclipse.mylyn.git.ui"; //$NON-NLS-1$ |
| |
| @Override |
| public ChangeSet getChangeSet(ScmRepository repository, IResource resource) { |
| Assert.isNotNull(resource); |
| |
| final IProject project = resource.getProject(); |
| Assert.isNotNull(project); |
| |
| // Resolve Git Scm connector |
| final ScmConnector scmConnector = ScmCore.getConnector(resource); |
| Assert.isNotNull(scmConnector); |
| |
| // Check if the provider is for Git |
| if (!GitProvider.class.getName().equals(scmConnector.getProviderId())) { |
| throw new RuntimeException("No Git connector: " + scmConnector.getProviderId()); |
| } |
| |
| final GetChangeSetDialog dialog = new GetChangeSetDialog(null, project); |
| final int result = dialog.open(); |
| if (result == Window.OK) { |
| return dialog.getChangeSet(); |
| } // else Window.CANCEL |
| return null; |
| } |
| |
| @Override |
| public void showChangeSetInView(ChangeSet cs) { |
| String objectId = cs.getId(); |
| GitRepository repo = (GitRepository) cs.getRepository(); |
| Repository repository = repo.getRepository(); |
| CommitEditor.openQuiet(new RepositoryCommit(repository, getCommit(repository, objectId))); |
| } |
| |
| private RevCommit getCommit(Repository repository, String objectId) { |
| RevWalk revWalk = null; |
| try { |
| revWalk = new RevWalk(repository); |
| return revWalk.parseCommit(ObjectId.fromString(objectId)); |
| } catch (Exception e) { |
| return null; |
| } finally { |
| if (revWalk != null) { |
| release(revWalk); |
| } |
| } |
| } |
| |
| private void release(RevWalk revWalk) { |
| try { |
| MethodUtils.invokeMethod(revWalk, "release", null); //$NON-NLS-1$ |
| } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { |
| try { |
| MethodUtils.invokeMethod(revWalk, "close", null); //$NON-NLS-1$ |
| } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e1) { |
| StatusHandler.log(new Status(IStatus.ERROR, ID_PLUGIN, "Failed to release revWalk " + revWalk, e1)); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |