From d77b62736110abe176200514db897f35a1369951 Mon Sep 17 00:00:00 2001 From: Marek Zawirski Date: Sat, 28 Jun 2008 00:06:34 +0200 Subject: [PATCH] Add ignoreMissingUninteresting option to PackWriter This option is useful when caller cares only about locally existing uninteresting objects. Test cases created. Signed-off-by: Marek Zawirski Signed-off-by: Robin Rosenberg --- .../tst/org/spearce/jgit/lib/PackWriterTest.java | 45 +++++++++++++++++++--- .../src/org/spearce/jgit/lib/PackWriter.java | 37 ++++++++++++------ 2 files changed, 65 insertions(+), 17 deletions(-) diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/PackWriterTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/PackWriterTest.java index f663faff..3f07a57d 100644 --- a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/PackWriterTest.java +++ b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/PackWriterTest.java @@ -120,7 +120,7 @@ public class PackWriterTest extends RepositoryTestCase { * @throws IOException */ public void testWriteEmptyPack1() throws IOException { - createVerifyOpenPack(EMPTY_LIST_OBJECT, EMPTY_LIST_OBJECT, false); + createVerifyOpenPack(EMPTY_LIST_OBJECT, EMPTY_LIST_OBJECT, false, false); assertEquals(0, writer.getObjectsNumber()); assertEquals(0, pack.getObjectCount()); @@ -142,6 +142,37 @@ public class PackWriterTest extends RepositoryTestCase { } /** + * Try to pass non-existing object as uninteresting, with non-ignoring + * setting. + * + * @throws IOException + */ + public void testNotIgnoreNonExistingObjects() throws IOException { + final ObjectId nonExisting = ObjectId + .fromString("0000000000000000000000000000000000000001"); + try { + createVerifyOpenPack(EMPTY_LIST_OBJECT, Collections.nCopies(1, + nonExisting), false, false); + fail("Should have thrown MissingObjectException"); + } catch (MissingObjectException x) { + // expected + } + } + + /** + * Try to pass non-existing object as uninteresting, with ignoring setting. + * + * @throws IOException + */ + public void testIgnoreNonExistingObjects() throws IOException { + final ObjectId nonExisting = ObjectId + .fromString("0000000000000000000000000000000000000001"); + createVerifyOpenPack(EMPTY_LIST_OBJECT, Collections.nCopies(1, + nonExisting), false, true); + // shouldn't throw anything + } + + /** * Create pack basing on only interesting objects, then precisely verify * content. No delta reuse here. * @@ -326,7 +357,7 @@ public class PackWriterTest extends RepositoryTestCase { final LinkedList interestings = new LinkedList(); interestings.add(ObjectId .fromString("82c6b885ff600be425b4ea96dee75dca255b69e7")); - createVerifyOpenPack(interestings, EMPTY_LIST_OBJECT, false); + createVerifyOpenPack(interestings, EMPTY_LIST_OBJECT, false, false); final ObjectId expectedOrder[] = new ObjectId[] { ObjectId.fromString("82c6b885ff600be425b4ea96dee75dca255b69e7"), @@ -352,7 +383,7 @@ public class PackWriterTest extends RepositoryTestCase { final LinkedList uninterestings = new LinkedList(); uninterestings.add(ObjectId .fromString("540a36d136cf413e4b064c2b0e0a4db60f77feab")); - createVerifyOpenPack(interestings, uninterestings, false); + createVerifyOpenPack(interestings, uninterestings, false, false); final ObjectId expectedOrder[] = new ObjectId[] { ObjectId.fromString("82c6b885ff600be425b4ea96dee75dca255b69e7"), @@ -380,7 +411,7 @@ public class PackWriterTest extends RepositoryTestCase { final LinkedList uninterestings = new LinkedList(); uninterestings.add(ObjectId .fromString("c59759f143fb1fe21c197981df75a7ee00290799")); - createVerifyOpenPack(interestings, uninterestings, thin); + createVerifyOpenPack(interestings, uninterestings, thin, false); final ObjectId writtenObjects[] = new ObjectId[] { ObjectId.fromString("82c6b885ff600be425b4ea96dee75dca255b69e7"), @@ -404,9 +435,11 @@ public class PackWriterTest extends RepositoryTestCase { } private void createVerifyOpenPack(final Collection interestings, - final Collection uninterestings, final boolean thin) + final Collection uninterestings, final boolean thin, + final boolean ignoreMissingUninteresting) throws MissingObjectException, IOException { - writer.writePack(interestings, uninterestings, thin); + writer.writePack(interestings, uninterestings, thin, + ignoreMissingUninteresting); verifyOpenPack(thin); } diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/PackWriter.java b/org.spearce.jgit/src/org/spearce/jgit/lib/PackWriter.java index 9e1f2b3b..cec2ab09 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/lib/PackWriter.java +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/PackWriter.java @@ -77,7 +77,7 @@ import org.spearce.jgit.util.NB; * Typical usage consists of creating instance intended for some pack, * configuring options through accessors methods and finally call * {@link #writePack(Iterator)} or - * {@link #writePack(Collection, Collection, boolean)} with objects + * {@link #writePack(Collection, Collection, boolean, boolean)} with objects * specification, to generate a pack stream. *

*

@@ -98,7 +98,7 @@ public class PackWriter { * Title of {@link ProgressMonitor} task used during counting objects to * pack. * - * @see #writePack(Collection, Collection, boolean) + * @see #writePack(Collection, Collection, boolean, boolean) */ public static final String COUNTING_OBJECTS_PROGRESS = "Counting objects to pack"; @@ -107,7 +107,7 @@ public class PackWriter { * reuse or delta reuse. * * @see #writePack(Iterator) - * @see #writePack(Collection, Collection, boolean) + * @see #writePack(Collection, Collection, boolean, boolean) */ public static final String SEARCHING_REUSE_PROGRESS = "Searching for delta and object reuse"; @@ -116,7 +116,7 @@ public class PackWriter { * (objects) * * @see #writePack(Iterator) - * @see #writePack(Collection, Collection, boolean) + * @see #writePack(Collection, Collection, boolean, boolean) */ public static final String WRITING_OBJECTS_PROGRESS = "Writing objects"; @@ -193,7 +193,7 @@ public class PackWriter { * Create writer for specified repository, that will write a pack to * provided output stream. Objects for packing are specified in * {@link #writePack(Iterator)} or - * {@link #writePack(Collection, Collection, boolean)}. + * {@link #writePack(Collection, Collection, boolean, boolean)}. * * @param repo * repository where objects are stored. @@ -203,7 +203,7 @@ public class PackWriter { * @param monitor * operations progress monitor, used within * {@link #writePack(Iterator)} or - * {@link #writePack(Collection, Collection, boolean)}. + * {@link #writePack(Collection, Collection, boolean, boolean)}. */ public PackWriter(final Repository repo, final OutputStream out, final ProgressMonitor monitor) { @@ -233,7 +233,8 @@ public class PackWriter { * writer will search for delta representation of object in repository and * use it if possible. Normally, only deltas with base to another object * existing in set of objects to pack will be used. Exception is however - * thin-pack (see {@link #writePack(Collection, Collection, boolean)} and + * thin-pack (see + * {@link #writePack(Collection, Collection, boolean, boolean)} and * {@link #writePack(Iterator)}) where base object must exist on other side * machine. *

@@ -442,15 +443,21 @@ public class PackWriter { * belonging to party repository (uninteresting/boundary) as * determined by set; this kind of pack is used only for * transport; true - to produce thin pack, false - otherwise. + * @param ignoreMissingUninteresting + * true if writer should ignore non existing uninteresting + * objects during construction set of objects to pack; false + * otherwise - non existing uninteresting objects may cause + * {@link MissingObjectException} * @throws IOException * when some I/O problem occur during reading objects for pack * or writing pack stream. */ public void writePack(final Collection interestingObjects, - final Collection uninterestingObjects, boolean thin) + final Collection uninterestingObjects, + final boolean thin, final boolean ignoreMissingUninteresting) throws IOException { ObjectWalk walker = setUpWalker(interestingObjects, - uninterestingObjects, thin); + uninterestingObjects, thin, ignoreMissingUninteresting); findObjectsToPack(walker); writePackInternal(); } @@ -682,7 +689,8 @@ public class PackWriter { private ObjectWalk setUpWalker( final Collection interestingObjects, - final Collection uninterestingObjects, boolean thin) + final Collection uninterestingObjects, + final boolean thin, final boolean ignoreMissingUninteresting) throws MissingObjectException, IOException, IncorrectObjectTypeException { final ObjectWalk walker = new ObjectWalk(db); @@ -696,7 +704,14 @@ public class PackWriter { walker.markStart(o); } for (ObjectId id : uninterestingObjects) { - RevObject o = walker.parseAny(id); + final RevObject o; + try { + o = walker.parseAny(id); + } catch (MissingObjectException x) { + if (ignoreMissingUninteresting) + continue; + throw x; + } walker.markUninteresting(o); } return walker; -- 2.11.4.GIT