# [EGIT PATCH] git property page for project properties.

6 messages from 2008-10-20 to 2008-10-21. Participants: Tomi Pakarinen, Robin Rosenberg.
Thread: https://gitlist.dev/t/15979

## Tomi Pakarinen, 2008-10-20 19:06

Subject: [EGIT PATCH] git property page for project properties.
Message-ID: <1224529604-42397-1-git-send-email-tomi.pakarinen@iki.fi>
URL: https://gitlist.dev/e/1224529604-42397-1-git-send-email-tomi.pakarinen%40iki.fi

```
 Show git property page in project's properties, if project
has git repository provider.

Signed-off-by: Tomi Pakarinen <tomi.pakarinen@iki.fi>
---

 This is similar to CVS's property page. Current
information on page is very limited and non editable.

 Tomi.

 org.spearce.egit.ui/plugin.properties              |    2 +
 org.spearce.egit.ui/plugin.xml                     |   13 ++
 .../preferences/GitProjectPropertyPage.java        |  147 ++++++++++++++++++++
 3 files changed, 162 insertions(+), 0 deletions(-)
 create mode 100644 org.spearce.egit.ui/src/org/spearce/egit/ui/internal/preferences/GitProjectPropertyPage.java

diff --git a/org.spearce.egit.ui/plugin.properties b/org.spearce.egit.ui/plugin.properties
index da91e48..fa043f1 100644
--- a/org.spearce.egit.ui/plugin.properties
+++ b/org.spearce.egit.ui/plugin.properties
@@ -1,6 +1,8 @@
 plugin_name=Git Team Provider (UI)
 provider_name=spearce.org
 
+Git=Git
+
 Git_clone_category=Git
 Git_clone_wizard=Git Repository
 Git_clone_description=Clone an existing Git repository.
diff --git a/org.spearce.egit.ui/plugin.xml b/org.spearce.egit.ui/plugin.xml
index ee8a5a0..e6e3762 100644
--- a/org.spearce.egit.ui/plugin.xml
+++ b/org.spearce.egit.ui/plugin.xml
@@ -194,6 +194,19 @@
             id="org.spearce.egit.ui.internal.preferences.WindowCachePreferencePage" />
    </extension>
 
+   <extension point="org.eclipse.ui.propertyPages">
+      <page
+            objectClass="org.eclipse.core.resources.IProject"
+            adaptable="true"
+            name="%Git"
+            class="org.spearce.egit.ui.internal.preferences.GitProjectPropertyPage"
+            id="org.spearce.egit.ui.preferences.GitProjectPropertyPage">
+         <filter
+               name="projectPersistentProperty"
+               value="org.eclipse.team.core.repository=org.spearce.egit.core.GitProvider">
+         </filter>
+      </page>
+   </extension>
    <extension point="org.eclipse.ui.decorators">
       <decorator
             lightweight="true"
diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/preferences/GitProjectPropertyPage.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/preferences/GitProjectPropertyPage.java
new file mode 100644
index 0000000..fd7e14a
--- /dev/null
+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/preferences/GitProjectPropertyPage.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (C) 2008, Tomi Pakarinen <tomi.pakarinen@iki.fi>
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * See LICENSE for the full license text, also available.
+ *******************************************************************************/
+package org.spearce.egit.ui.internal.preferences;
+
+import java.io.IOException;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.spearce.egit.core.project.RepositoryMapping;
+import org.spearce.jgit.lib.ObjectId;
+import org.spearce.jgit.lib.Repository;
+
+/**
+ * Property page to be shown in project properties, if project is shared using
+ * git provider. Currently there aren't any modifiable element.
+ */
+public class GitProjectPropertyPage extends PropertyPage {
+
+	Text gitDir;
+
+	Text branch;
+
+	Text id;
+
+	Text state;
+
+	Text workDir;
+
+	@Override
+	protected Control createContents(Composite parent) {
+		final Composite composite = new Composite(parent, SWT.NULL);
+
+		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+		final GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		layout.horizontalSpacing = 0;
+		layout.verticalSpacing = 0;
+		composite.setLayout(layout);
+
+		gitDir = createLabeledReadOnlyText(composite, "Git directory:");
+		workDir = createLabeledReadOnlyText(composite, "Working directory:");
+		branch = createLabeledReadOnlyText(composite, "Branch:");
+		id = createLabeledReadOnlyText(composite, "Id:");
+		state = createLabeledReadOnlyText(composite, "Current state:");
+
+		// Get the project that is the source of this property page
+		IProject project = null;
+		final IAdaptable element = getElement();
+		if (element instanceof IProject) {
+			project = (IProject) element;
+		} else {
+			Object adapter = element.getAdapter(IProject.class);
+			if (adapter instanceof IProject) {
+				project = (IProject) adapter;
+			}
+		}
+
+		Repository repository = RepositoryMapping.getMapping(project)
+				.getRepository();
+
+		if (repository != null) {
+			try {
+				fillValues(repository);
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+
+		return composite;
+	}
+
+	private void fillValues(Repository repository) throws IOException {
+		gitDir.setText(repository.getDirectory().getAbsolutePath());
+		branch.setText(repository.getBranch());
+		workDir.setText(repository.getWorkDir().getAbsolutePath());
+
+		switch (repository.getRepositoryState()) {
+		case BISECTING:
+			state.setText("Bisecting");
+			break;
+		case MERGING:
+			state.setText("Merging");
+			break;
+		case REBASING:
+			state.setText("Rebasing");
+			break;
+		case REBASING_INTERACTIVE:
+			state.setText("Rebasing interactive");
+			break;
+		case REBASING_MERGE:
+			state.setText("Rebasing merge");
+			break;
+		case SAFE:
+			state.setText("Safe");
+			break;
+		}
+
+		final ObjectId objectId = repository
+				.resolve(repository.getFullBranch());
+		id.setText(objectId.name());
+	}
+
+	/**
+	 * Create a read only text field with a label
+	 * 
+	 * @param parent
+	 *            the parent composite for new widgets
+	 * @param labelText
+	 *            text for label
+	 * @return the new read only text field
+	 */
+	protected Text createLabeledReadOnlyText(Composite parent,
+			final String labelText) {
+		Label label = new Label(parent, SWT.LEFT);
+		label.setText(labelText);
+		GridData data = new GridData();
+		data.horizontalSpan = 1;
+		data.horizontalAlignment = GridData.FILL;
+		label.setLayoutData(data);
+
+		Text text = new Text(parent, SWT.LEFT | SWT.READ_ONLY);
+		text.setBackground(Display.getDefault().getSystemColor(
+				SWT.COLOR_WIDGET_BACKGROUND));
+		data = new GridData();
+		data.horizontalSpan = 1;
+		data.horizontalAlignment = GridData.FILL;
+		text.setLayoutData(data);
+		return text;
+	}
+
+}
-- 
1.6.0.2

```

