aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src
diff options
context:
space:
mode:
authorPatrick Hiesel <hiesel@google.com>2019-01-22 10:02:14 +0100
committerJonathan Nieder <jrn@google.com>2019-04-08 17:53:51 -0700
commit93a0e50ed087ec2de2b57483d2775a20fab03b75 (patch)
tree32702746bc483de410b0ba350b1eed4bdfc10a66 /org.eclipse.jgit/src
parentee32ca226e9a4aa2ff48bfdd1ba1d2184317c668 (diff)
downloadjgit-93a0e50ed087ec2de2b57483d2775a20fab03b75.tar.gz
jgit-93a0e50ed087ec2de2b57483d2775a20fab03b75.zip
Introduce RefDatabase#getTipsWithSha1 to list refs pointing to object
Add resolveTipSha1, an inverse of exactRef(String ...), to RefDatabase and provide a default implementation that runs in O(n) time where n is the number of refs. For RefTable, provide an implementation that runs in O(log(n)) time. [ifrade@google.com: with tests in InMemoryRepositoryTest to exercise the reftable code path, too] Change-Id: I2811ccd0339cdc1c74b42cce2ea003f07a2ce9e1 Signed-off-by: Patrick Hiesel <hiesel@google.com> Signed-off-by: Ivan Frade <ifrade@google.com>
Diffstat (limited to 'org.eclipse.jgit/src')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java21
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java28
2 files changed, 48 insertions, 1 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java
index 87983ce8c0..6050c15992 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java
@@ -47,8 +47,10 @@ import java.io.IOException;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
import org.eclipse.jgit.annotations.Nullable;
@@ -277,6 +279,25 @@ public class DfsReftableDatabase extends DfsRefDatabase {
/** {@inheritDoc} */
@Override
+ public Set<Ref> getTipsWithSha1(ObjectId id) throws IOException {
+ if (!getReftableConfig().isIndexObjects()) {
+ return super.getTipsWithSha1(id);
+ }
+ lock.lock();
+ try {
+ RefCursor cursor = reader().byObjectId(id);
+ Set<Ref> refs = new HashSet<>();
+ while (cursor.next()) {
+ refs.add(cursor.getRef());
+ }
+ return refs;
+ } finally {
+ lock.unlock();
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override
public Ref peel(Ref ref) throws IOException {
Ref oldLeaf = ref.getLeaf();
if (oldLeaf.isPeeled() || oldLeaf.getObjectId() == null) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
index 877792097c..4d9450e758 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
@@ -44,6 +44,7 @@
package org.eclipse.jgit.lib;
import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
import java.io.IOException;
import java.util.ArrayList;
@@ -52,7 +53,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-
+import java.util.Set;
import org.eclipse.jgit.annotations.NonNull;
import org.eclipse.jgit.annotations.Nullable;
@@ -470,6 +471,31 @@ public abstract class RefDatabase {
return Collections.unmodifiableList(result);
}
+
+ /**
+ * Returns all refs that resolve directly to the given {@link ObjectId}.
+ * Includes peeled {@linkObjectId}s. This is the inverse lookup of
+ * {@link #exactRef(String...)}.
+ *
+ * <p>
+ * The default implementation uses a linear scan. Implementors of
+ * {@link RefDatabase} should override this method directly if a better
+ * implementation is possible.
+ *
+ * @param id
+ * {@link ObjectId} to resolve
+ * @return a {@link Set} of {@link Ref}s whose tips point to the provided
+ * id.
+ * @throws java.io.IOException
+ * the reference space cannot be accessed.
+ * @since 5.4
+ */
+ @NonNull
+ public Set<Ref> getTipsWithSha1(ObjectId id) throws IOException {
+ return getRefs().stream().filter(r -> id.equals(r.getObjectId())
+ || id.equals(r.getPeeledObjectId())).collect(toSet());
+ }
+
/**
* Check if any refs exist in the ref database.
* <p>