diff options
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.java | 141 |
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 |