[EGit PATCH] IgnoreAction to add to .gitignore files
diff --git a/org.spearce.egit.ui/plugin.properties b/org.spearce.egit.ui/plugin.properties
index 523a959..be3b40c 100644
--- a/org.spearce.egit.ui/plugin.properties
+++ b/org.spearce.egit.ui/plugin.properties
@@ -52,10 +52,12 @@ FetchAction_tooltip=Fetch from another repository
PushAction_label=&Push To...
PushAction_tooltip=Push to another repository
+IgnoreAction_label=Add to .git&ignore...
+IgnoreAction_tooltip=Ignore the selected resources
+
GitActions_label=Git
GitMenu_label=&Git
-
Theme_label=Git
Theme_CommitGraphNormalFont_label=Commit graph normal font
Theme_CommitGraphNormalFont_description=This font is used to draw the revision history.
diff --git a/org.spearce.egit.ui/plugin.xml b/org.spearce.egit.ui/plugin.xml
index a94c8bc..1f62292 100644
--- a/org.spearce.egit.ui/plugin.xml
+++ b/org.spearce.egit.ui/plugin.xml
@@ -115,6 +115,12 @@
menubarPath="compareWithMenu/gitCompareWithGroup"
tooltip="&CompareWithIndexAction_tooltip">
</action>
+ <action
+ class="org.spearce.egit.ui.internal.actions.IgnoreAction"
+ id="org.spearce.egit.ui.internal.actions.IgnoreAction"
+ label="%IgnoreAction_label"
+ menubarPath="team.main/group1"
+ tooltip="%IgnoreAction_tooltip"/>
</objectContribution>
<objectContribution
id="org.spearce.egit.ui.resetto"
diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/IgnoreAction.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/IgnoreAction.java
new file mode 100644
index 0000000..501443e
--- /dev/null
+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/IgnoreAction.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (C) 2009, Alex Blewitt <alex.blewitt@gmail.com>
+ *
+ * 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.actions;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.WorkspaceJob;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.team.core.Team;
+import org.spearce.jgit.lib.Constants;
+
+/**
+ * Action for ignoring files via .gitignore
+ *
+ */
+public class IgnoreAction extends RepositoryAction {
+
+ private static final String GITIGNORE = ".gitignore";
+
+ @SuppressWarnings("restriction")
+ @Override
+ public void run(IAction action) {
+ final IResource[] resources = getSelectedResources();
+ if (resources.length == 0)
+ return;
+
+ WorkspaceJob job = new WorkspaceJob("Ignore Git resources") { //$NON-NLS-1$
+ public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
+ monitor.beginTask("Ignoring Git resources", resources.length); //$NON-NLS-1$
+ try {
+ for (IResource resource : resources) {
+ // TODO This is pretty inefficient; multiple ignores in the same directory cause multiple writes.
+ // NB This does the same thing in DecoratableResourceAdapter, but neither currently consult .gitignore
+ if (!Team.isIgnoredHint(resource)) {
+ IContainer container = resource.getParent();
+ IFile gitignore = container.getFile(new Path(GITIGNORE));
+ String entry = "/" + resource.getName() + "\n"; //$NON-NLS-1$ //$NON-NLS-2$
+ // TODO What is the character set and new-line convention?
+ if(gitignore.exists()) {
+ // This is ugly. CVS uses an internal representation of the .gitignore to re-write/overwrite each time.
+ ByteArrayOutputStream out = new ByteArrayOutputStream(2048);
+ out.write(entry.getBytes(Constants.CHARACTER_ENCODING)); // TODO Default encoding?
+ gitignore.appendContents(new ByteArrayInputStream(out.toByteArray()),true,true,monitor);
+ } else {
+ ByteArrayInputStream bais = new ByteArrayInputStream( entry.getBytes(Constants.CHARACTER_ENCODING) );
+ gitignore.create( bais,true,monitor);
+ }
+ }
+ monitor.worked(1);
+ }
+ monitor.done();
+ } catch (CoreException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new CoreException(new Status(IStatus.ERROR, "org.spearce.egit.ui", "Unable to ignore resources", e)); //$NON-NLS-1$
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ job.schedule();
+ }
+
+ @SuppressWarnings("restriction")
+ @Override
+ public boolean isEnabled() {
+ if (getProjectsInRepositoryOfSelectedResources().length == 0)
+ return false;
+
+ IResource[] resources = getSelectedResources();
+ for (IResource resource : resources) {
+ // NB This does the same thing in DecoratableResourceAdapter, but neither currently consult .gitignore
+ if (!Team.isIgnoredHint(resource))
+ return true;
+ }
+ return false;
+ }
+}