Browse Source
The new selection implementation uses a public API on the ObjectReader, allowing the storage library to enumerate its candidates and select the best one for this packer without needing to build a temporary list of the candidates first. Change-Id: Ie01496434f7d3581d6d3bbb9e33c8f9fa649b6cd Signed-off-by: Shawn O. Pearce <spearce@spearce.org>stable-0.9
Shawn O. Pearce
15 years ago
11 changed files with 415 additions and 129 deletions
@ -0,0 +1,80 @@
|
||||
/* |
||||
* Copyright (C) 2010, Google Inc. |
||||
* and other copyright owners as documented in the project's IP log. |
||||
* |
||||
* 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
|
||||
* |
||||
* 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. |
||||
*/ |
||||
|
||||
package org.eclipse.jgit.lib; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
class LocalObjectRepresentation extends StoredObjectRepresentation { |
||||
final PackedObjectLoader ldr; |
||||
|
||||
LocalObjectRepresentation(PackedObjectLoader ldr) { |
||||
this.ldr = ldr; |
||||
} |
||||
|
||||
@Override |
||||
public int getFormat() { |
||||
if (ldr instanceof DeltaPackedObjectLoader) |
||||
return PACK_DELTA; |
||||
if (ldr instanceof WholePackedObjectLoader) |
||||
return PACK_WHOLE; |
||||
return FORMAT_OTHER; |
||||
} |
||||
|
||||
@Override |
||||
public int getWeight() { |
||||
long sz = ldr.getRawSize(); |
||||
if (Integer.MAX_VALUE < sz) |
||||
return WEIGHT_UNKNOWN; |
||||
return (int) sz; |
||||
} |
||||
|
||||
@Override |
||||
public ObjectId getDeltaBase() { |
||||
try { |
||||
return ldr.getDeltaBase(); |
||||
} catch (IOException e) { |
||||
return null; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,98 @@
|
||||
/* |
||||
* Copyright (C) 2010, Google Inc. |
||||
* and other copyright owners as documented in the project's IP log. |
||||
* |
||||
* 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
|
||||
* |
||||
* 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. |
||||
*/ |
||||
|
||||
package org.eclipse.jgit.lib; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
import org.eclipse.jgit.errors.MissingObjectException; |
||||
import org.eclipse.jgit.revwalk.RevObject; |
||||
|
||||
/** |
||||
* Extension of {@link ObjectReader} that supports reusing objects in packs. |
||||
* <p> |
||||
* {@code ObjectReader} implementations may also optionally implement this |
||||
* interface to support {@link PackWriter} with a means of copying an object |
||||
* that is already in pack encoding format directly into the output stream, |
||||
* without incurring decompression and recompression overheads. |
||||
*/ |
||||
public interface ObjectReuseAsIs { |
||||
/** |
||||
* Allocate a new {@code PackWriter} state structure for an object. |
||||
* <p> |
||||
* {@link PackWriter} allocates these objects to keep track of the |
||||
* per-object state, and how to load the objects efficiently into the |
||||
* generated stream. Implementers may subclass this type with additional |
||||
* object state, such as to remember what file and offset contains the |
||||
* object's pack encoded data. |
||||
* |
||||
* @param obj |
||||
* identity of the object that will be packed. The object's |
||||
* parsed status is undefined here. Implementers must not rely on |
||||
* the object being parsed. |
||||
* @return a new instance for this object. |
||||
*/ |
||||
public ObjectToPack newObjectToPack(RevObject obj); |
||||
|
||||
/** |
||||
* Select the best object representation for a packer. |
||||
* <p> |
||||
* Implementations should iterate through all available representations of |
||||
* an object, and pass them in turn to the PackWriter though |
||||
* {@link PackWriter#select(ObjectToPack, StoredObjectRepresentation)} so |
||||
* the writer can select the most suitable representation to reuse into the |
||||
* output stream. |
||||
* |
||||
* @param packer |
||||
* the packer that will write the object in the near future. |
||||
* @param otp |
||||
* the object to pack. |
||||
* @throws MissingObjectException |
||||
* there is no representation available for the object, as it is |
||||
* no longer in the repository. Packing will abort. |
||||
* @throws IOException |
||||
* the repository cannot be accessed. Packing will abort. |
||||
*/ |
||||
public void selectObjectRepresentation(PackWriter packer, ObjectToPack otp) |
||||
throws IOException, MissingObjectException; |
||||
} |
@ -0,0 +1,88 @@
|
||||
/* |
||||
* Copyright (C) 2010, Google Inc. |
||||
* and other copyright owners as documented in the project's IP log. |
||||
* |
||||
* 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
|
||||
* |
||||
* 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. |
||||
*/ |
||||
|
||||
package org.eclipse.jgit.lib; |
||||
|
||||
/** |
||||
* An object representation {@link PackWriter} can consider for packing. |
||||
*/ |
||||
public class StoredObjectRepresentation { |
||||
/** Special unknown value for {@link #getWeight()}. */ |
||||
public static final int WEIGHT_UNKNOWN = Integer.MAX_VALUE; |
||||
|
||||
/** Stored in pack format, as a delta to another object. */ |
||||
public static final int PACK_DELTA = 0; |
||||
|
||||
/** Stored in pack format, without delta. */ |
||||
public static final int PACK_WHOLE = 1; |
||||
|
||||
/** Only available after inflating to canonical format. */ |
||||
public static final int FORMAT_OTHER = 2; |
||||
|
||||
/** |
||||
* @return relative size of this object's packed form. The special value |
||||
* {@link #WEIGHT_UNKNOWN} can be returned to indicate the |
||||
* implementation doesn't know, or cannot supply the weight up |
||||
* front. |
||||
*/ |
||||
public int getWeight() { |
||||
return WEIGHT_UNKNOWN; |
||||
} |
||||
|
||||
/** |
||||
* @return true if this is a delta against another object and this is stored |
||||
* in pack delta format. |
||||
*/ |
||||
public int getFormat() { |
||||
return FORMAT_OTHER; |
||||
} |
||||
|
||||
/** |
||||
* @return identity of the object this delta applies to in order to recover |
||||
* the original object content. This method should only be called if |
||||
* {@link #getFormat()} returned {@link #PACK_DELTA}. |
||||
*/ |
||||
public ObjectId getDeltaBase() { |
||||
return null; |
||||
} |
||||
} |
Loading…
Reference in new issue