Signed-off-by: Robin Rosenberg <robin.rosenberg@xxxxxxxxxx> --- .../src/org/spearce/egit/ui/Activator.java | 75 ++++++++++++++++++++ .../src/org/spearce/jgit/lib/Repository.java | 10 +++ 2 files changed, 85 insertions(+), 0 deletions(-) diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/Activator.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/Activator.java index 8d1b8cd..3e02c44 100644 --- a/org.spearce.egit.ui/src/org/spearce/egit/ui/Activator.java +++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/Activator.java @@ -10,18 +10,27 @@ package org.spearce.egit.ui; import java.net.Authenticator; import java.net.ProxySelector; +import java.util.HashSet; +import java.util.Set; import org.eclipse.core.net.proxy.IProxyService; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.ISchedulingRule; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jsch.core.IJSchService; import org.eclipse.swt.graphics.Font; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.eclipse.ui.themes.ITheme; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; +import org.spearce.egit.core.project.RepositoryMapping; +import org.spearce.jgit.lib.Repository; import org.spearce.jgit.transport.SshSessionFactory; /** @@ -127,6 +136,7 @@ public class Activator extends AbstractUIPlugin { } private boolean traceVerbose; + private RCS rcs; /** * Constructor for the egit ui plugin singleton @@ -140,6 +150,66 @@ public class Activator extends AbstractUIPlugin { traceVerbose = isOptionSet("/trace/verbose"); setupSSH(context); setupProxy(context); + setupRepoChangeScanner(); + } + + static class RCS extends Job { + RCS() { + super("Repository Change Scanner"); + } + + // FIXME, need to be more intelligent about this to avoid too much work + private static final long REPO_SCAN_INTERVAL = 10000L; + + @Override + protected IStatus run(IProgressMonitor monitor) { + try { + // A repository can contain many projects, only scan once + // (a project could in theory be distributed among many + // repositories. We discard that as being ugly and stupid for + // the moment. + IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); + monitor.beginTask("Scanning Git repositories for changes", projects.length); + Set<Repository> scanned = new HashSet<Repository>(); + for (IProject p : projects) { + RepositoryMapping mapping = RepositoryMapping.getMapping(p); + if (mapping != null) { + Repository r = mapping.getRepository(); + if (!scanned.contains(r)) { + if (monitor.isCanceled()) + break; + trace("Scanning " + r + " for changes"); + scanned.add(r); + ISchedulingRule rule = p.getWorkspace().getRuleFactory().modifyRule(p); + getJobManager().beginRule(rule, monitor); + try { + r.scanForRepoChanges(); + } finally { + getJobManager().endRule(rule); + } + } + } + monitor.worked(1); + } + monitor.done(); + trace("Rescheduling " + getName() + " job"); + schedule(REPO_SCAN_INTERVAL); + } catch (Exception e) { + trace("Stopped rescheduling " + getName() + "job"); + return new Status( + IStatus.ERROR, + getPluginId(), + 0, + "An error occurred while scanning for changes. Scanning aborted", + e); + } + return Status.OK_STATUS; + } + } + + private void setupRepoChangeScanner() { + rcs = new RCS(); + rcs.schedule(RCS.REPO_SCAN_INTERVAL); } private void setupSSH(final BundleContext context) { @@ -165,6 +235,11 @@ public class Activator extends AbstractUIPlugin { } public void stop(final BundleContext context) throws Exception { + trace("Trying to cancel " + rcs.getName() + " job"); + if (!rcs.cancel()) { + rcs.join(); + } + trace("rcs.getName() " + rcs.getName() + " cancelled ok"); super.stop(context); plugin = null; } 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 dfa3045..9b65154 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java @@ -1092,4 +1092,14 @@ public class Repository { l.indexChanged(event); } } + + /** + * Force a scan for changed refs. + * + * @throws IOException + */ + public void scanForRepoChanges() throws IOException { + getAllRefs(); // This will look for changes to refs + getIndex(); // This will detect changes in the index + } } -- 1.5.6.2.220.g44701 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html