Browse Source

API to remove repositories from RepositoryCache

Add methods that allow to unregister repositories from the
RepositoryCache individually.

Bug: 470234
Change-Id: Ib918a634d829c9898072ae7bdeb22b099a32b1c9
Signed-off-by: Tobias Oberlies <tobias.oberlies@sap.com>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
stable-4.1
Tobias Oberlies 10 years ago committed by Matthias Sohn
parent
commit
d34314644e
  1. 28
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryCacheTest.java
  2. 28
      org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java

28
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryCacheTest.java

@ -43,11 +43,14 @@
package org.eclipse.jgit.lib; package org.eclipse.jgit.lib;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame; import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
@ -59,6 +62,7 @@ import org.eclipse.jgit.junit.RepositoryTestCase;
import org.eclipse.jgit.lib.RepositoryCache.FileKey; import org.eclipse.jgit.lib.RepositoryCache.FileKey;
import org.junit.Test; import org.junit.Test;
@SuppressWarnings("boxing")
public class RepositoryCacheTest extends RepositoryTestCase { public class RepositoryCacheTest extends RepositoryTestCase {
@Test @Test
public void testNonBareFileKey() throws IOException { public void testNonBareFileKey() throws IOException {
@ -147,4 +151,28 @@ public class RepositoryCacheTest extends RepositoryTestCase {
d2.close(); d2.close();
d2.close(); d2.close();
} }
@Test
public void testGetRegisteredWhenEmpty() {
assertThat(RepositoryCache.getRegisteredKeys().size(), is(0));
}
@Test
public void testGetRegistered() {
RepositoryCache.register(db);
assertThat(RepositoryCache.getRegisteredKeys(),
hasItem(FileKey.exact(db.getDirectory(), db.getFS())));
assertThat(RepositoryCache.getRegisteredKeys().size(), is(1));
}
@Test
public void testUnregister() {
RepositoryCache.register(db);
RepositoryCache
.unregister(FileKey.exact(db.getDirectory(), db.getFS()));
assertThat(RepositoryCache.getRegisteredKeys().size(), is(0));
}
} }

28
org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java

@ -47,6 +47,8 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.Reference; import java.lang.ref.Reference;
import java.lang.ref.SoftReference; import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -143,6 +145,28 @@ public class RepositoryCache {
} }
} }
/**
* Remove a repository from the cache.
* <p>
* Removes a repository from the cache, if it is still registered here,
* permitting it to close.
*
* @param location
* location of the repository to remove.
* @since 4.1
*/
public static void unregister(Key location) {
cache.unregisterRepository(location);
}
/**
* @return the locations of all repositories registered in the cache.
* @since 4.1
*/
public static Collection<Key> getRegisteredKeys() {
return cache.getKeys();
}
/** Unregister all repositories from the cache. */ /** Unregister all repositories from the cache. */
public static void clear() { public static void clear() {
cache.clearAll(); cache.clearAll();
@ -195,6 +219,10 @@ public class RepositoryCache {
oldDb.close(); oldDb.close();
} }
private Collection<Key> getKeys() {
return new ArrayList<Key>(cacheMap.keySet());
}
private void clearAll() { private void clearAll() {
for (int stage = 0; stage < 2; stage++) { for (int stage = 0; stage < 2; stage++) {
for (Iterator<Map.Entry<Key, Reference<Repository>>> i = cacheMap for (Iterator<Map.Entry<Key, Reference<Repository>>> i = cacheMap

Loading…
Cancel
Save