## Robin Rosenberg, 2008-10-21 05:37

Subject: Re: [EGIT PATCH] git property page for project properties.
Message-ID: <200810210737.31377.robin.rosenberg.lists@dewire.com>
URL: https://gitlist.dev/e/200810210737.31377.robin.rosenberg.lists%40dewire.com
In-Reply-To: <1224529604-42397-1-git-send-email-tomi.pakarinen@iki.fi>

```
måndagen den 20 oktober 2008 21.06.44 skrev Tomi Pakarinen:
>  Show git property page in project's properties, if project
> has git repository provider.
> 
> Signed-off-by: Tomi Pakarinen <tomi.pakarinen@iki.fi>
> ---
> 
>  This is similar to CVS's property page. Current
> information on page is very limited and non editable.
> 
>  Tomi.
> 
> +	Text gitDir;
> +
> +	Text branch;
> +
> +	Text id;
> +
> +	Text state;
> +
> +	Text workDir;

Should be private. I'll squash that in and patch Egit to detect
the 1.6-way of recording repository state, which I noted it does
not handle.

-- robin

```

## Robin Rosenberg, 2008-10-21 17:50

Subject: Re: [EGIT PATCH] git property page for project properties.
Message-ID: <200810211950.50540.robin.rosenberg.lists@dewire.com>
URL: https://gitlist.dev/e/200810211950.50540.robin.rosenberg.lists%40dewire.com
In-Reply-To: <1224529604-42397-1-git-send-email-tomi.pakarinen@iki.fi>

