aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src
diff options
context:
space:
mode:
authorJonathan Nieder <jrn@google.com>2018-12-26 13:12:14 -0500
committerGerrit Code Review @ Eclipse.org <gerrit@eclipse.org>2018-12-26 13:12:14 -0500
commitf5bdb9745fb5f1d7122166a0ef71333baacbd96b (patch)
treef121edfe0afc9d2e75d680a8f9349f95b03af57f /org.eclipse.jgit/src
parent0aa31b110bc9832976332be05dc1a0fc2d59e235 (diff)
parent3381bf7e6a2295658739a19d034b73539abadc5c (diff)
downloadjgit-f5bdb9745fb5f1d7122166a0ef71333baacbd96b.tar.gz
jgit-f5bdb9745fb5f1d7122166a0ef71333baacbd96b.zip
Merge changes from topic 'update-index-ref-decorator'
* changes: RefCursor: Remove unnecessary getUpdateIndex method RefDatabase/Ref: Add versioning to reference database
Diffstat (limited to 'org.eclipse.jgit/src')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReftableDatabase.java6
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockReader.java19
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java9
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/RefCursor.java7
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/Reftable.java2
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableCompactor.java2
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java18
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdRef.java84
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/Ref.java23
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java13
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/SymbolicRef.java33
11 files changed, 169 insertions, 47 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 70816307f5..0e0a6ef5e4 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
@@ -99,6 +99,12 @@ public class DfsReftableDatabase extends DfsRefDatabase {
/** {@inheritDoc} */
@Override
+ public boolean hasVersioning() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override
public boolean performsAtomicTransactions() {
return true;
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockReader.java
index ce2ba4a2e1..44529bfff2 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/BlockReader.java
@@ -170,24 +170,27 @@ class BlockReader {
return readVarint64();
}
- Ref readRef() throws IOException {
+ Ref readRef(long minUpdateIndex) throws IOException {
+ long updateIndex = minUpdateIndex + readUpdateIndexDelta();
String name = RawParseUtils.decode(UTF_8, nameBuf, 0, nameLen);
switch (valueType & VALUE_TYPE_MASK) {
case VALUE_NONE: // delete
- return newRef(name);
+ return newRef(name, updateIndex);
case VALUE_1ID:
- return new ObjectIdRef.PeeledNonTag(PACKED, name, readValueId());
+ return new ObjectIdRef.PeeledNonTag(PACKED, name, readValueId(),
+ updateIndex);
case VALUE_2ID: { // annotated tag
ObjectId id1 = readValueId();
ObjectId id2 = readValueId();
- return new ObjectIdRef.PeeledTag(PACKED, name, id1, id2);
+ return new ObjectIdRef.PeeledTag(PACKED, name, id1, id2,
+ updateIndex);
}
case VALUE_SYMREF: {
String val = readValueString();
- return new SymbolicRef(name, newRef(val));
+ return new SymbolicRef(name, newRef(val, updateIndex), updateIndex);
}
default:
@@ -410,7 +413,7 @@ class BlockReader {
* <ul>
* <li>{@link #name()}
* <li>{@link #match(byte[], boolean)}
- * <li>{@link #readRef()}
+ * <li>{@link #readRef(long)}
* <li>{@link #readLogUpdateIndex()}
* <li>{@link #readLogEntry()}
* <li>{@link #readBlockPositionList()}
@@ -575,8 +578,8 @@ class BlockReader {
return val;
}
- private static Ref newRef(String name) {
- return new ObjectIdRef.Unpeeled(NEW, name, null);
+ private static Ref newRef(String name, long updateIndex) {
+ return new ObjectIdRef.Unpeeled(NEW, name, null, updateIndex);
}
private static IOException invalidBlock() {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java
index 17894b1664..c740bf2c37 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/MergedReftable.java
@@ -168,7 +168,6 @@ public class MergedReftable extends Reftable {
private final PriorityQueue<RefQueueEntry> queue;
private RefQueueEntry head;
private Ref ref;
- private long updateIndex;
MergedRefCursor() {
queue = new PriorityQueue<>(queueSize(), RefQueueEntry::compare);
@@ -206,7 +205,6 @@ public class MergedReftable extends Reftable {
}
ref = t.rc.getRef();
- updateIndex = t.rc.getUpdateIndex();
boolean include = includeDeletes || !t.rc.wasDeleted();
add(t);
skipShadowedRefs(ref.getName());
@@ -242,11 +240,6 @@ public class MergedReftable extends Reftable {
}
@Override
- public long getUpdateIndex() {
- return updateIndex;
- }
-
- @Override
public void close() {
if (head != null) {
head.rc.close();
@@ -285,7 +278,7 @@ public class MergedReftable extends Reftable {
}
long updateIndex() {
- return rc.getUpdateIndex();
+ return rc.getRef().getUpdateIndex();
}
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/RefCursor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/RefCursor.java
index 5d4af30a91..9749ffb906 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/RefCursor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/RefCursor.java
@@ -69,13 +69,6 @@ public abstract class RefCursor implements AutoCloseable {
public abstract Ref getRef();
/**
- * Get updateIndex that last modified the current reference.
- *
- * @return updateIndex that last modified the current reference.
- */
- public abstract long getUpdateIndex();
-
- /**
* Whether the current reference was deleted.
*
* @return {@code true} if the current reference was deleted.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/Reftable.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/Reftable.java
index a1087e2023..cb02628e8d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/Reftable.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/Reftable.java
@@ -280,7 +280,7 @@ public abstract class Reftable implements AutoCloseable {
if (dst == null) {
return null; // claim it doesn't exist
}
- return new SymbolicRef(ref.getName(), dst);
+ return new SymbolicRef(ref.getName(), dst, ref.getUpdateIndex());
}
/** {@inheritDoc} */
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableCompactor.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableCompactor.java
index ed73a9efbd..c4e8f69fa4 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableCompactor.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableCompactor.java
@@ -256,7 +256,7 @@ public class ReftableCompactor {
private void mergeRefs(MergedReftable mr) throws IOException {
try (RefCursor rc = mr.allRefs()) {
while (rc.next()) {
- writer.writeRef(rc.getRef(), rc.getUpdateIndex());
+ writer.writeRef(rc.getRef(), rc.getRef().getUpdateIndex());
}
}
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java
index 81b30e4cb9..bf3a9aeca0 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/reftable/ReftableReader.java
@@ -479,7 +479,6 @@ public class ReftableReader extends Reftable {
private final boolean prefix;
private Ref ref;
- private long updateIndex;
BlockReader block;
RefCursorImpl(long scanEnd, byte[] match, boolean prefix) {
@@ -508,8 +507,7 @@ public class ReftableReader extends Reftable {
return false;
}
- updateIndex = minUpdateIndex + block.readUpdateIndexDelta();
- ref = block.readRef();
+ ref = block.readRef(minUpdateIndex);
if (!includeDeletes && wasDeleted()) {
continue;
}
@@ -523,11 +521,6 @@ public class ReftableReader extends Reftable {
}
@Override
- public long getUpdateIndex() {
- return updateIndex;
- }
-
- @Override
public void close() {
// Do nothing.
}
@@ -605,7 +598,6 @@ public class ReftableReader extends Reftable {
private final ObjectId match;
private Ref ref;
- private long updateIndex;
private int listIdx;
private LongList blockPos;
@@ -679,8 +671,7 @@ public class ReftableReader extends Reftable {
}
block.parseKey();
- updateIndex = minUpdateIndex + block.readUpdateIndexDelta();
- ref = block.readRef();
+ ref = block.readRef(minUpdateIndex);
ObjectId id = ref.getObjectId();
if (id != null && match.equals(id)
&& (includeDeletes || !wasDeleted())) {
@@ -695,11 +686,6 @@ public class ReftableReader extends Reftable {
}
@Override
- public long getUpdateIndex() {
- return updateIndex;
- }
-
- @Override
public void close() {
// Do nothing.
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdRef.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdRef.java
index 22aaa3ad73..747318170a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdRef.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectIdRef.java
@@ -67,7 +67,25 @@ public abstract class ObjectIdRef implements Ref {
*/
public Unpeeled(@NonNull Storage st, @NonNull String name,
@Nullable ObjectId id) {
- super(st, name, id);
+ super(st, name, id, -1);
+ }
+
+ /**
+ * Create a new ref pairing with update index.
+ *
+ * @param st
+ * method used to store this ref.
+ * @param name
+ * name of this ref.
+ * @param id
+ * current value of the ref. May be {@code null} to indicate
+ * a ref that does not exist yet.
+ * @param updateIndex
+ * number increasing with each update to the reference.
+ */
+ public Unpeeled(@NonNull Storage st, @NonNull String name,
+ @Nullable ObjectId id, long updateIndex) {
+ super(st, name, id, updateIndex);
}
@Override
@@ -100,7 +118,28 @@ public abstract class ObjectIdRef implements Ref {
*/
public PeeledTag(@NonNull Storage st, @NonNull String name,
@Nullable ObjectId id, @NonNull ObjectId p) {
- super(st, name, id);
+ super(st, name, id, -1);
+ peeledObjectId = p;
+ }
+
+ /**
+ * Create a new ref pairing with update index.
+ *
+ * @param st
+ * method used to store this ref.
+ * @param name
+ * name of this ref.
+ * @param id
+ * current value of the ref. May be {@code null} to indicate
+ * a ref that does not exist yet.
+ * @param p
+ * the first non-tag object that tag {@code id} points to.
+ * @param updateIndex
+ * number increasing with each update to the reference.
+ */
+ public PeeledTag(@NonNull Storage st, @NonNull String name,
+ @Nullable ObjectId id, @NonNull ObjectId p, long updateIndex) {
+ super(st, name, id, updateIndex);
peeledObjectId = p;
}
@@ -131,7 +170,25 @@ public abstract class ObjectIdRef implements Ref {
*/
public PeeledNonTag(@NonNull Storage st, @NonNull String name,
@Nullable ObjectId id) {
- super(st, name, id);
+ super(st, name, id, -1);
+ }
+
+ /**
+ * Create a new ref pairing with update index.
+ *
+ * @param st
+ * method used to store this ref.
+ * @param name
+ * name of this ref.
+ * @param id
+ * current value of the ref. May be {@code null} to indicate
+ * a ref that does not exist yet.
+ * @param updateIndex
+ * number increasing with each update to the reference.
+ */
+ public PeeledNonTag(@NonNull Storage st, @NonNull String name,
+ @Nullable ObjectId id, long updateIndex) {
+ super(st, name, id, updateIndex);
}
@Override
@@ -152,6 +209,8 @@ public abstract class ObjectIdRef implements Ref {
private final ObjectId objectId;
+ private final long updateIndex;
+
/**
* Create a new ref pairing.
*
@@ -162,12 +221,16 @@ public abstract class ObjectIdRef implements Ref {
* @param id
* current value of the ref. May be {@code null} to indicate a
* ref that does not exist yet.
+ * @param updateIndex
+ * number that increases with each ref update. Set to -1 if the
+ * storage doesn't support versioning.
*/
protected ObjectIdRef(@NonNull Storage st, @NonNull String name,
- @Nullable ObjectId id) {
+ @Nullable ObjectId id, long updateIndex) {
this.name = name;
this.storage = st;
this.objectId = id;
+ this.updateIndex = updateIndex;
}
/** {@inheritDoc} */
@@ -212,6 +275,15 @@ public abstract class ObjectIdRef implements Ref {
}
/** {@inheritDoc} */
+ @Override
+ public long getUpdateIndex() {
+ if (updateIndex == -1) {
+ throw new UnsupportedOperationException();
+ }
+ return updateIndex;
+ }
+
+ /** {@inheritDoc} */
@NonNull
@Override
public String toString() {
@@ -220,7 +292,9 @@ public abstract class ObjectIdRef implements Ref {
r.append(getName());
r.append('=');
r.append(ObjectId.toString(getObjectId()));
- r.append(']');
+ r.append('(');
+ r.append(updateIndex); // Print value, even if -1
+ r.append(")]"); //$NON-NLS-1$
return r.toString();
}
}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Ref.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Ref.java
index faabbf892f..32c8b06c91 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Ref.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Ref.java
@@ -217,4 +217,27 @@ public interface Ref {
*/
@NonNull
Storage getStorage();
+
+ /**
+ * Indicator of the relative order between updates of a specific reference
+ * name. A number that increases when a reference is updated.
+ * <p>
+ * With symbolic references, the update index refers to updates of the
+ * symbolic reference itself. For example, if HEAD points to
+ * refs/heads/master, then the update index for exactRef("HEAD") will only
+ * increase when HEAD changes to point to another ref, regardless of how
+ * many times refs/heads/master is updated.
+ * <p>
+ * Should not be used unless the {@code RefDatabase} that instantiated the
+ * ref supports versioning (see {@link RefDatabase#hasVersioning()})
+ *
+ * @return the update index (i.e. version) of this reference.
+ * @throws UnsupportedOperationException
+ * if the creator of the instance (e.g. {@link RefDatabase})
+ * doesn't support versioning and doesn't override this method
+ * @since 5.3
+ */
+ default long getUpdateIndex() {
+ throw new UnsupportedOperationException();
+ }
}
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 68929b4220..5010a89ed5 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java
@@ -111,6 +111,19 @@ public abstract class RefDatabase {
public abstract void close();
/**
+ * With versioning, each reference has a version number that increases on
+ * update. See {@link Ref#getUpdateIndex()}.
+ *
+ * @implSpec This method returns false by default. Implementations
+ * supporting versioning must override it to return true.
+ * @return true if the implementation assigns update indices to references.
+ * @since 5.3
+ */
+ public boolean hasVersioning() {
+ return false;
+ }
+
+ /**
* Determine if a proposed reference name overlaps with an existing one.
* <p>
* Reference names use '/' as a component separator, and may be stored in a
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/SymbolicRef.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/SymbolicRef.java
index d4b83b0128..0e9a23fe15 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/SymbolicRef.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/SymbolicRef.java
@@ -58,6 +58,8 @@ public class SymbolicRef implements Ref {
private final Ref target;
+ private final long updateIndex;
+
/**
* Create a new ref pairing.
*
@@ -69,6 +71,24 @@ public class SymbolicRef implements Ref {
public SymbolicRef(@NonNull String refName, @NonNull Ref target) {
this.name = refName;
this.target = target;
+ this.updateIndex = -1;
+ }
+
+ /**
+ * Create a new ref pairing.
+ *
+ * @param refName
+ * name of this ref.
+ * @param target
+ * the ref we reference and derive our value from.
+ * @param updateIndex
+ * index that increases with each update of the reference
+ */
+ public SymbolicRef(@NonNull String refName, @NonNull Ref target,
+ long updateIndex) {
+ this.name = refName;
+ this.target = target;
+ this.updateIndex = updateIndex;
}
/** {@inheritDoc} */
@@ -129,6 +149,15 @@ public class SymbolicRef implements Ref {
}
/** {@inheritDoc} */
+ @Override
+ public long getUpdateIndex() {
+ if (updateIndex == -1) {
+ throw new UnsupportedOperationException();
+ }
+ return updateIndex;
+ }
+
+ /** {@inheritDoc} */
@SuppressWarnings("nls")
@Override
public String toString() {
@@ -143,7 +172,9 @@ public class SymbolicRef implements Ref {
r.append(cur.getName());
r.append('=');
r.append(ObjectId.toString(cur.getObjectId()));
- r.append("]");
+ r.append("(");
+ r.append(updateIndex); // Print value, even if -1
+ r.append(")]");
return r.toString();
}
}