]> source.dussan.org Git - jgit.git/commit
Deprecate BitmapBuilder.add and introduce simpler addObject method 25/59625/5
authorJonathan Nieder <jrn@google.com>
Wed, 4 Nov 2015 02:54:25 +0000 (18:54 -0800)
committerJonathan Nieder <jrn@google.com>
Thu, 5 Nov 2015 20:29:27 +0000 (12:29 -0800)
commitf523f21e599f47a09dacb9bd93b2c9f979faeb61
tree6bc676e304d4c0752310731f9c6a85433ccaebe3
parent424aa22b56eb4559879c8439fcff9445fb8237da
Deprecate BitmapBuilder.add and introduce simpler addObject method

The BitmapIndex.BitmapBuilder.add API is subtle:

/**
 * Adds the id and the existing bitmap for the id, if one
 * exists, to the bitmap.
 *
 * @return true if the value was not contained or able to be
 * loaded.
 */
boolean add(AnyObjectId objectId, int type);

Reading the name of the method does not make it obvious what it will
do.  Does it add the named object to the bitmap, or all objects
reachable from it?  It depends on whether the BitmapIndex owns an
existing bitmap for that object.  I did not notice this subtlety when
skimming the javadoc, either.  This resulted in enough confusion to
subtly break the bitmap building code (see change
I30844134bfde0cbabdfaab884c84b9809dd8bdb8 for details).

So discourage use of the add() API by deprecating it.

To replace it, provide a addObject() method that adds a single object.
This way, callers can decide whether to use addObject() or or() based
on the context.

For example,

if (bitmap.add(c, OBJ_COMMIT)) {
for (RevCommit p : c.getParents()) {
rememberToAlsoHandle(p);
}
}

can be replaced with

if (bitmap.contains(c)) {
// already included
} else if (index.getBitmap(c) != null) {
bitmap.or(index.getBitmap(c));
} else {
bitmap.addObject(c, OBJ_COMMIT);
for (RevCommit p : c.getParents()) {
rememberToAlsoHandle(p);
}
}

which is more verbose but makes it clearer that the behavior
depends on the content of index.getBitmaps().

Change-Id: Ib745645f187e1b1483f8587e99501dfcb7b867a5
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/BitmapIndexImpl.java
org.eclipse.jgit/src/org/eclipse/jgit/lib/BitmapIndex.java