From 09e88ca690cadc811a979b3a1df4a8a10782984e Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Fri, 28 Jul 2006 01:18:04 -0400 Subject: [PATCH] Added checkingpoint job. Patch: Prototype-Implementation --- .../src/org/spearce/egit/core/Activator.java | 6 + .../src/org/spearce/egit/core/CoreText.java | 12 ++ .../src/org/spearce/egit/core/coretext.properties | 9 +- .../egit/core/project/CheckpointClockJob.java | 24 +++ .../spearce/egit/core/project/CheckpointJob.java | 229 +++++++++++++++++++++ .../egit/core/project/EnqueueWriteTree.java | 81 ++++++++ .../spearce/egit/core/project/GitProjectData.java | 159 ++++++++------ .../egit/core/project/RepositoryMapping.java | 106 +++++++--- .../egit/ui/internal/actions/Disconnect.java | 6 + .../egit/ui/internal/sharing/SharingWizard.java | 3 + .../src/org/spearce/jgit/lib/ObjectWriter.java | 7 +- 11 files changed, 546 insertions(+), 96 deletions(-) create mode 100644 org.spearce.egit.core/src/org/spearce/egit/core/project/CheckpointClockJob.java create mode 100644 org.spearce.egit.core/src/org/spearce/egit/core/project/CheckpointJob.java create mode 100644 org.spearce.egit.core/src/org/spearce/egit/core/project/EnqueueWriteTree.java diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/Activator.java b/org.spearce.egit.core/src/org/spearce/egit/core/Activator.java index 6253e8cf..284da8f7 100644 --- a/org.spearce.egit.core/src/org/spearce/egit/core/Activator.java +++ b/org.spearce.egit.core/src/org/spearce/egit/core/Activator.java @@ -6,6 +6,7 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Plugin; import org.eclipse.core.runtime.Status; import org.osgi.framework.BundleContext; +import org.spearce.egit.core.project.CheckpointClockJob; import org.spearce.egit.core.project.GitProjectData; public class Activator extends Plugin @@ -53,6 +54,8 @@ public class Activator extends Plugin } } + private CheckpointClockJob checkpointClock; + private boolean traceVerbose; public Activator() @@ -63,12 +66,15 @@ public class Activator extends Plugin public void start(final BundleContext context) throws Exception { super.start(context); + checkpointClock = new CheckpointClockJob(); + checkpointClock.schedule(60 * 1000); traceVerbose = isOptionSet("/trace/verbose"); GitProjectData.attachToWorkspace(true); } public void stop(final BundleContext context) throws Exception { + checkpointClock.cancel(); GitProjectData.detachFromWorkspace(); super.stop(context); plugin = null; diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/CoreText.java b/org.spearce.egit.core/src/org/spearce/egit/core/CoreText.java index 3206ab5a..3525b968 100644 --- a/org.spearce.egit.core/src/org/spearce/egit/core/CoreText.java +++ b/org.spearce.egit.core/src/org/spearce/egit/core/CoreText.java @@ -42,6 +42,18 @@ public class CoreText extends NLS public static String Error_CanonicalFile; + public static String CheckpointJob_writing; + + public static String CheckpointJob_name; + + public static String CheckpointJob_writingBlobs; + + public static String CheckpointJob_writingTrees; + + public static String CheckpointJob_writingRef; + + public static String CheckpointJob_failed; + static { final Class c = CoreText.class; diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/coretext.properties b/org.spearce.egit.core/src/org/spearce/egit/core/coretext.properties index b8767167..3e0bf7f9 100644 --- a/org.spearce.egit.core/src/org/spearce/egit/core/coretext.properties +++ b/org.spearce.egit.core/src/org/spearce/egit/core/coretext.properties @@ -26,4 +26,11 @@ The folder cannot be moved, renamed or deleted until the team provider is discon MoveDeleteHook_operationError=Error updating cache during move/delete.\n\ The resource cannot be moved, renamed or deleted due to an internal error. -Error_CanonicalFile=Unable to determine a canonical file path. \ No newline at end of file +Error_CanonicalFile=Unable to determine a canonical file path. + +CheckpointJob_name=GIT checkpoint: {0} +CheckpointJob_writing=Writing +CheckpointJob_writingBlobs=modified blobs +CheckpointJob_writingTrees=modified trees +CheckpointJob_writingRef=updating workspace ref +CheckpointJob_failed=Failed to write modified objects. \ No newline at end of file diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/project/CheckpointClockJob.java b/org.spearce.egit.core/src/org/spearce/egit/core/project/CheckpointClockJob.java new file mode 100644 index 00000000..64dfc98f --- /dev/null +++ b/org.spearce.egit.core/src/org/spearce/egit/core/project/CheckpointClockJob.java @@ -0,0 +1,24 @@ +package org.spearce.egit.core.project; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; + +public class CheckpointClockJob extends Job +{ + public CheckpointClockJob() + { + super("BLAH"); + setPriority(LONG); + setSystem(true); + setRule(null); + } + + protected IStatus run(final IProgressMonitor monitor) + { + GitProjectData.checkpointAllProjects(); + schedule(15 * 1000); + return Status.OK_STATUS; + } +} diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/project/CheckpointJob.java b/org.spearce.egit.core/src/org/spearce/egit/core/project/CheckpointJob.java new file mode 100644 index 00000000..8f708925 --- /dev/null +++ b/org.spearce.egit.core/src/org/spearce/egit/core/project/CheckpointJob.java @@ -0,0 +1,229 @@ +package org.spearce.egit.core.project; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.ISchedulingRule; +import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.core.runtime.jobs.MultiRule; +import org.spearce.egit.core.Activator; +import org.spearce.egit.core.CoreText; +import org.spearce.jgit.lib.FileTreeEntry; +import org.spearce.jgit.lib.ObjectWriter; +import org.spearce.jgit.lib.Tree; +import org.spearce.jgit.lib.TreeEntry; + +public class CheckpointJob extends Job +{ + private static final Object EXISTS = new Object(); + + private static final int MB = 1024 * 1024; + + private final Set blobQueue; + + private final Collection blobRules; + + private final Map treeQueue; + + private final ObjectWriter ow; + + private final RepositoryMapping rm; + + private long byteCnt; + + private int objectCnt; + + public CheckpointJob(final RepositoryMapping m) + { + super(CoreText.bind(CoreText.CheckpointJob_name, m.getContainer() + .getFullPath())); + setPriority(Job.LONG); + + blobQueue = new HashSet(); + blobRules = new ArrayList(); + treeQueue = new LinkedHashMap(); + ow = new ObjectWriter(m.getRepository()); + rm = m; + } + + public void scheduleIfNecessary() + { + if (!blobQueue.isEmpty() || !treeQueue.isEmpty()) + { + final ISchedulingRule[] r = new ISchedulingRule[blobRules.size()]; + blobRules.toArray(r); + setRule(MultiRule.combine(r)); + trace("scheduling"); + schedule(); + } + } + + public void enqueue( + final ISchedulingRule rule, + final File s, + final FileTreeEntry e) + { + if (rule != null && e.isModified() && s.canRead()) + { + if (blobQueue.add(new QueuedBlob(s, e))) + { + blobRules.add(rule); + byteCnt += s.length(); + objectCnt++; + } + } + } + + public void enqueue(final Tree t) + { + if (t.isModified()) + { + if (treeQueue.put(t, EXISTS) == null) + { + objectCnt++; + } + } + } + + protected IStatus run(IProgressMonitor monitor) + { + if (monitor == null) + { + monitor = new NullProgressMonitor(); + } + + trace("running"); + monitor.beginTask(CoreText.CheckpointJob_writing, (int) (byteCnt / MB) + + objectCnt); + try + { + Iterator i; + boolean wroteSomething; + + monitor.subTask(CoreText.CheckpointJob_writingBlobs); + i = blobQueue.iterator(); + while (i.hasNext()) + { + if (monitor.isCanceled()) + { + trace("canceled"); + return Status.CANCEL_STATUS; + } + + final QueuedBlob q = (QueuedBlob) i.next(); + synchronized (q.ent) + { + if (q.ent.isModified() && q.src.canRead()) + { + q.ent.setId(ow.writeBlob(q.src)); + } + } + monitor.worked((int) (q.src.length() / MB) + 1); + } + + monitor.subTask(CoreText.CheckpointJob_writingTrees); + wroteSomething = true; + while (!treeQueue.isEmpty() && wroteSomething) + { + i = treeQueue.keySet().iterator(); + wroteSomething = false; + PICK_TREE: while (i.hasNext()) + { + if (monitor.isCanceled()) + { + trace("canceled"); + return Status.CANCEL_STATUS; + } + + final Tree t = (Tree) i.next(); + synchronized (t) + { + if (t.isModified()) + { + final TreeEntry[] m = t.members(); + for (int p = 0; p < m.length; p++) + { + if (m[p].isModified()) + { + continue PICK_TREE; + } + } + t.setId(ow.writeTree(t)); + } + } + wroteSomething = true; + monitor.worked(1); + i.remove(); + } + } + + synchronized (rm) + { + if (!rm.getCacheTree().isModified()) + { + monitor.subTask(CoreText.CheckpointJob_writingRef); + trace("writing ref"); + rm.saveCache(); + } + else + { + trace("tree is still dirty; ref can't be written"); + } + } + } + catch (IOException ioe) + { + return Activator.error(CoreText.CheckpointJob_failed, ioe) + .getStatus(); + } + finally + { + trace("done"); + monitor.done(); + } + + return Status.OK_STATUS; + } + + private void trace(final String m) + { + Activator.trace("(CheckpointJob " + + rm.getContainer().getFullPath() + + ") " + + m); + } + + private static class QueuedBlob + { + final File src; + + final FileTreeEntry ent; + + QueuedBlob(final File s, final FileTreeEntry e) + { + src = s; + ent = e; + } + + public int hashCode() + { + return ent.hashCode(); + } + + public boolean equals(final Object o) + { + return ent.equals(((QueuedBlob) o).ent); + } + } +} diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/project/EnqueueWriteTree.java b/org.spearce.egit.core/src/org/spearce/egit/core/project/EnqueueWriteTree.java new file mode 100644 index 00000000..41ed08c4 --- /dev/null +++ b/org.spearce.egit.core/src/org/spearce/egit/core/project/EnqueueWriteTree.java @@ -0,0 +1,81 @@ +package org.spearce.egit.core.project; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IResource; +import org.spearce.jgit.errors.SymlinksNotSupportedException; +import org.spearce.jgit.lib.FileTreeEntry; +import org.spearce.jgit.lib.SymlinkTreeEntry; +import org.spearce.jgit.lib.Tree; +import org.spearce.jgit.lib.TreeVisitorWithCurrentDirectory; + +public class EnqueueWriteTree extends TreeVisitorWithCurrentDirectory +{ + private final CheckpointJob queue; + + private final ArrayList stack; + + private IContainer currentContainer; + + public EnqueueWriteTree( + final IContainer sourceContainer, + final CheckpointJob q) + { + super(sourceContainer.getLocation().toFile()); + queue = q; + stack = new ArrayList(16); + currentContainer = sourceContainer; + } + + public void visitFile(final FileTreeEntry f) + { + final String name = f.getName(); + queue.enqueue(currentContainer.findMember(name), new File( + getCurrentDirectory(), + name), f); + } + + public void visitSymlink(final SymlinkTreeEntry s) throws IOException + { + if (s.isModified()) + { + throw new SymlinksNotSupportedException("Symlink \"" + + s.getFullName() + + "\" cannot be written as the link target" + + " cannot be read from within Java."); + } + } + + public void startVisitTree(final Tree t) throws IOException + { + super.startVisitTree(t); + stack.add(currentContainer); + if (!t.isRoot()) + { + final IResource r = currentContainer.findMember(t.getName()); + if (r instanceof IContainer) + { + currentContainer = (IContainer) r; + } + else + { + currentContainer = (IContainer) r.getAdapter(IContainer.class); + if (currentContainer == null) + { + throw new IOException("What was a tree, now isn't: " + + t.getFullName()); + } + } + } + } + + public void endVisitTree(final Tree t) throws IOException + { + super.endVisitTree(t); + queue.enqueue(t); + currentContainer = (IContainer) stack.remove(stack.size() - 1); + } +} diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java b/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java index 2e656290..f6f8ad98 100644 --- a/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java +++ b/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java @@ -32,6 +32,7 @@ import org.spearce.egit.core.CoreText; import org.spearce.egit.core.GitProvider; import org.spearce.jgit.lib.FileTreeEntry; import org.spearce.jgit.lib.Repository; +import org.spearce.jgit.lib.Tree; import org.spearce.jgit.lib.TreeEntry; public class GitProjectData @@ -118,6 +119,15 @@ public class GitProjectData d.delete(); } + public static synchronized void checkpointAllProjects() + { + final Iterator i = projectDataCache.values().iterator(); + while (i.hasNext()) + { + ((GitProjectData) i.next()).checkpointIfNecessary(); + } + } + private static void trace(final String m) { Activator.trace("(GitProjectData) " + m); @@ -247,58 +257,6 @@ public class GitProjectData return (RepositoryMapping) c2mapping.get(r); } - public TreeEntry findMember(IResource r) throws CoreException - { - String s = null; - RepositoryMapping m = null; - - while (r != null) - { - m = getRepositoryMapping(r); - if (m != null) - { - break; - } - - if (s != null) - { - s = r.getName() + "/" + s; - } - else - { - s = r.getName(); - } - - r = r.getParent(); - } - - if (m == null) - { - return null; - } - else if (s == null) - { - return m.getCacheTree(); - } - else if (m.getCacheTree() != null) - { - try - { - return m.getCacheTree().findMember(s); - } - catch (IOException ioe) - { - throw Activator.error( - CoreText.GitProjectData_lazyResolveFailed, - ioe); - } - } - else - { - return null; - } - } - public TreeEntry[] getActiveDiffTreeEntries(IResource r) throws CoreException { @@ -342,6 +300,15 @@ public class GitProjectData return null; } + public void checkpointIfNecessary() + { + final Iterator i = c2mapping.values().iterator(); + while (i.hasNext()) + { + ((RepositoryMapping) i.next()).checkpointIfNecessary(); + } + } + public void fullUpdate() throws CoreException { final Iterator i = c2mapping.values().iterator(); @@ -428,6 +395,7 @@ public class GitProjectData private void notifyChanged(final IResourceDelta projDelta) { + final Set affectedMappings = new HashSet(); try { projDelta.accept(new IResourceDeltaVisitor() @@ -436,21 +404,68 @@ public class GitProjectData throws CoreException { final int f = d.getFlags(); - final IResource r = d.getResource(); + IResource r = d.getResource(); if ((f & IResourceDelta.CONTENT) != 0 || (f & IResourceDelta.ENCODING) != 0 || r instanceof IContainer) { - final TreeEntry e = findMember(r); - if (e != null) + String s = null; + RepositoryMapping m = null; + + while (r != null) { - if (e instanceof FileTreeEntry) + m = getRepositoryMapping(r); + if (m != null) { - trace("modified " - + r - + " -> " - + e.getFullName()); - e.setModified(); + break; + } + + if (s != null) + { + s = r.getName() + "/" + s; + } + else + { + s = r.getName(); + } + + r = r.getParent(); + } + + if (m == null) + { + return false; + } + else if (s == null) + { + return true; + } + + final Tree cacheTree = m.getCacheTree(); + if (cacheTree != null) + { + try + { + synchronized (cacheTree) + { + final TreeEntry e; + e = cacheTree.findMember(s); + if (e instanceof FileTreeEntry) + { + trace("modified " + + r + + " -> " + + e.getFullName()); + e.setModified(); + affectedMappings.add(m); + } + } + } + catch (IOException ioe) + { + throw Activator.error( + CoreText.GitProjectData_lazyResolveFailed, + ioe); } return true; } @@ -467,6 +482,20 @@ public class GitProjectData attachToWorkspace(false); Activator.logError(CoreText.GitProjectData_notifyChangedFailed, ce); } + + try + { + final Iterator i = affectedMappings.iterator(); + while (i.hasNext()) + { + ((RepositoryMapping) i.next()).recomputeMerge(); + } + } + catch (IOException ioe) + { + Activator + .logError(CoreText.GitProjectData_notifyChangedFailed, ioe); + } } private File propertyFile() @@ -540,8 +569,10 @@ public class GitProjectData Activator.logError( CoreText.GitProjectData_mappedResourceGone, new FileNotFoundException(m.getContainerPath().toString())); + m.clear(); return; } + m.setContainer(c); git = c.getLocation().append(m.getGitDirPath()).toFile(); if (!git.isDirectory() || !new File(git, "config").isFile()) @@ -549,6 +580,7 @@ public class GitProjectData Activator.logError( CoreText.GitProjectData_mappedResourceGone, new FileNotFoundException(m.getContainerPath().toString())); + m.clear(); return; } @@ -561,19 +593,18 @@ public class GitProjectData Activator.logError( CoreText.GitProjectData_mappedResourceGone, new FileNotFoundException(m.getContainerPath().toString())); - m.setRepository(null); + m.clear(); return; } try { - m.setContainer(c); m.recomputeMerge(); } catch (IOException ioe) { Activator.logError(CoreText.GitProjectData_cannotReadHEAD, ioe); - m.setRepository(null); + m.clear(); return; } diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java b/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java index 961f9fc4..2a632d6b 100644 --- a/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java +++ b/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java @@ -7,6 +7,8 @@ import java.util.Properties; import org.eclipse.core.resources.IContainer; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.spearce.jgit.errors.MissingObjectException; import org.spearce.jgit.lib.Constants; import org.spearce.jgit.lib.MergedTree; @@ -14,7 +16,6 @@ import org.spearce.jgit.lib.RefLock; import org.spearce.jgit.lib.Repository; import org.spearce.jgit.lib.Tree; import org.spearce.jgit.lib.TreeEntry; -import org.spearce.jgit.lib.WriteTree; public class RepositoryMapping { @@ -33,6 +34,10 @@ public class RepositoryMapping private Repository db; + private CheckpointJob currowj; + + private boolean runningowj; + private IContainer container; private Tree cacheTree; @@ -118,40 +123,70 @@ public class RepositoryMapping return subset; } - public void clear() + public synchronized void clear() { db = null; + currowj = null; + container = null; cacheTree = null; + activeDiff = null; } - public Repository getRepository() + public synchronized Repository getRepository() { return db; } - public void setRepository(final Repository r) + public synchronized void setRepository(final Repository r) { db = r; cacheTree = null; activeDiff = null; + if (db != null) + { + initJob(); + } } - public void setContainer(final IContainer c) + public synchronized IContainer getContainer() + { + return container; + } + + public synchronized void setContainer(final IContainer c) { container = c; } - public Tree getCacheTree() + public synchronized Tree getCacheTree() { return cacheTree; } - public MergedTree getActiveDiff() + public synchronized MergedTree getActiveDiff() { return activeDiff; } - public void fullUpdate() throws IOException + public synchronized void checkpointIfNecessary() + { + if (!runningowj) + { + currowj.scheduleIfNecessary(); + } + } + + public synchronized void saveCache() throws IOException + { + final RefLock lock = getRepository().lockRef(cacheref); + if (lock != null) + { + lock.write(cacheTree.getId()); + lock.commit(); + } + } + + public synchronized void fullUpdate() throws IOException { cacheTree = mapHEADTree(); @@ -166,28 +201,11 @@ public class RepositoryMapping cacheTree.delete(); } - saveCache(); - } - - public void saveCache() throws IOException - { - final RefLock lock; - - cacheTree.accept(new WriteTree( - container.getLocation().toFile(), - getRepository()), Tree.MODIFIED_ONLY); - - lock = getRepository().lockRef(cacheref); - if (lock != null) - { - lock.write(cacheTree.getId()); - lock.commit(); - } - recomputeMerge(); + currowj.scheduleIfNecessary(); } - public void recomputeMerge() throws IOException + public synchronized void recomputeMerge() throws IOException { Tree head = mapHEADTree(); @@ -200,10 +218,16 @@ public class RepositoryMapping cacheTree = new Tree(getRepository()); } + cacheTree.accept( + new EnqueueWriteTree(container, currowj), + TreeEntry.MODIFIED_ONLY); + activeDiff = new MergedTree(new Tree[] {head, cacheTree}); } - public Tree mapHEADTree() throws IOException, MissingObjectException + public synchronized Tree mapHEADTree() + throws IOException, + MissingObjectException { Tree head = getRepository().mapTree(Constants.HEAD); if (head != null) @@ -222,7 +246,7 @@ public class RepositoryMapping return head; } - public void store(final Properties p) + public synchronized void store(final Properties p) { p.setProperty(containerPath + ".gitdir", gitdirPath); p.setProperty(containerPath + ".cacheref", cacheref); @@ -242,4 +266,28 @@ public class RepositoryMapping + cacheref + "]"; } + + private void initJob() + { + currowj = new CheckpointJob(this); + currowj.addJobChangeListener(new JobChangeAdapter() + { + public void running(final IJobChangeEvent event) + { + synchronized (RepositoryMapping.this) + { + runningowj = true; + initJob(); + } + } + + public void done(final IJobChangeEvent event) + { + synchronized (RepositoryMapping.this) + { + runningowj = false; + } + } + }); + } } diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/Disconnect.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/Disconnect.java index d52c44cd..cd5f2bba 100644 --- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/Disconnect.java +++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/Disconnect.java @@ -5,6 +5,7 @@ import java.util.List; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.jface.action.IAction; import org.spearce.egit.core.op.DisconnectProviderOperation; +import org.spearce.egit.ui.internal.decorators.GitResourceDecorator; public class Disconnect extends AbstractOperationAction { @@ -14,4 +15,9 @@ public class Disconnect extends AbstractOperationAction { return sel.isEmpty() ? null : new DisconnectProviderOperation(sel); } + + protected void postOperation() + { + GitResourceDecorator.refresh(); + } } diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/sharing/SharingWizard.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/sharing/SharingWizard.java index 85f09cb0..ff0bcffd 100644 --- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/sharing/SharingWizard.java +++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/sharing/SharingWizard.java @@ -16,6 +16,7 @@ import org.eclipse.ui.IWorkbench; import org.spearce.egit.core.op.ConnectProviderOperation; import org.spearce.egit.ui.Activator; import org.spearce.egit.ui.UIText; +import org.spearce.egit.ui.internal.decorators.GitResourceDecorator; public class SharingWizard extends Wizard implements IConfigurationWizard { @@ -82,6 +83,8 @@ public class SharingWizard extends Wizard implements IConfigurationWizard } } }); + + GitResourceDecorator.refresh(); return true; } catch (Throwable e) diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectWriter.java b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectWriter.java index 1189e05f..1310b3d5 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectWriter.java +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectWriter.java @@ -23,11 +23,14 @@ public class ObjectWriter private final MessageDigest md; + private final Deflater def; + public ObjectWriter(final Repository d) { r = d; buf = new byte[8192]; md = Constants.newMessageDigest(); + def = new Deflater(); } public ObjectId writeBlob(final byte[] b) throws IOException @@ -159,9 +162,9 @@ public class ObjectWriter final File t; final DeflaterOutputStream ts; ObjectId id = null; + def.reset(); t = File.createTempFile("noz", null, r.getObjectsDirectory()); - ts = new DeflaterOutputStream(new FileOutputStream(t), new Deflater( - Deflater.BEST_COMPRESSION)); + ts = new DeflaterOutputStream(new FileOutputStream(t), def); try { byte[] header; -- 2.11.4.GIT