Merge branch 'master' into stable-7.0

* master:
  walks: Remove deprecated #createReachabilityChecker() method
  RepoCommand.RemoteReader: Remove @Deprecated method
  ReachabilityChecker: Remove @Deprecated method
  UploadPack: Remove @Deprecated classes and methods
  ObjectId: Add method to read an ObjectId from a ByteBuffer
  DfsPackFile: re-add metrics for bitmap index loads

Change-Id: I383c9784ced95dfd58f01454fd13b086b180d462
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectIdTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectIdTest.java
index 21032c3..d6f0b03 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectIdTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectIdTest.java
@@ -16,6 +16,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import java.nio.ByteBuffer;
 import java.util.Locale;
 
 import org.eclipse.jgit.errors.InvalidObjectIdException;
@@ -153,4 +154,16 @@ public void testSetByte() {
 			assertEquals(ObjectId.fromRaw(exp).name(), id.name());
 		}
 	}
+
+	@Test
+	public void test_toFromByteBuffer_raw() {
+		ObjectId oid = ObjectId
+				.fromString("ff00eedd003713bb1bb26b808ec9312548e73946");
+		ByteBuffer anObject = ByteBuffer.allocate(Constants.OBJECT_ID_LENGTH);
+		oid.copyRawTo(anObject);
+		anObject.flip();
+
+		ObjectId actual = ObjectId.fromRaw(anObject);
+		assertEquals(oid.name(), actual.name());
+	}
 }
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java
index d30e8d6..be77fca 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoCommand.java
@@ -111,32 +111,6 @@ public interface RemoteReader {
 		public ObjectId sha1(String uri, String ref) throws GitAPIException;
 
 		/**
-		 * Read a file from a remote repository.
-		 *
-		 * @param uri
-		 *            The URI of the remote repository
-		 * @param ref
-		 *            The ref (branch/tag/etc.) to read
-		 * @param path
-		 *            The relative path (inside the repo) to the file to read
-		 * @return the file content.
-		 * @throws GitAPIException
-		 *             If the ref have an invalid or ambiguous name, or it does
-		 *             not exist in the repository,
-		 * @throws IOException
-		 *             If the object does not exist or is too large
-		 * @since 3.5
-		 *
-		 * @deprecated Use {@link #readFileWithMode(String, String, String)}
-		 *             instead
-		 */
-		@Deprecated
-		public default byte[] readFile(String uri, String ref, String path)
-				throws GitAPIException, IOException {
-			return readFileWithMode(uri, ref, path).getContents();
-		}
-
-		/**
 		 * Read contents and mode (i.e. permissions) of the file from a remote
 		 * repository.
 		 *
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java
index 845feab..48ed47a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java
@@ -1280,9 +1280,12 @@ private DfsBlockCache.Ref<PackObjectSizeIndex> loadObjectSizeIndex(
 	private DfsBlockCache.Ref<PackBitmapIndex> loadBitmapIndex(DfsReader ctx,
 			DfsStreamKey bitmapKey) throws IOException {
 		ctx.stats.readBitmap++;
+		long start = System.nanoTime();
 		PackBitmapIndexLoader.LoadResult result = bitmapLoader
 				.loadPackBitmapIndex(ctx, this);
 		bitmapIndex = result.bitmapIndex;
+		ctx.stats.readBitmapIdxBytes += result.bytesRead;
+		ctx.stats.readBitmapIdxMicros += elapsedMicros(start);
 		return new DfsBlockCache.Ref<>(bitmapKey, REF_POSITION,
 				result.bytesRead, result.bitmapIndex);
 	}
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java
index 1c31263..1b455b9 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectId.java
@@ -15,6 +15,7 @@
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
+import java.nio.ByteBuffer;
 
 import org.eclipse.jgit.annotations.Nullable;
 import org.eclipse.jgit.errors.InvalidObjectIdException;
@@ -152,6 +153,22 @@ public static final ObjectId fromRaw(byte[] bs, int p) {
 	}
 
 	/**
+	 * Convert an ObjectId from raw binary representation
+	 *
+	 * @param bb
+	 *            a bytebuffer with the objectid encoded as 5 consecutive ints.
+	 *            This is the reverse of {@link ObjectId#copyRawTo(ByteBuffer)}
+	 *
+	 * @return the converted object id.
+	 *
+	 * @since 7.0
+	 */
+	public static final ObjectId fromRaw(ByteBuffer bb) {
+		return new ObjectId(bb.getInt(), bb.getInt(), bb.getInt(), bb.getInt(),
+				bb.getInt());
+	}
+
+	/**
 	 * Convert an ObjectId from raw binary representation.
 	 *
 	 * @param is
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java
index 385f073..7c763bc 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ObjectWalk.java
@@ -164,29 +164,6 @@ private ObjectWalk(ObjectReader or, boolean closeReader) {
 	}
 
 	/**
-	 * Create an object reachability checker that will use bitmaps if possible.
-	 *
-	 * This reachability checker accepts any object as target. For checks
-	 * exclusively between commits, see
-	 * {@link RevWalk#createReachabilityChecker()}.
-	 *
-	 * @return an object reachability checker, using bitmaps if possible.
-	 *
-	 * @throws IOException
-	 *             when the index fails to load.
-	 *
-	 * @since 5.8
-	 * @deprecated use
-	 *             {@code ObjectReader#createObjectReachabilityChecker(ObjectWalk)}
-	 *             instead.
-	 */
-	@Deprecated
-	public final ObjectReachabilityChecker createObjectReachabilityChecker()
-			throws IOException {
-		return reader.createObjectReachabilityChecker(this);
-	}
-
-	/**
 	 * Mark an object or commit to start graph traversal from.
 	 * <p>
 	 * Callers are encouraged to use
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ReachabilityChecker.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ReachabilityChecker.java
index 1a869a0..5afb669 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ReachabilityChecker.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/ReachabilityChecker.java
@@ -26,40 +26,6 @@
  * @since 5.4
  */
 public interface ReachabilityChecker {
-
-	/**
-	 * Check if all targets are reachable from the {@code starters} commits.
-	 * <p>
-	 * Caller should parse the objectIds (preferably with
-	 * {@code walk.parseCommit()} and handle missing/incorrect type objects
-	 * before calling this method.
-	 *
-	 * @param targets
-	 *            commits to reach.
-	 * @param starters
-	 *            known starting points.
-	 * @return An unreachable target if at least one of the targets is
-	 *         unreachable. An empty optional if all targets are reachable from
-	 *         the starters.
-	 *
-	 * @throws MissingObjectException
-	 *             if any of the incoming objects doesn't exist in the
-	 *             repository.
-	 * @throws IncorrectObjectTypeException
-	 *             if any of the incoming objects is not a commit or a tag.
-	 * @throws IOException
-	 *             if any of the underlying indexes or readers can not be
-	 *             opened.
-	 *
-	 * @deprecated see {{@link #areAllReachable(Collection, Stream)}
-	 */
-	@Deprecated
-	default Optional<RevCommit> areAllReachable(Collection<RevCommit> targets,
-                       Collection<RevCommit> starters) throws MissingObjectException,
-			IncorrectObjectTypeException, IOException {
-		return areAllReachable(targets, starters.stream());
-	}
-
 	/**
 	 * Check if all targets are reachable from the {@code starters} commits.
 	 * <p>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
index 76c14e9..9f0e28d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java
@@ -31,9 +31,9 @@
 import org.eclipse.jgit.errors.MissingObjectException;
 import org.eclipse.jgit.errors.RevWalkException;
 import org.eclipse.jgit.internal.JGitText;
+import org.eclipse.jgit.internal.storage.commitgraph.CommitGraph;
 import org.eclipse.jgit.lib.AnyObjectId;
 import org.eclipse.jgit.lib.AsyncObjectLoaderQueue;
-import org.eclipse.jgit.internal.storage.commitgraph.CommitGraph;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.MutableObjectId;
 import org.eclipse.jgit.lib.NullProgressMonitor;
@@ -279,23 +279,6 @@ public ObjectReader getObjectReader() {
 	}
 
 	/**
-	 * Get a reachability checker for commits over this revwalk.
-	 *
-	 * @return the most efficient reachability checker for this repository.
-	 * @throws IOException
-	 *             if it cannot open any of the underlying indices.
-	 *
-	 * @since 5.4
-	 * @deprecated use {@code ObjectReader#createReachabilityChecker(RevWalk)}
-	 *             instead.
-	 */
-	@Deprecated
-	public final ReachabilityChecker createReachabilityChecker()
-			throws IOException {
-		return reader.createReachabilityChecker(this);
-	}
-
-	/**
 	 * {@inheritDoc}
 	 * <p>
 	 * Release any resources used by this walker's reader.
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
index 9318871..ec51c88 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java
@@ -30,11 +30,11 @@
 import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_NO_DONE;
 import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_NO_PROGRESS;
 import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_OFS_DELTA;
+import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_SESSION_ID;
 import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_SHALLOW;
 import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_SIDEBAND_ALL;
 import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_SIDE_BAND;
 import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_SIDE_BAND_64K;
-import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_SESSION_ID;
 import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_THIN_PACK;
 import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_WAIT_FOR_DONE;
 import static org.eclipse.jgit.transport.GitProtocolConstants.PACKET_ACK;
@@ -80,7 +80,6 @@
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.internal.storage.pack.CachedPackUriProvider;
 import org.eclipse.jgit.internal.storage.pack.PackWriter;
-import org.eclipse.jgit.internal.transport.parser.FirstWant;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.lib.ObjectId;
@@ -172,52 +171,6 @@ void checkWants(UploadPack up, List<ObjectId> wants)
 				throws PackProtocolException, IOException;
 	}
 
-	/**
-	 * Data in the first line of a want-list, the line itself plus options.
-	 *
-	 * @deprecated Use {@link FirstWant} instead
-	 */
-	@Deprecated
-	public static class FirstLine {
-
-		private final FirstWant firstWant;
-
-		/**
-		 * @param line
-		 *            line from the client.
-		 */
-		public FirstLine(String line) {
-			try {
-				firstWant = FirstWant.fromLine(line);
-			} catch (PackProtocolException e) {
-				throw new UncheckedIOException(e);
-			}
-		}
-
-		/**
-		 * Get non-capabilities part of the line
-		 *
-		 * @return non-capabilities part of the line.
-		 */
-		public String getLine() {
-			return firstWant.getLine();
-		}
-
-		/**
-		 * Get capabilities parsed from the line
-		 *
-		 * @return capabilities parsed from the line.
-		 */
-		public Set<String> getOptions() {
-			if (firstWant.getAgent() != null) {
-				Set<String> caps = new HashSet<>(firstWant.getCapabilities());
-				caps.add(OPTION_AGENT + '=' + firstWant.getAgent());
-				return caps;
-			}
-			return firstWant.getCapabilities();
-		}
-	}
-
 	/*
 	 * {@link java.util.function.Consumer} doesn't allow throwing checked
 	 * exceptions. Define our own to propagate IOExceptions.
@@ -1693,18 +1646,6 @@ public int getDepth() {
 	}
 
 	/**
-	 * Deprecated synonym for {@code getFilterSpec().getBlobLimit()}.
-	 *
-	 * @return filter blob limit requested by the client, or -1 if no limit
-	 * @since 5.3
-	 * @deprecated Use {@link #getFilterSpec()} instead
-	 */
-	@Deprecated
-	public final long getFilterBlobLimit() {
-		return getFilterSpec().getBlobLimit();
-	}
-
-	/**
 	 * Returns the filter spec for the current request. Valid only after
 	 * calling recvWants(). This may be a no-op filter spec, but it won't be
 	 * null.