Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.egit.core/src/org/eclipse/egit/core/op/AssumeUnchangedOperation.java')
-rw-r--r--org.eclipse.egit.core/src/org/eclipse/egit/core/op/AssumeUnchangedOperation.java125
1 files changed, 125 insertions, 0 deletions
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/op/AssumeUnchangedOperation.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/AssumeUnchangedOperation.java
new file mode 100644
index 0000000000..21d6d9dc36
--- /dev/null
+++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/op/AssumeUnchangedOperation.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (C) 2007, Robin Rosenberg <robin.rosenberg@dewire.com>
+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
+ * Copyright (C) 2008, Google Inc.
+ *
+ * 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.core.op;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.IdentityHashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.egit.core.Activator;
+import org.eclipse.egit.core.CoreText;
+import org.eclipse.egit.core.project.GitProjectData;
+import org.eclipse.egit.core.project.RepositoryMapping;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.lib.Repository;
+
+/**
+ * Tell JGit to ignore changes in selected files
+ */
+public class AssumeUnchangedOperation implements IWorkspaceRunnable {
+ private final Collection rsrcList;
+
+ private final IdentityHashMap<Repository, DirCache> caches;
+
+ private final IdentityHashMap<RepositoryMapping, Object> mappings;
+
+ /**
+ * Create a new operation to ignore changes in tracked files
+ *
+ * @param rsrcs
+ * collection of {@link IResource}s which should be ignored when
+ * looking for changes or committing.
+ */
+ public AssumeUnchangedOperation(final Collection rsrcs) {
+ rsrcList = rsrcs;
+ caches = new IdentityHashMap<Repository, DirCache>();
+ mappings = new IdentityHashMap<RepositoryMapping, Object>();
+ }
+
+ public void run(IProgressMonitor m) throws CoreException {
+ if (m == null)
+ m = new NullProgressMonitor();
+
+ caches.clear();
+ mappings.clear();
+
+ m.beginTask(CoreText.AssumeUnchangedOperation_adding,
+ rsrcList.size() * 200);
+ try {
+ for (Object obj : rsrcList) {
+ obj = ((IAdaptable) obj).getAdapter(IResource.class);
+ if (obj instanceof IResource)
+ assumeValid((IResource) obj);
+ m.worked(200);
+ }
+
+ for (Map.Entry<Repository, DirCache> e : caches.entrySet()) {
+ final Repository db = e.getKey();
+ final DirCache editor = e.getValue();
+ m.setTaskName("Writing index for " + db.getDirectory());
+ editor.write();
+ editor.commit();
+ }
+ } catch (RuntimeException e) {
+ throw Activator.error(CoreText.UntrackOperation_failed, e);
+ } catch (IOException e) {
+ throw Activator.error(CoreText.UntrackOperation_failed, e);
+ } finally {
+ for (final RepositoryMapping rm : mappings.keySet())
+ rm.fireRepositoryChanged();
+ caches.clear();
+ mappings.clear();
+ m.done();
+ }
+ }
+
+ private void assumeValid(final IResource resource) throws CoreException {
+ final IProject proj = resource.getProject();
+ final GitProjectData pd = GitProjectData.get(proj);
+ if (pd == null)
+ return;
+ final RepositoryMapping rm = pd.getRepositoryMapping(resource);
+ if (rm == null)
+ return;
+ final Repository db = rm.getRepository();
+
+ DirCache cache = caches.get(db);
+ if (cache == null) {
+ try {
+ cache = DirCache.lock(db);
+ } catch (IOException err) {
+ throw Activator.error(CoreText.UntrackOperation_failed, err);
+ }
+ caches.put(db, cache);
+ mappings.put(rm, rm);
+ }
+
+ final String path = rm.getRepoRelativePath(resource);
+ if (resource instanceof IContainer) {
+ for (final DirCacheEntry ent : cache.getEntriesWithin(path))
+ ent.setAssumeValid(true);
+ } else {
+ final DirCacheEntry ent = cache.getEntry(path);
+ if (ent != null)
+ ent.setAssumeValid(true);
+ }
+ }
+}

Back to the top