Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Sohn2013-01-26 00:22:04 +0000
committerGerrit Code Review @ Eclipse.org2013-01-26 00:22:04 +0000
commit09dc5c54829bac3cd591711e1118582bf6ebf682 (patch)
tree41200e321862c5ed04650dabc69896ac33a270c9 /org.eclipse.egit.ui
parenta1f3f5b18aa972c3905d8f204381731e565bf591 (diff)
parent9b872b4f7eadc4b179b16052c32ff3d1a2621ee9 (diff)
downloadegit-09dc5c54829bac3cd591711e1118582bf6ebf682.tar.gz
egit-09dc5c54829bac3cd591711e1118582bf6ebf682.tar.xz
egit-09dc5c54829bac3cd591711e1118582bf6ebf682.zip
Merge "Make all methods and states of RepositoryState testable properties"
Diffstat (limited to 'org.eclipse.egit.ui')
-rw-r--r--org.eclipse.egit.ui/plugin.xml4
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ResourcePropertyTester.java88
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/tree/RepositoriesViewPropertyTester.java5
3 files changed, 81 insertions, 16 deletions
diff --git a/org.eclipse.egit.ui/plugin.xml b/org.eclipse.egit.ui/plugin.xml
index f9c1172f6f..7a6e358eb4 100644
--- a/org.eclipse.egit.ui/plugin.xml
+++ b/org.eclipse.egit.ui/plugin.xml
@@ -4351,14 +4351,14 @@
class="org.eclipse.egit.ui.internal.repository.tree.RepositoriesViewPropertyTester"
id="org.eclipse.egit.ui.RepositoryTester"
namespace="GitRepository"
- properties="isBare,isSafe,isRefCheckedOut,isLocalBranch,fetchExists,pushExists,canMerge,canAbortRebase,isSubmodule,containsHead"
+ properties="isBare,isSafe,canCommit,canAmend,canResetHead,isRefCheckedOut,isLocalBranch,fetchExists,pushExists,canMerge,canAbortRebase,isSubmodule,containsHead"
type="org.eclipse.egit.ui.internal.repository.tree.RepositoryTreeNode">
</propertyTester>
<propertyTester
class="org.eclipse.egit.ui.internal.ResourcePropertyTester"
id="org.eclipse.egit.ui.ResourceTester"
namespace="GitResource"
- properties="isShared,isSafe,isContainer"
+ properties="isShared,isContainer,isSafe,canCommit,canAmend,canResetHead"
type="org.eclipse.core.resources.IResource">
</propertyTester>
</extension>
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ResourcePropertyTester.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ResourcePropertyTester.java
index 778a667142..95ff4af59c 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ResourcePropertyTester.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/ResourcePropertyTester.java
@@ -11,15 +11,48 @@
*******************************************************************************/
package org.eclipse.egit.ui.internal;
-import static org.eclipse.jgit.lib.RepositoryState.SAFE;
+import java.lang.reflect.Method;
import org.eclipse.core.expressions.PropertyTester;
import org.eclipse.core.resources.IResource;
import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.egit.ui.internal.trace.GitTraceLocation;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryState;
/**
- * Resource-based property tester
+ * Resource-based property tester.
+ * <p>
+ * Supported properties:
+ * <ul>
+ * <li>isShared <code>true</code> if the resource is mapped to EGit. EGit may
+ * still affect a resource if it belongs to the workspace of some shared
+ * project.</li>
+ * <li>isContainer <code>true</code> if the resource is a project or a folder</li>
+ * <li>is<em>repository state</em>
+ * <ul>
+ * <li>isSafe - see {@link RepositoryState#SAFE}</li>
+ * <li>isReverting - see {@link RepositoryState#REVERTING}</li>
+ * <li>isRevertingResolved - see {@link RepositoryState#REVERTING_RESOLVED}</li>
+ * <li>isCherryPicking - see {@link RepositoryState#CHERRY_PICKING}</li>
+ * <li>isCherryPickingResolved - see
+ * {@link RepositoryState#CHERRY_PICKING_RESOLVED}</li>
+ * <li>isMerging - see {@link RepositoryState#MERGING}</li>
+ * <li>isMergingResolved - see {@link RepositoryState#MERGING_RESOLVED}</li>
+ * <li>isRebasing - see {@link RepositoryState#REBASING}</li>
+ * <li>isRebasingRebasing - see {@link RepositoryState#REBASING_REBASING}</li>
+ * <li>isRebasingMerge - see {@link RepositoryState#REBASING_MERGE}</li>
+ * <li>isRebasingInteractive - see {@link RepositoryState#REBASING_INTERACTIVE}</li>
+ * <li>isApply - see {@link RepositoryState#APPLY}</li>
+ * <li>isBisecting - see {@link RepositoryState#BISECTING}</li>
+ * </ul>
+ * <li>Capabilities/properties of the current state:<ul>
+ * <li>canCheckout - see {@link RepositoryState#canCheckout()}</li>
+ * <li>canAmend - see {@link RepositoryState#canAmend()}</li>
+ * <li>canCommit - see {@link RepositoryState#canCommit()}</li>
+ * <li>canResetHead - see {@link RepositoryState#canResetHead()}</li>
+ * </ul>
+ * </ul>
*/
public class ResourcePropertyTester extends PropertyTester {
@@ -39,19 +72,50 @@ public class ResourcePropertyTester extends PropertyTester {
if (!(receiver instanceof IResource))
return false;
IResource res = (IResource) receiver;
- if ("isShared".equals(property)) { //$NON-NLS-1$
- RepositoryMapping mapping = RepositoryMapping.getMapping(res
- .getProject());
- return mapping != null && mapping.getRepository() != null;
- } else if ("isSafe".equals(property)) { //$NON-NLS-1$
- RepositoryMapping mapping = RepositoryMapping.getMapping(res
- .getProject());
- return mapping != null
- && SAFE == mapping.getRepository().getRepositoryState();
- } else if ("isContainer".equals(property)) { //$NON-NLS-1$
+ if ("isContainer".equals(property)) { //$NON-NLS-1$
int type = res.getType();
return type == IResource.FOLDER || type == IResource.PROJECT;
}
+
+ RepositoryMapping mapping = RepositoryMapping.getMapping(res
+ .getProject());
+ if (mapping != null) {
+ Repository repository = mapping.getRepository();
+ return testRepositoryState(repository, property);
+ }
+ return false;
+ }
+
+ /**
+ * @param repository
+ * @param property
+ * @return true if the repository is in an appropriate state. See
+ * {@link ResourcePropertyTester}
+ */
+ public static boolean testRepositoryState(Repository repository, String property) {
+ if ("isShared".equals(property)) //$NON-NLS-1$
+ return repository != null;
+ if (repository != null) {
+ // isSTATE checks repository state where STATE is the CamelCase version
+ // of the RepositoryState enum values.
+ RepositoryState state = repository.getRepositoryState();
+ if (property.length() > 3 && property.startsWith("is")) { //$NON-NLS-1$
+ // e.g. isCherryPickingResolved => CHERRY_PICKING_RESOLVED
+ String lookFor = property.substring(2,3) + property.substring(3).replaceAll("([A-Z])","_$1").toUpperCase(); //$NON-NLS-1$//$NON-NLS-2$
+ if (state.toString().equals(lookFor))
+ return true;
+ }
+ // invokes test methods of RepositoryState, canCommit etc
+ try {
+ Method method = RepositoryState.class.getMethod(property);
+ if (method.getReturnType() == boolean.class) {
+ Boolean ret = (Boolean) method.invoke(state);
+ return ret.booleanValue();
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ }
return false;
}
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/tree/RepositoriesViewPropertyTester.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/tree/RepositoriesViewPropertyTester.java
index 96568a9f5d..63225bcb34 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/tree/RepositoriesViewPropertyTester.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/tree/RepositoriesViewPropertyTester.java
@@ -14,6 +14,7 @@ import java.io.IOException;
import java.net.URISyntaxException;
import org.eclipse.core.expressions.PropertyTester;
+import org.eclipse.egit.ui.internal.ResourcePropertyTester;
import org.eclipse.egit.ui.internal.trace.GitTraceLocation;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
@@ -51,8 +52,8 @@ public class RepositoriesViewPropertyTester extends PropertyTester {
if (property.equals("containsHead")) //$NON-NLS-1$
return containsHead(node);
- if (property.equals("isSafe")) //$NON-NLS-1$
- return node.getRepository().getRepositoryState() == RepositoryState.SAFE;
+ if (ResourcePropertyTester.testRepositoryState(node.getRepository(), property))
+ return true;
if (property.equals("isRefCheckedOut")) { //$NON-NLS-1$
if (!(node.getObject() instanceof Ref))

Back to the top