```
måndagen den 20 oktober 2008 21.06.44 skrev Tomi Pakarinen:
>  Show git property page in project's properties, if project
> has git repository provider.
[...]
> +		switch (repository.getRepositoryState()) {
> +		case BISECTING:
> +			state.setText("Bisecting");
> +			break;
> +		case MERGING:
> +			state.setText("Merging");
> +			break;
> +		case REBASING:
> +			state.setText("Rebasing");
> +			break;
> +		case REBASING_INTERACTIVE:
> +			state.setText("Rebasing interactive");
> +			break;
> +		case REBASING_MERGE:
> +			state.setText("Rebasing merge");
> +			break;
> +		case SAFE:
> +			state.setText("Safe");
> +			break;
> +		}
Why not this:

		state.setText(repository.getRepositoryState().getDescription());

Description is ment for presentation purposes. The enum for code.

-- robin

```

## Tomi Pakarinen, 2008-10-21 18:09

Subject: Re: [EGIT PATCH] git property page for project properties.
Message-ID: <f299b4f30810211109q7f2919f2r1d5cd8faf0048154@mail.gmail.com>
URL: https://gitlist.dev/e/f299b4f30810211109q7f2919f2r1d5cd8faf0048154%40mail.gmail.com
In-Reply-To: <200810211950.50540.robin.rosenberg.lists@dewire.com>

```
On Tue, Oct 21, 2008 at 8:50 PM, Robin Rosenberg
<robin.rosenberg.lists@dewire.com> wrote:
> måndagen den 20 oktober 2008 21.06.44 skrev Tomi Pakarinen:
>>  Show git property page in project's properties, if project
>> has git repository provider.
> [...]
>> +             switch (repository.getRepositoryState()) {
>> +             case BISECTING:
>> +                     state.setText("Bisecting");
>> +                     break;
>> +             case MERGING:
>> +                     state.setText("Merging");
>> +                     break;
>> +             case REBASING:
>> +                     state.setText("Rebasing");
>> +                     break;
>> +             case REBASING_INTERACTIVE:
>> +                     state.setText("Rebasing interactive");
>> +                     break;
>> +             case REBASING_MERGE:
>> +                     state.setText("Rebasing merge");
>> +                     break;
>> +             case SAFE:
>> +                     state.setText("Safe");
>> +                     break;
>> +             }
> Why not this:
>
>                state.setText(repository.getRepositoryState().getDescription());
>
> Description is ment for presentation purposes. The enum for code.
>
> -- robin
>

 That is ok. I just didn't notice that method before. But, what if
someone wants localize this plugin, he'll propably have to explode
this back to switch statement.

   Tomi.

```

## Robin Rosenberg, 2008-10-21 19:13

Subject: Re: [EGIT PATCH] git property page for project properties.
Message-ID: <200810212113.30414.robin.rosenberg.lists@dewire.com>
URL: https://gitlist.dev/e/200810212113.30414.robin.rosenberg.lists%40dewire.com
In-Reply-To: <f299b4f30810211109q7f2919f2r1d5cd8faf0048154@mail.gmail.com>

```
tisdagen den 21 oktober 2008 20.09.13 skrev Tomi Pakarinen:
>  That is ok. I just didn't notice that method before. But, what if
> someone wants localize this plugin, he'll propably have to explode
> this back to switch statement.

No, we'd localize getDescription().

-- robin

```

## Robin Rosenberg, 2008-10-21 20:13

