Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Rosenberg2011-06-17 06:32:09 +0000
committerMatthias Sohn2011-06-17 06:32:09 +0000
commit9ddb5f1e04cb23ab18e52db08c015d9926df3ca1 (patch)
tree2ffd2e36a22fdba0b9b737119ec0476ddf4598c2 /org.eclipse.egit.ui/src
parent719370df91eb06538fdd34e46fa795487b018162 (diff)
downloadegit-9ddb5f1e04cb23ab18e52db08c015d9926df3ca1.tar.gz
egit-9ddb5f1e04cb23ab18e52db08c015d9926df3ca1.tar.xz
egit-9ddb5f1e04cb23ab18e52db08c015d9926df3ca1.zip
Add support for git variables in launchers
This adds git_dir, git_work_tree, git_repo_relative_path and git_branch. They all work on the selected or named resource, i.e. ${git_branch} would return the current branch in the (first) selected project. ${git_branch:org.eclipse.jgit/.project} would return the current branch of the main JGit repository in the workspace. The code to pick the selected resource is stolen from Chris Aniszczyk's commit on a similar topic. Change-Id: Idad98f57440eb3b083ffd1be0f382bdac33963e3 Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.egit.ui/src')
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java9
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties3
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/variables/GitVariableResolver.java196
3 files changed, 208 insertions, 0 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java
index 34e1ccf9fe..9c0d19d211 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java
@@ -3740,6 +3740,15 @@ public class UIText extends NLS {
public static String GitActionContributor_Pull;
/** */
+ public static String GitVariableResolver_InternalError;
+
+ /** */
+ public static String GitVariableResolver_NoSelectedResource;
+
+ /** */
+ public static String GitVariableResolver_VariableReferencesNonExistentResource;
+
+ /** */
public static String DecoratableResourceHelper_noHead;
/** */
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties
index 8f3afc4227..aad6db9505 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties
@@ -1294,6 +1294,9 @@ SwitchToMenu_OtherMenuLabel=&Other...
GitActionContributor_ExpandAll=Expand All
GitActionContributor_Push=Push
GitActionContributor_Pull=Pull
+GitVariableResolver_InternalError=Internal error
+GitVariableResolver_NoSelectedResource=No selected resource
+GitVariableResolver_VariableReferencesNonExistentResource=Variable references non-existent resource : {0}
OpenWorkingFileAction_text=&Open
OpenWorkingFileAction_tooltip=Open working file
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/variables/GitVariableResolver.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/variables/GitVariableResolver.java
new file mode 100644
index 0000000000..1e4bcfbf69
--- /dev/null
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/variables/GitVariableResolver.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (C) 2011, Robin Rosenberg
+ * Copyright (C) 2011, Chris Aniszczyk <caniszczyk@gmail.com>
+ *
+ * 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
+ *******************************************************************************/
+package org.eclipse.egit.ui.variables;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.variables.IDynamicVariable;
+import org.eclipse.core.variables.IDynamicVariableResolver;
+import org.eclipse.egit.core.project.RepositoryMapping;
+import org.eclipse.egit.ui.Activator;
+import org.eclipse.egit.ui.UIText;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartSite;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Resolves Git related information so launchers can use them
+ */
+public class GitVariableResolver implements IDynamicVariableResolver {
+
+ private static final String GIT_REPO_RELATIVE_PATH = "git_repo_relative_path"; //$NON-NLS-1$
+ private static final String GIT_DIR = "git_dir"; //$NON-NLS-1$
+ private static final String GIT_WORK_TREE = "git_work_tree"; //$NON-NLS-1$
+ private static final String GIT_BRANCH = "git_branch"; //$NON-NLS-1$
+
+ public String resolveValue(IDynamicVariable variable, String argument)
+ throws CoreException {
+ if (variable.getName().equals(GIT_DIR))
+ return getGitDir(argument);
+ if (variable.getName().equals(GIT_REPO_RELATIVE_PATH))
+ return getGitRepoRelativePath(argument);
+ if (variable.getName().equals(GIT_WORK_TREE))
+ return getGitWorkTree(argument);
+ if (variable.getName().equals(GIT_BRANCH))
+ return getGitBranch(argument);
+ throw new CoreException(new Status(IStatus.ERROR, Activator
+ .getPluginId(), UIText.GitVariableResolver_InternalError));
+ }
+
+ private String getGitRepoRelativePath(String argument) throws CoreException {
+ IResource res = getResource(argument);
+ if (res == null)
+ return ""; //$NON-NLS-1$
+ RepositoryMapping mapping = RepositoryMapping.getMapping(res);
+ if (mapping != null) {
+ String repoRelativePath = mapping.getRepoRelativePath(res);
+ if (repoRelativePath.equals("")) //$NON-NLS-1$
+ return "."; //$NON-NLS-1$
+ else
+ return repoRelativePath;
+ }
+ return ""; //$NON-NLS-1$
+ }
+
+ private String getGitDir(String argument) throws CoreException {
+ IResource res = getResource(argument);
+ if (res == null)
+ return ""; //$NON-NLS-1$
+ RepositoryMapping mapping = RepositoryMapping.getMapping(res);
+ if (mapping != null)
+ return mapping.getRepository().getDirectory().getAbsolutePath();
+ else
+ return ""; //$NON-NLS-1$
+ }
+
+ private String getGitWorkTree(String argument) throws CoreException {
+ IResource res = getResource(argument);
+ if (res == null)
+ return ""; //$NON-NLS-1$
+ RepositoryMapping mapping = RepositoryMapping.getMapping(res);
+ if (mapping != null)
+ return mapping.getWorkTree().getAbsolutePath();
+ else
+ return ""; //$NON-NLS-1$
+ }
+
+ private String getGitBranch(String argument) throws CoreException {
+ IResource res = getResource(argument);
+ if (res == null)
+ return ""; //$NON-NLS-1$
+ RepositoryMapping mapping = RepositoryMapping.getMapping(res);
+ if (mapping != null)
+ try {
+ return mapping.getRepository().getBranch();
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getPluginId(), e.getMessage()));
+ }
+ else
+ return ""; //$NON-NLS-1$
+ }
+
+ /**
+ * Returns the currently selected or specified resource
+ * @param argument named resource or null for selected
+ *
+ * @return the currently selected <code>IResource</code>, or <code>null</code> if none.
+ * @throws CoreException
+ */
+ private IResource getResource(String argument) throws CoreException {
+ IResource res;
+ if (argument == null) {
+ res = getResource();
+ if (res == null)
+ throw new CoreException(new Status(IStatus.ERROR, Activator
+ .getPluginId(), UIText.GitVariableResolver_NoSelectedResource));
+ } else {
+ res = ResourcesPlugin.getWorkspace().getRoot().findMember(argument);
+ if (res == null || !res.exists()) {
+ throw new CoreException(
+ new Status(
+ IStatus.ERROR,
+ Activator.getPluginId(),
+ NLS.bind(
+ UIText.GitVariableResolver_VariableReferencesNonExistentResource,
+ argument)));
+ }
+ }
+ return res;
+ }
+
+ private IResource getResource() {
+ Display display = PlatformUI.getWorkbench().getDisplay();
+ if(display.getThread().equals(Thread.currentThread()))
+ return getSelectedResource();
+ else {
+ final IResource[] resource = new IResource[1];
+ display.syncExec(new Runnable() {
+ public void run() {
+ resource[0] = getSelectedResource();
+ }
+ });
+ return resource[0];
+ }
+ }
+
+ private IResource getSelectedResource() {
+ IResource resource = null;
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ IWorkbenchWindow window = null;
+ if (workbench != null)
+ window = workbench.getActiveWorkbenchWindow();
+ if(window != null) {
+ IWorkbenchPage page = window.getActivePage();
+ if(page != null) {
+ IWorkbenchPart part = page.getActivePart();
+ if(part instanceof IEditorPart) {
+ IEditorPart epart = (IEditorPart) part;
+ resource = (IResource) epart.getEditorInput().getAdapter(IResource.class);
+ }
+ else if(part != null) {
+ IWorkbenchPartSite site = part.getSite();
+ if(site != null) {
+ ISelectionProvider provider = site.getSelectionProvider();
+ if(provider != null) {
+ ISelection selection = provider.getSelection();
+ if(selection instanceof IStructuredSelection) {
+ IStructuredSelection ss = (IStructuredSelection) selection;
+ if(!ss.isEmpty()) {
+ Iterator iterator = ss.iterator();
+ while (iterator.hasNext() && resource == null) {
+ Object next = iterator.next();
+ resource = (IResource) Platform.getAdapterManager().getAdapter(next, IResource.class);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return resource;
+ }
+}

Back to the top