aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java141
1 files changed, 76 insertions, 65 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java
index 5d892019ab..f6c52e292a 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java
@@ -2,46 +2,13 @@
* Copyright (C) 2007, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
* Copyright (C) 2009, Google Inc.
- * Copyright (C) 2010, Chris Aniszczyk <caniszczyk@gmail.com>
- * and other copyright owners as documented in the project's IP log.
+ * Copyright (C) 2010, Chris Aniszczyk <caniszczyk@gmail.com> and others
*
- * This program and the accompanying materials are made available
- * under the terms of the Eclipse Distribution License v1.0 which
- * accompanies this distribution, is reproduced below, and is
- * available at http://www.eclipse.org/org/documents/edl-v10.php
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
*
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- *
- * - Neither the name of the Eclipse Foundation, Inc. nor the
- * names of its contributors may be used to endorse or promote
- * products derived from this software without specific prior
- * written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * SPDX-License-Identifier: BSD-3-Clause
*/
package org.eclipse.jgit.lib;
@@ -50,9 +17,10 @@ import java.io.ByteArrayInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
-import java.security.MessageDigest;
+import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.transport.PackParser;
+import org.eclipse.jgit.util.sha1.SHA1;
/**
* Inserts objects into an existing {@code ObjectDatabase}.
@@ -97,8 +65,12 @@ public abstract class ObjectInserter implements AutoCloseable {
}
/** Wraps a delegate ObjectInserter. */
- public static abstract class Filter extends ObjectInserter {
- /** @return delegate ObjectInserter to handle all processing. */
+ public abstract static class Filter extends ObjectInserter {
+ /**
+ * Get delegate ObjectInserter to handle all processing
+ *
+ * @return delegate ObjectInserter to handle all processing.
+ */
protected abstract ObjectInserter delegate();
@Override
@@ -106,63 +78,85 @@ public abstract class ObjectInserter implements AutoCloseable {
return delegate().buffer();
}
+ @Override
public ObjectId idFor(int type, byte[] data) {
return delegate().idFor(type, data);
}
+ @Override
public ObjectId idFor(int type, byte[] data, int off, int len) {
return delegate().idFor(type, data, off, len);
}
+ @Override
public ObjectId idFor(int objectType, long length, InputStream in)
throws IOException {
return delegate().idFor(objectType, length, in);
}
+ @Override
public ObjectId idFor(TreeFormatter formatter) {
return delegate().idFor(formatter);
}
+ @Override
public ObjectId insert(int type, byte[] data) throws IOException {
return delegate().insert(type, data);
}
+ @Override
public ObjectId insert(int type, byte[] data, int off, int len)
throws IOException {
return delegate().insert(type, data, off, len);
}
+ @Override
public ObjectId insert(int objectType, long length, InputStream in)
throws IOException {
return delegate().insert(objectType, length, in);
}
+ @Override
public PackParser newPackParser(InputStream in) throws IOException {
return delegate().newPackParser(in);
}
+ @Override
public ObjectReader newReader() {
- return delegate().newReader();
+ final ObjectReader dr = delegate().newReader();
+ return new ObjectReader.Filter() {
+ @Override
+ protected ObjectReader delegate() {
+ return dr;
+ }
+
+ @Override
+ public ObjectInserter getCreatedFromInserter() {
+ return ObjectInserter.Filter.this;
+ }
+ };
}
+ @Override
public void flush() throws IOException {
delegate().flush();
}
+ @Override
public void close() {
delegate().close();
}
}
- /** Digest to compute the name of an object. */
- private final MessageDigest digest;
+ private final SHA1 hasher = SHA1.newInstance();
/** Temporary working buffer for streaming data through. */
private byte[] tempBuffer;
- /** Create a new inserter for a database. */
+ /**
+ * Create a new inserter for a database.
+ */
protected ObjectInserter() {
- digest = Constants.newMessageDigest();
}
/**
@@ -196,10 +190,14 @@ public abstract class ObjectInserter implements AutoCloseable {
return b;
}
- /** @return digest to help compute an ObjectId */
- protected MessageDigest digest() {
- digest.reset();
- return digest;
+ /**
+ * Compute digest to help compute an ObjectId
+ *
+ * @return digest to help compute an ObjectId
+ * @since 4.7
+ */
+ protected SHA1 digest() {
+ return hasher.reset();
}
/**
@@ -229,13 +227,13 @@ public abstract class ObjectInserter implements AutoCloseable {
* @return the name of the object.
*/
public ObjectId idFor(int type, byte[] data, int off, int len) {
- MessageDigest md = digest();
+ SHA1 md = SHA1.newInstance();
md.update(Constants.encodedTypeString(type));
md.update((byte) ' ');
md.update(Constants.encodeASCII(len));
md.update((byte) 0);
md.update(data, off, len);
- return ObjectId.fromRaw(md.digest());
+ return md.toObjectId();
}
/**
@@ -249,12 +247,12 @@ public abstract class ObjectInserter implements AutoCloseable {
* stream providing the object content. The caller is responsible
* for closing the stream.
* @return the name of the object.
- * @throws IOException
+ * @throws java.io.IOException
* the source stream could not be read.
*/
public ObjectId idFor(int objectType, long length, InputStream in)
throws IOException {
- MessageDigest md = digest();
+ SHA1 md = SHA1.newInstance();
md.update(Constants.encodedTypeString(objectType));
md.update((byte) ' ');
md.update(Constants.encodeASCII(length));
@@ -263,17 +261,18 @@ public abstract class ObjectInserter implements AutoCloseable {
while (length > 0) {
int n = in.read(buf, 0, (int) Math.min(length, buf.length));
if (n < 0)
- throw new EOFException("Unexpected end of input");
+ throw new EOFException(JGitText.get().unexpectedEndOfInput);
md.update(buf, 0, n);
length -= n;
}
- return ObjectId.fromRaw(md.digest());
+ return md.toObjectId();
}
/**
* Compute the ObjectId for the given tree without inserting it.
*
* @param formatter
+ * a {@link org.eclipse.jgit.lib.TreeFormatter} object.
* @return the computed ObjectId
*/
public ObjectId idFor(TreeFormatter formatter) {
@@ -286,7 +285,7 @@ public abstract class ObjectInserter implements AutoCloseable {
* @param formatter
* the formatter containing the proposed tree's data.
* @return the name of the tree object.
- * @throws IOException
+ * @throws java.io.IOException
* the object could not be stored.
*/
public final ObjectId insert(TreeFormatter formatter) throws IOException {
@@ -302,7 +301,7 @@ public abstract class ObjectInserter implements AutoCloseable {
* @param builder
* the builder containing the proposed commit's data.
* @return the name of the commit object.
- * @throws IOException
+ * @throws java.io.IOException
* the object could not be stored.
*/
public final ObjectId insert(CommitBuilder builder) throws IOException {
@@ -315,7 +314,7 @@ public abstract class ObjectInserter implements AutoCloseable {
* @param builder
* the builder containing the proposed tag's data.
* @return the name of the tag object.
- * @throws IOException
+ * @throws java.io.IOException
* the object could not be stored.
*/
public final ObjectId insert(TagBuilder builder) throws IOException {
@@ -330,10 +329,10 @@ public abstract class ObjectInserter implements AutoCloseable {
* @param data
* complete content of the object.
* @return the name of the object.
- * @throws IOException
+ * @throws java.io.IOException
* the object could not be stored.
*/
- public ObjectId insert(final int type, final byte[] data)
+ public ObjectId insert(int type, byte[] data)
throws IOException {
return insert(type, data, 0, data.length);
}
@@ -350,7 +349,7 @@ public abstract class ObjectInserter implements AutoCloseable {
* @param len
* number of bytes to copy from {@code data}.
* @return the name of the object.
- * @throws IOException
+ * @throws java.io.IOException
* the object could not be stored.
*/
public ObjectId insert(int type, byte[] data, int off, int len)
@@ -369,7 +368,7 @@ public abstract class ObjectInserter implements AutoCloseable {
* stream providing the object content. The caller is responsible
* for closing the stream.
* @return the name of the object.
- * @throws IOException
+ * @throws java.io.IOException
* the object could not be stored, or the source stream could
* not be read.
*/
@@ -383,7 +382,7 @@ public abstract class ObjectInserter implements AutoCloseable {
* the input stream. The stream is not closed by the parser, and
* must instead be closed by the caller once parsing is complete.
* @return the pack parser.
- * @throws IOException
+ * @throws java.io.IOException
* the parser instance, which can be configured and then used to
* parse objects into the ObjectDatabase.
*/
@@ -397,6 +396,16 @@ public abstract class ObjectInserter implements AutoCloseable {
* visible to the repository. The returned reader should only be used from
* the same thread as the inserter. Objects written by this inserter may not
* be visible to {@code this.newReader().newReader()}.
+ * <p>
+ * The returned reader should return this inserter instance from {@link
+ * ObjectReader#getCreatedFromInserter()}.
+ * <p>
+ * Behavior is undefined if an insert method is called on the inserter in the
+ * middle of reading from an {@link ObjectStream} opened from this reader. For
+ * example, reading the remainder of the object may fail, or newly written
+ * data may even be corrupted. Interleaving whole object reads (including
+ * streaming reads) with inserts is fine, just not interleaving streaming
+ * <em>partial</em> object reads with inserts.
*
* @since 3.5
* @return reader for any object, including an object recently inserted by
@@ -410,13 +419,15 @@ public abstract class ObjectInserter implements AutoCloseable {
* The flush may take some period of time to make the objects available to
* other threads.
*
- * @throws IOException
+ * @throws java.io.IOException
* the flush could not be completed; objects inserted thus far
* are in an indeterminate state.
*/
public abstract void flush() throws IOException;
/**
+ * {@inheritDoc}
+ * <p>
* Release any resources used by this inserter.
* <p>
* An inserter that has been released can be used again, but may need to be