Subject: [JGIT PATCH] Detect repository states according to post Git 1.5
Message-ID: <200810212213.42294.robin.rosenberg.lists@dewire.com>
URL: https://gitlist.dev/e/200810212213.42294.robin.rosenberg.lists%40dewire.com
In-Reply-To: <f299b4f30810211109q7f2919f2r1d5cd8faf0048154@mail.gmail.com>

```
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---

Seems we need this patch too in order to detect repository states. The new
resolution is more granular that before, though I suggest that one should
be restrictive when interpreting the state and not assume that these states
are the only ones. The methods on RepositoryState are the /only/ valid
ways of deciding what to, or not to, do. This implies we need to extend this
class somewhat, but I'm no hurry yet so we can think about what methods
we need.

 .../src/org/spearce/jgit/lib/Repository.java       |   17 +++++++++++++
 .../src/org/spearce/jgit/lib/RepositoryState.java  |   25 +++++++++++++++++++-
 2 files changed, 41 insertions(+), 1 deletions(-)

diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
index dfce1b8..26748e2 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
@@ -1017,14 +1017,31 @@ public GitIndex getIndex() throws IOException {
 	 * @return an important state
 	 */
 	public RepositoryState getRepositoryState() {
+		// Pre Git-1.6 logic
 		if (new File(getWorkDir(), ".dotest").exists())
 			return RepositoryState.REBASING;
 		if (new File(gitDir,".dotest-merge").exists())
 			return RepositoryState.REBASING_INTERACTIVE;
+
+		// From 1.6 onwards
+		if (new File(getDirectory(),"rebase-apply/rebasing").exists())
+			return RepositoryState.REBASING_REBASING;
+		if (new File(getDirectory(),"rebase-apply/applying").exists())
+			return RepositoryState.APPLY;
+		if (new File(getDirectory(),"rebase-apply").exists())
+			return RepositoryState.REBASING;
+
+		if (new File(getDirectory(),"rebase-merge/interactive").exists())
+			return RepositoryState.REBASING_INTERACTIVE;
+		if (new File(getDirectory(),"rebase-merge").exists())
+			return RepositoryState.REBASING_MERGE;
+
+		// Both versions
 		if (new File(gitDir,"MERGE_HEAD").exists())
 			return RepositoryState.MERGING;
 		if (new File(gitDir,"BISECT_LOG").exists())
 			return RepositoryState.BISECTING;
+
 		return RepositoryState.SAFE;
 	}
 
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryState.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryState.java
index c32c381..a916924 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryState.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryState.java
@@ -40,6 +40,9 @@
 /**
  * Important state of the repository that affects what can and cannot bed
  * done. This is things like unhandled conflicted merges and unfinished rebase.
+ *
+ * The granularity and set of states are somewhat arbitrary. The methods
+ * on the state are the only supported means of deciding what to do.
  */
 public enum RepositoryState {
 	/**
@@ -62,7 +65,7 @@
 	},
 
 	/**
-	 * An unfinished rebase. Must resolve, skip or abort before normal work can take place
+	 * An unfinished rebase or am. Must resolve, skip or abort before normal work can take place
 	 */
 	REBASING {
 		public boolean canCheckout() { return false; }
@@ -72,6 +75,26 @@
 	},
 
 	/**
+	 * An unfinished rebase. Must resolve, skip or abort before normal work can take place
+	 */
+	REBASING_REBASING {
+		public boolean canCheckout() { return false; }
+		public boolean canResetHead() { return false; }
+		public boolean canCommit() { return true; }
+		public String getDescription() { return "Rebase"; }
+	},
+
+	/**
+	 * An unfinished apply. Must resolve, skip or abort before normal work can take place
+	 */
+	APPLY {
+		public boolean canCheckout() { return false; }
+		public boolean canResetHead() { return false; }
+		public boolean canCommit() { return true; }
+		public String getDescription() { return "Apply mailbox"; }
+	},
+
+	/**
 	 * An unfinished rebase with merge. Must resolve, skip or abort before normal work can take place
 	 */
 	REBASING_MERGE {
-- 
1.6.0.2.308.gef4a

```
